我的 CS 类(class)中有一个以缓冲区溢出攻击为中心的项目。
我很难完全理解这个主题。
假设我有以下功能:
08048cc5 <getbuf>:
8048cc5: 55 push %ebp
8048cc6: 89 e5 mov %esp,%ebp
8048cc8: 83 ec 38 sub $0x38,%esp
8048ccb: 8d 45 d8 lea -0x28(%ebp),%eax
8048cce: 89 04 24 mov %eax,(%esp)
8048cd1: e8 32 01 00 00 call 8048e08 <Gets>
8048cd6: b8 01 00 00 00 mov $0x1,%eax
8048cdb: c9 leave
8048cdc: c3 ret
目前返回这个函数:
08048c53 <test>:
8048c53: 55 push %ebp
8048c54: 89 e5 mov %esp,%ebp
8048c56: 83 ec 28 sub $0x28,%esp
8048c59: e8 63 04 00 00 call 80490c1 <uniqueval>
8048c5e: 89 45 f0 mov %eax,-0x10(%ebp)
8048c61: e8 5f 00 00 00 call 8048cc5 <getbuf>
8048c66: 89 45 f4 mov %eax,-0xc(%ebp)
8048c69: e8 53 04 00 00 call 80490c1 <uniqueval>
8048c6e: 8b 55 f0 mov -0x10(%ebp),%edx
8048c71: 39 d0 cmp %edx,%eax
8048c73: 74 0e je 8048c83 <test+0x30>
8048c75: c7 04 24 f0 a3 04 08 movl $0x804a3f0,(%esp)
8048c7c: e8 9f fc ff ff call 8048920 <puts@plt>
8048c81: eb 40 jmp 8048cc3 <test+0x70>
8048c83: 8b 55 f4 mov -0xc(%ebp),%edx
8048c86: a1 20 e1 04 08 mov 0x804e120,%eax
8048c8b: 39 c2 cmp %eax,%edx
8048c8d: 75 21 jne 8048cb0 <test+0x5d>
8048c8f: 8b 45 f4 mov -0xc(%ebp),%eax
8048c92: 89 44 24 04 mov %eax,0x4(%esp)
8048c96: c7 04 24 19 a4 04 08 movl $0x804a419,(%esp)
8048c9d: e8 ae fb ff ff call 8048850 <printf@plt>
8048ca2: c7 04 24 03 00 00 00 movl $0x3,(%esp)
8048ca9: e8 a0 07 00 00 call 804944e <validate>
8048cae: eb 13 jmp 8048cc3 <test+0x70>
8048cb0: 8b 45 f4 mov -0xc(%ebp),%eax
8048cb3: 89 44 24 04 mov %eax,0x4(%esp)
8048cb7: c7 04 24 36 a4 04 08 movl $0x804a436,(%esp)
8048cbe: e8 8d fb ff ff call 8048850 <printf@plt>
8048cc3: c9 leave
8048cc4: c3 ret
我不想返回 test(),而是想引起缓冲区溢出,从而导致 getbuf() 返回到以下函数:
08048b7d <smoke>:
8048b7d: 55 push %ebp
8048b7e: 89 e5 mov %esp,%ebp
8048b80: 83 ec 18 sub $0x18,%esp
8048b83: c7 04 24 50 a3 04 08 movl $0x804a350,(%esp)
8048b8a: e8 91 fd ff ff call 8048920 <puts@plt>
8048b8f: c7 04 24 00 00 00 00 movl $0x0,(%esp)
8048b96: e8 b3 08 00 00 call 804944e <validate>
8048b9b: c7 04 24 00 00 00 00 movl $0x0,(%esp)
8048ba2: e8 99 fd ff ff call 8048940 <exit@plt>
因此我们有另一个名为 HEX2RAW 的程序,它将 HEX 值转换为我们将输入到程序(和缓冲区)中的原始字符串。
这是否意味着 HEX 值需要包含 ret
指令和 smoke() 的地址?或者只是返回地址?
我如何知道我将要溢出的缓冲区的大小?我怎么知道我需要溢出多远才能到达堆栈上的返回指令?
你可以看到我的想法在这个话题上有些困惑,所以任何澄清都会很棒!
最佳答案
可以看到传递给gets
的地址是-0x28(%ebp)
。由于返回地址位于 4(%ebp)
,因此您需要输入 44
字节的填充,然后是所需的地址。 ret
指令当然不应该输入,因为它不会进入堆栈并且已经在代码中。这就是弹出被覆盖的返回地址的内容。
关于C缓冲区溢出攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33066677/