C缓冲区溢出攻击

标签 c assembly x86 buffer buffer-overflow

我的 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/

相关文章:

linux - 了解操作系统引导加载 - 程序集

c - AMD64——nopw 汇编指令?

x86 - ELF 文件类型 - ET_EXEC 和 ET_DYN

c - 避免私有(private)函数的原型(prototype)声明(在使用前定义)是否违反 MISRA?

c - 将此处文档与 execvp 一起使用

c - qemu 中的启动参数

在linux中从C代码调用汇编函数

c - 我们必须在哪里只使用寄存器变量?

linux - 如何在 64 位机器上使用 gcc 编译 32 位 .o 文件?

c - x86 过程调用内存分配