-
20192408胡益琳 实验一 逆向破解与BOF实验报告
1.实验内容
- 实验对象pwn1中包含三个部分,分别为main(主函数)foo函数和getshell
- 直接修改main函数中的机器指令,使main函数跳转到getshell所在地址执行
- 在调用foo函数时输入攻击字符串,覆盖返回地址,使程序跳转到getshell执行
- 注入shellcode并执行,原理同2,输入内容覆盖函数的返回地址,使程序跳转到注入的shellcode并执行
2.实验过程
2.1 直接修改机器指令,改变程序执行流程
- (1)下载文件pwn1并修改文件名,用objdump -d指令进行反汇编,重点关注三个函数的地址
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326165707307-1143519486.png)
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326165729364-626900759.png)
同时可以看到main函数中的call 8048491 命令跳转到foo函数
根据汇编语言的知识,e8表示跳转,而此时EIP的值应为main函数中下一条指令的地址,即80484ba,加上ffffffd7即为foo函数首地址。
由此可知,若我们要想使main函数跳转到getshell,则需将e8后的d7ffffff改为与80484ba相加得到getshell地址(804847d)的数。
经过计算,47d-4ba得到补码为ffffffc3,即接下去要做的是把main函数中的e8d7ffffff改为e8c3ffffff
- (2) 修改可执行文件,如图所示,其中:%!xdd命令用于切换显示模式为十六进制,存盘退出即可。
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326165749651-1199918592.png)
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326165803210-452008806.png)
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326165817220-1709890010.png)
- (3)再次利用objdump -d指令进行反汇编查看修改结果,运行成功
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326165927637-1653500492.png)
2.2 输入参数造成BOF攻击,改变程序执行
- (1)用objdump -d指令进行反汇编,了解程序的功能
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326165943803-1649039641.png)
如图可以看出foo函数中分配给输入字符的空间为0x1c,即28个字节,若输入字符大于这个数则可能会覆盖EBP、EIP,影响程序的正常执行。EBP所占大小为4个字节,即第33个字节会覆盖到EIP的位置。
- (2)由此我们进行试验,可以看到0x35353535(即5555的ASCII码)覆盖了EIP的部分,我们只要将55555555的位置换成我们想要执行部分的地址即可以实现BOF攻击
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326170000032-833275786.png)
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326170011287-913582109.png)
以下将55555555换成12345678覆盖EIP,来确定字节序。由于getshell的地址为804847d,输入应为11111111222222223333333344444444\x7d\x84\x04\x08
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326170027104-1675871059.png)
- (3)由于\x7d\x84\x04\x08无法由键盘输入,所以使用perl生成字符串放到input文件中,再用管道符|将文件input的内容输入pwn20192408.1,实验成功
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326170045573-226136125.png)
2.3 注入Shellcode并执行
- (1)修改设置。用execstack -s pwn20192408.3设置堆栈可执行。用echo "0" > /proc/sys/kernel/randomize_va_space 命令关闭地址随机化,使得攻击能够顺利进行。
- (2)构造攻击buf,先用\x4\x3\x2\x1代替覆盖返回地址位置的命令,然后通过gdb调试确定应填入的地址。
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326170059375-998576485.png)
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326170111024-290760140.png)
- 由于nops+shellcode+retaddr的结构攻击失败,所以采用retaddr+nops+shellcode的结构,即执行的shellcode代码放在缓冲区之后。如图可以计算出\x4\x3\x2\x1所在的位置,即ret所在的位置为0xffffd4ec,由于shellcode放在ret后面,所以shellcode的首地址应为0xffffd4f0,将0xffffd4f0填入\x4\x3\x2\x1所在的位置即可。
- 如图显示成功
![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326170135140-525031070.png)
3.问题及解决方案
- 问题1:安装gdb过程(方案:在终端中用wget命令下载并解压、编译、安装)中执行到make时报1924错误
- 问题1解决方案:直接使用apt-get install gdb指令安装。
- 问题2:在设置堆栈可执行时输入execstack -s pwn20192408.3时报错execstack: Command not found
- 问题2解决方案:使用命令sudo apt-get install prelink。
- 问题3:在使用命令sudo apt-get install prelink解决问题2时报错如下:Unable to locate package
- 问题3解决方案:打开sources.list文件并添加源,用apt-get update命令更新源后再下载 prelink。
- 问题4:在进行实验三时采用nops+shellcode+retaddr的结构造成攻击失败。
- 问题4解决方案:通过gdb单步执行调试发现错误原因是执行shellcode过程中的某一步用到push指令,由于当前栈顶与shellcode相邻,push后将shellcode指令覆盖,导致实验失败。所以改为采用retaddr+nops+shellcode的方式进行实验。
4.学习感悟与思考
- 在本次实验中对于Linux基本命令与堆栈的结构有了更深的理解的掌握。学到了使用输出重定向用于将Perl语言生成的字符串写入文件,再将文件通过管道符|输入程序的方法,可以将键盘无法输入的值输入程序中。
- 对于实验三最后一步的输入,即
perl -e 'print "A" x 32;print "\x20\xd3\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
一开始有疑问为什么代码最后仍为x00\xd3\xff\xff,删去是否有影响,后经查验资料得知x90为nop即空指令操作,经试验证明删去对实验结果无影响。![](https://img2022.cnblogs.com/blog/1818743/202203/1818743-20220326170202805-91291777.png)
- 对于Linux指令的了解与掌握还有所欠缺,要在以后的学习与实践中多加练习。
-
相关阅读:
数据库简介
计算机网络OSI七层协议
信息论知识点(绪论)
Wireshark抓取HTTP数据包
配置FileZilla FTP服务器
Redis集群搭建的几种方式
Redis单个分片高可用&哨兵集群
Redis哈希一致性&对应API操作
MapReduce实现好友推荐
window下使用IDEA远程调试伪分布式hadoop集群
-
原文地址:https://www.cnblogs.com/HuYiL/p/16059891.html
Copyright © 2020-2023
润新知