Lab2.3 Buffer Overflow Vulnerability
1、Disable Address Space Randomization.

2、Create Vulnerable Program
为了方便,使用ftp直接将stack.c上传到虚拟机上。使用cat命令检查文件。

3、 Compile the Vulnerable Program and make it set-root-uid.
由于ubuntu没有root账户,首先创建root账户
接着按照要求进行编译(使用编译选项允许栈运行并且关闭Stack Guard的安全机制)
为了方便,我们加上-m32的编译选项,编译出32位的可执行文件。

4、Complete the vulnerability code.
4-1 使用gdb对stack进行反汇编调试:
disass bof得到
bof函数的反汇编结果。根据c语言的堆栈传递参数模式,我们知道0x8048485处可以得到函数的返回地址。故在0x8048485处设置断点1。调用strcpy函数前面有两个赋值语句,根据c语言函数调用过程可知,第二个赋值是buffer的地址。故在0x08048494设置断点二。获取返回的地址
程序运行到断点1
此时
esp寄存器内的值 = 返回地址 - 4 . 这个4是push进来的ebp使用
i r指令查看,可以知道结果为0xffffd4a8 + 4 = 0xffffd4ab即返回地址为
0xffffd4ab获取
buffer的地址程序运行到断点2
此时
eax寄存器内的值即为buffer的地址可以看到结果为
0xffffd494计算偏移地址数目
0xffffd4ab-0xffffd494=0x18=24因此我们应当将需要跳转的地址放在
buffer+24处

4-2 完善 exploit.c
将
shellcode放到badfile文件后0x100处。则所需跳转的地址为&buffer + 0x100char addr[4] = { 0x94 , 0xd5 , 0xff , 0xff }; //小端规则 实际地址 0xffffd494 + 0x100 // 0xffffd594 memcpy(buffer+24,addr,4); memcpy(buffer+0x100,code,50);
5、Results
编译运行 exploit 和 stack. 成功进入shell。如下图
6、感悟
本次实验最开始使用64位,但是不太清楚64位的汇编语法,故后使用32位完成了实验
gcc反汇编的mov语句和vc不太相同,需要注意
禁止动态分配内存每次重启都需要设置。