安全编程原理-LAB3-overflow

Lab2.3 Buffer Overflow Vulnerability

1、Disable Address Space Randomization.

image-20200615104901938

2、Create Vulnerable Program

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

image-20200615153013635

3、 Compile the Vulnerable Program and make it set-root-uid.

由于ubuntu没有root账户,首先创建root账户

接着按照要求进行编译(使用编译选项允许栈运行并且关闭Stack Guard的安全机制)

为了方便,我们加上-m32的编译选项,编译出32位的可执行文件。

image-20200617153532545

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

image-20200617153713379

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不太相同,需要注意

  • 禁止动态分配内存每次重启都需要设置。