缓冲区溢出漏洞利用期间的编码问题

Problems with encoding during buffer overflow exploit

我在 Ubuntu Linux 16.04/Intel 并关闭了 ASLR。

下面的程序被利用了。

#include <stdio.h>
#include <string.h>

void func(char *name)
{
    char buf[100];
    strcpy(buf, name);
    printf("Welcome %s\n", buf);
}

int main(int argc, char *argv[])
{
   func(argv[1]);
   return 0;
}

它是用.

构建的
$ gcc buf.c -o buf -fno-stack-protector -mpreferred-stack-boundary=2

当使用如下所示的 7 位字符 (?) 时,我可以成功溢出缓冲区并覆盖 return 地址。

gdb-peda$ run $(python3 -c 'print("\x41" * 108)')

但是,当我尝试插入一个 8 位字符 (?) 时,它无法正常工作。

gdb-peda$ run $(python3 -c 'print("\xc0" * 108)')

路上好像有某种UTF-8编码,所以\xc0变成了\xc3\x80

我试过了运行

gdb-peda$ run $(python3 -c 'print(("\xc0".encode("latin1") * 108))')

这搞砸了。无论如何,return 地址没有被成功覆盖。

卡住,任何指点将不胜感激。

这是因为 Python 默认情况下在写入字节之前通过 sys.stdout.encoding 对字符串进行编码。可以直接写字节到sys.stdout.buffer,避免编码:

run $(python3 -c '__import__("sys").stdout.buffer.write(b"\xc0" * 108)')

当您执行 print("\xc0".encode("latin1") * 108)(相当于 print(b"\xc0" * 108))时发生的事情是它正在打印 b'\xc0\xc0...\xc0\xc0'(文字字节 b'\, x, ... 或 0x62, 0x27, 0x5C, 0x78, ...)