1.1 实验目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
本次实验内容如下:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
2 操作过程
知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
学习目标:理解可执行文件与机器指令
进阶:掌握ELF文件格式,掌握动态技术
NOP: 空操作指令,它不执行任何操作,只占用一个字节的机器码。在x86架构中,机器码为 90。
JNE: 如果不相等则跳转指令,只在不等于条件下跳转。在x86架构中,机器码为 75 开头的字节。
JE: 如果相等则跳转指令,只在相等条件下跳转。在x86架构中,机器码为 74 开头的字节。
JMP: 无条件跳转指令,直接跳转到指定位置。在x86架构中,短跳转机器码为 EB 开头的字节,长跳转机器码以 E9 开头。
CMP: 比较指令,用于将一个寄存器的内容与另一个寄存器的内容或者内存的内容进行比较。在x86架构中,机器码为 39 系列的字节(比如 39 开头的表示 cmp ecx, value)。
首先按照操作获取pwn1文件,然后对其进行修改
修改后可以按照操作要求得到结果
接着按操作进行反汇编并按要求确定地址
执行bof攻击,首先按照要求调整相应权限和配置
查询对应端口号并连接,启动gdb对对应端口进行调试
连接后按照指令操作
最后执行成功
3.问题及其解决
问题一:在执行过程中有很多功能是缺失的,比如调试使用的gdb,execstack等,都是安装时不包含的。
解决方案:在csdn查找有关资料,按照步骤进行安装配置报错中显示的缺少的插件
问题二:在最后执行BOF攻击时,我反复试验了十几二十遍都没有成功,一直出现错误
解决方案:我试了几十次,然后找做完的同学求助,一起试了十几二十次后,终于成功了一次,但我执行的操作流程步骤等和之前并无不同。
问题三:在VMware中,我更改root的用户名会导致我无法访问管理员账户,相同的密码也无法登入
解决方案:这个问题我暂时无法解决,只能通过修改其他文件名。
4.学习感悟
本次实验大致是按照实验流程完成,其中也存在部分文档中不存在的报错和突发情况,需要自己查询完成,但实验总体来说对我而言进行的并不顺利,因为我前面的环节都比较顺利的进行了,但是在最后一步反复试验了很多次都没有成功,哪怕最后成功了我也并没有搞清楚影响我最后程序执行结果的因素到底在哪里,这对我来说并不算好,在执行最后一步时我能做的只是去反复试验没有其他的修改。但这次实验也同样使我学习了很多,在执行时需要更多的有自己的思考,这样在遇到超出指导之外的状况才不会慌乱,才能够真正的面对问题,解决问题。这不仅是对我在编程能力上的一次锻炼,也是对我在面临实际问题时解决问题能力的一次提升。