缓冲区溢出漏洞利用期间的编码问题
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
, ...)
我在 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
, ...)