1.实验内容
(1)手动修改可执行文件,把地址修改成getshell地址从而实现改变程序执行流程,直接跳转到getShell函数。
(2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
(3)注入一个自己制作的shellcode并运行这段shellcode。
2.实验过程
(1)手动修改可执行文件
对pwn文件进行反汇编
main函数调用foo,对应机器指令为“ e8 d7ffffff”,
如果想变为直接调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。
用Windows计算器,直接 47d-4ba就能得到补码,是c3ffffff。
因此我们可以修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff
再反汇编看一下,发现call指令已经在在调用getShell。
(2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
进入gdb进行调试,当输入1111111122222222333333334444444412345678时,eip的值为0x34333231。1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn20192407,pwn20192407就会运行getShell。
构造输入字符串11111111222222223333333344444444\x7d\x84\x04\x08后,然后将input的输入,通过管道符“|”,作为pwn20192407的输入.
(3)注入一个自己制作的shellcode并运行这段shellcode。
切换root用户关闭地址随机化
通过gdb得到shellcode的运行起始地址。通过进程号查出我们运行./pwn20192407为1603。进入foo函数在结束位置设置断点。
随后找到设置的断点并设为shellcode运行的起始地址。将shellcode的返回地址改位空指令的地址
接着使用perl语言在缓存区填满数据,在eip后面为shellcode代码
3.问题及解决方案
- 问题1:截图的快捷键会触发kali里面的插入
- 问题1解决方案:ctrl+alt即可恢复使用计算机功能
- 问题2:修改d7为c3方法不太清楚
- 问题2解决方案:直接按i即可
- 问题3:gdb在虚拟机上无法通过指令安装,且通过换元方法安装时提示不能解释域名
- 问题3解决方案:换了同学的电脑继续完成实验。
4.学习感悟、思考等
通过本次实验,我学会了三种缓冲区溢出的攻击方法和许多汇编语言的指令,遗憾的是由于某些问题在本人电脑上无法顺利安装gdb,和同学讨论后也未解决此问题,遂用同学电脑继续完成了本次实验。本次实验我也重点学习到了shellcode部分的结构。希望在后续的课程中能对网络攻防的知识有进一步的了解。