C缓冲区溢出攻击

C Buffer Overflow Attack

我的 CS 课程中有一个以缓冲区溢出攻击为中心的项目。

我很难完全理解这个主题。

假设我有以下功能:

08048cc5 <getbuf>:
 8048cc5:   55                      push   %ebp
 8048cc6:   89 e5                   mov    %esp,%ebp
 8048cc8:   83 ec 38                sub    [=10=]x38,%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    [=10=]x1,%eax
 8048cdb:   c9                      leave
 8048cdc:   c3                      ret

目前return这个函数:

08048c53 <test>:
 8048c53:   55                      push   %ebp
 8048c54:   89 e5                   mov    %esp,%ebp
 8048c56:   83 ec 28                sub    [=11=]x28,%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   [=11=]x804a3f0,(%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   [=11=]x804a419,(%esp)
 8048c9d:   e8 ae fb ff ff          call   8048850 <printf@plt>
 8048ca2:   c7 04 24 03 00 00 00    movl   [=11=]x3,(%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   [=11=]x804a436,(%esp)
 8048cbe:   e8 8d fb ff ff          call   8048850 <printf@plt>
 8048cc3:   c9                      leave
 8048cc4:   c3                      ret

而不是 return 测试 () 我想引起缓冲区溢出,导致 getbuf() return 到以下函数:

08048b7d <smoke>:
 8048b7d:   55                      push   %ebp
 8048b7e:   89 e5                   mov    %esp,%ebp
 8048b80:   83 ec 18                sub    [=12=]x18,%esp
 8048b83:   c7 04 24 50 a3 04 08    movl   [=12=]x804a350,(%esp)
 8048b8a:   e8 91 fd ff ff          call   8048920 <puts@plt>
 8048b8f:   c7 04 24 00 00 00 00    movl   [=12=]x0,(%esp)
 8048b96:   e8 b3 08 00 00          call   804944e <validate>
 8048b9b:   c7 04 24 00 00 00 00    movl   [=12=]x0,(%esp)
 8048ba2:   e8 99 fd ff ff          call   8048940 <exit@plt>

所以我们有另一个名为 HEX2RAW 的程序,它将 HEX 值转换为我们将输入到程序(和缓冲区)中的原始字符串。

这是否意味着 HEX 值需要包含 ret 指令和 smoke() 的地址?或者只是 return 地址?

我如何知道将要溢出的缓冲区大小?我怎么知道我需要溢出多远才能到达堆栈上的 return 指令?

你可以看到我对这个话题的想法有些混乱,所以任何澄清都很棒!

可以看到传给gets的地址是-0x28(%ebp)。由于 return 地址位于 4(%ebp),因此您需要输入 44 字节的填充,然后输入所需的地址。 ret 指令当然不应该输入,因为它不会进入堆栈并且已经在代码中。这就是弹出被覆盖的 return 地址的内容。