旧书重温:0day2【1】 简单的缓冲区溢出案例

0x01 准备:

VMwarePlayer

(我是在360软件管家那搜到的下载的)

 

xp sp2 http://user.qzone.qq.com/252738331/blog/1357138598

(这是我的QQ空间文章,平时收藏的一些windows老版系统,用来做实验用的)

 

vc++6.0绿色完整版 网上自己下巴(30M左右)

 

ollydby (OllyDBG_1.10_second_cao_cong看雪上下的

 

winhex (网上有很多的)

 

知识点:

CPU(Intel,x86)各主要寄存器的一般用途:

EAX:存储器:用于执行计算,并用于存储函数的返回值。基本操作,如加,减,比较使用

这个通用寄存器

EBX:存储数据

ECX:计数器:常用于计数循环的次数。

EDX:数据

ESP:栈顶指针

EBP:基指针(常用来表示一个函数帧的底部)

ESI:源操作数指针

EDI:目的地址指针

EIP:指令指针

 

安装好VM、做好虚拟机(xp sp2)、虚拟机里安好vc++6.0 , ollydby winhex ....

0x02 生成带缓冲区溢出漏洞的程序

 

 1 include <stdio.h>

 2 #include <windows.h>

 3 #define PASSWORD "1234567"

 4 

 5 int verify(char * passwd)

 6 {

 7     int iRet;

 8     char buffer[8];

 9     iRet = strcmp(passwd,PASSWORD);

10     strcpy(buffer,passwd);

11     return iRet;

12 

13 }

14 

15 int main()

16 {

17 

18     int flag = 0;

19     char passwd[1024];

20     FILE * fp;

21     LoadLibrary("user32.dll");

22     //MessageBox(NULL,"dd","xx",1);

23     if(!(fp=fopen("password2.txt","rw+")))

24     {

25         printf("fp fopen flaid \n");

26         int e = GetLastError();

27         exit(0);

28     }

29     fscanf(fp,"%s",passwd);

30     flag = verify(passwd);

31     if(flag)

32     {

33         printf("incorrect password \n");

34     }

35     else

36     {

37         printf("correct password \n");

38     }

39     fclose(fp);

40     return 0;

41     

42 }

以上参考0day2

0x03触发 溢出 

把debug目录下password2.txt,内容输入abcdefjh.....xyz 保存、运行生成的exe 、溢出

旧书重温:0day2【1】 简单的缓冲区溢出案例

offset:74737371   tsrq 控制eip 

0x04 分析

设置ollydby为默认实时调试器

运行exe ollydby断下

仔细观察发现  tsrq 处 控制了eip , esp指向 uvwxyz 

所以可以用 jmp esp 策略 使用 lion万能 jmp esp 0x7ffa4512 反向填充tsrq处,

0x 9083EC4033DB536877657374686661696C8BC453505053B81661D677FFD0 为shellcode 填充uvwxyz....

(其中我的xp sp2 上的 messageboxw的地址1661D677,因为我的messageboxA 的地址含0较多截断了字符串所以用了W的)

自己根据情况修改红处( 以上修改文件都是用winhex修改)

旧书重温:0day2【1】 简单的缓冲区溢出案例

 

 

你可能感兴趣的:(案例)