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 + 0x100
char 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不太相同,需要注意
禁止动态分配内存每次重启都需要设置。