旧书重温: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 
");
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 
");
34     }
35     else
36     {
37         printf("correct password 
");
38     }
39     fclose(fp);
40     return 0;
41     
42 }

以上参考0day2

0x03触发 溢出 

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

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修改)

原文地址:https://www.cnblogs.com/witty/p/3455439.html