[英]How should I delimit between the valid input and the shellcode for my buffer overflow?
给我一个分配任务的程序,并告诉我对其进行缓冲区溢出。 我的教授已经配置了我们正在研究的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
是整个长输入,并且失败。 即使不能识别终止符,为什么还要在分配给s1
的64个字符之外查找呢?
编辑:我现在尝试在文件名和有效负载的其余部分之间放置一个空格,以防止文件退出,但这仅是因为scanf停在了该空间,并且在其余有效负载中没有读取
尝试创建/tmp/{shellcode here}
类的文件。 即使您的FS不支持名称中包含来自所选shellcode的某些字节的文件,也可以尝试许多方法。
您也可以尝试将shellcode放在环境变量中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.