我得到了一个分配程序,并被告知要对其进行缓冲区溢出。我的教授已经配置了我们正在开发的VM在堆栈上执行shellcode,所以我只需要将shellcode的开头放入返回地址。我试图溢出的缓冲区是s1[64]
. s1
应该是一个有效的文件名,因为它稍后会在程序中使用,并且exit(1)
如果它无效将导致程序。我假设我应该s1
以这种格式填写输入:
validFileName+fileNameTerminator+Filler+Shellcode
。
S1
使用 . 从命令行读入scanf(%s,s1)
。我遇到的问题是,无论我选择在有效文件名与填充符和 shellcode 的开头之间放置什么,程序都会认为整个输入是文件名并且无法打开它。我尝试过使用短文件名和 63 和 64 长度的文件名,都给出了相同的结果。例如:如果我s1
按照/./././././././././././././././././././././././testFile1GCL.txt\0AAAAAAAA\xeb\x18\x5e\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c\xb0\x0b\x8d\x1e\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe3\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
我期望的值给出输入s1
,/./././././././././././././././././././././././testFile1GCL.txt
因为它足够长以填充整个缓冲区,并且后面是空终止符。问题是当我s1
打印出来时,它会打印整个输入,就好像它没有看到空终止符并且显然在其给定范围之外。这会导致程序出错,因为那个巨大的东西显然不是有效的文件名。
我已经尝试了几乎所有我能想到的放在文件名和我的有效载荷的其余部分之间的东西,包括\\0
\0
0x0
0x90
. 无论如何,程序总是认为s1
是整个长输入而失败。即使它不识别终止符,为什么它甚至在分配给的 64 个字符之外寻找s1
?
编辑:我现在尝试在文件名和有效负载的其余部分之间放置一个空格,以防止文件退出,但这只是因为 scanf 在该空间处停止并且没有读取有效负载的其余部分