旧书重温: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 、溢出
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修改)