2015531 网络攻防 Exp1 PC平台逆向破解(5)M
实践目标
本次实践的对象是linux的可执行文件
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode
实践一
首先,通过命令objdump -d pwn1对文件进行反汇编
然后通过命令vi pwn1编辑文件
通过命令:%! xxd把文件转为十六进制编辑模式
通过命令/d7ff找到需要修改的地方,最后输入i进入编辑模式,即把d7为c3
改完后输入命令:%! xxd -r将文件转回至二进制形式,再输入:wq保存并退出
此时我们可以看到程序已从原来跳转至foo函数变为跳转至getshell函数
实践二
通过命令gdb pwn2进行调试,通过命令r进行运行,通过命令info r可查看各寄存器的值,其中主要关注EIP寄存器的值
由可知此1234这四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。因此只要把这四个字符替换为getShell的内存地址,输给pwn1,pwn1就会运行getShell
确认用什么值来覆盖返回地址
getShell的内存地址,通过反汇编时可以看到,即0804847d。
对比之前EIP寄存器显示的值0x34333231,此处应输入11111111222222223333333344444444\x7d\x84\x04\x08
实践三
输入命令execstack -s pwn1设置堆栈可执行
输入攻击命令(cat input_shellcode;cat) | ./pwn3
找到进程号:4703
输入gdb进行调试