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.学习感想和体会

复习了之前学过的内容,对汇编和缓冲区溢出有了新的认识。

posted @ 2022-05-15 20:20  besti-ttyy  阅读(28)  评论(0编辑  收藏  举报