1.实验内容
1.1 实验目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3.注入一个自己制作的shellcode并运行这段shellcode。
1.2 基础知识
1.通过结合计算机组成原理以及查阅相关资料,我们知道了NOP, JNE, JE, JMP, CMP等常用汇编指令的机器码:
NOP:一个空指令,什么都不做,让cpu等待一段时间,并且该指令会自动对齐寻址。机器码为0x90;
JNE:一个条件转移指令,当零标志z=0时跳转至标号,z=1时顺序执行下一条指令。机器码为0x75;
JE:一个条件转移指令,当零标志z=1时跳转至标号,z=0时顺序执行下一条指令。机器码为0x74;
JMP:无条件转移指令。段内直接近转移Jmp near,机器码为0xe9; 段内间接转移Jmp word,机器码为0xff;段内直接短转Jmp short,机器码为0xeb; 段间直接(远)转移Jmp far,机器码为0xea;
CMP:比较指令,执行减法操作但不保存运算结果。
2.掌握反汇编与十六进制编程器
通过查阅资料我们可以知道:
objdump反汇编命令:
objdump -f test //显示test的文件头信息
objdump -d test //反汇编test中的需要执行指令的那些section
objdump -D test //与-d类似,但反汇编test中的所有section
objdump -h test //显示test的Section Header信息
objdump -x test //显示test的全部Header信息
objdump -s test //除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
2.实验过程
2.1 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
设置共享文件夹将pwn1文件导入主目录后并修改文件名pwn2402,输入:objdump -d pwn2402得到反汇编代码: