20212801 2021-2022-2 《网络攻防实践》第九次作业
1.实践要求
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
-
三个实践内容如下:
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
2.实践内容
①手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
对pwm1反汇编,导到txt文件里好找些
getshell
foo,这部好像还用不到
关键是主函数,调用foo函数了,给他改成调用getshell
直接打开pwm1
转换进制
找ffffffd7,大端存储
改
转
再次反编译,已经改了
做个对比
运行pwn2,获取shell
②利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
利用了foo函数没有对输入的字符做长短判断而导致的缓冲区溢出漏洞,和之前学过的strcpy漏洞差不多。
可见foo留有28位的空间,之后存在4位的缓冲区,之后就是ret返回地址,只需随便输入32位,之后四位为getshell的地址,即可覆盖掉原本的返回地址,由于不能直接输出十六进制字符,这里借助了perl将输入放在input文件里,
运行pwn1时第一个cat是为了传入输入值,第二个cat是为了保持运行状态。
③注入一个自己制作的shellcode并运行这段shellcode。
使用了从网上找的现成的shellcode \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\
堆栈为可执行状态、pwn1的堆栈为可执行状态、查看地址随机化的状态、关闭地址随机化安装gdb
查看进程号
采用的构造方法是retaddr+nop+shellcode,nop保证了攻击的成功率,只要返回的地址在nop的范围内,命令一定会滑倒shell code上,shellcode直接用网上的 \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\,为了取得retaddr的值先构造一个输入看看寄存器内的情况,
gdb在返回前设下断电,查看此时esp内的地址
x/16x 0xffffd50c后发现,shellcode在后面4位,此时只需将esp中的值增加4即可,0xfffffd50c+4 = 0xfffffd510
重新构造后成功
3.学习中遇到的问题及解决
多个指令安装不了,换源后解决。
4.学习感想和体会
复习了之前学过的内容,对汇编和缓冲区溢出有了新的认识。