PC平台逆向破解
---恢复内容开始---
PC平台逆向破解
实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。
目标是手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
基础知识
几个常见汇编指令
NOP:无操作,直接执行下一条指令
JNE:ZF等0时跳转,即不等于时跳转
JE:等于时跳转
JMP:无条件跳转
CMP:比较.(两操作数作减法,仅修改标志位,不回送结果),ZF就是标志位
linux基本操作
https://www.shiyanlou.com/courses/1
可执行文件其实就是由一系列汇编指令构成的,包括各个函数的调用其实都需要通过jum或其他跳转指令来实现,因此这次实践最直接的思路是修改main中原本该调用foo函数位置跳转的地址,把它改为getshell的地址。
直接打开可执行文件会是一堆机器码,需要先将其反汇编之后再进行之后的操作。kali系统自带反汇编,只需在终端输入“objdump -d 文件名”就可以将其反汇编。
找到main函数的位置
call是跳转,注意call那一行和foo函数的首地址会发现ba+d7 mod ff = 91,也就是foo函数的首地址,于是可以知道e8是跳转指令,d7是相对于call的下一条语句偏移地址,于是ba-7d = 3d,3d的补码应是c3,接下来只要把b7换成c3就好了。
一般文本编辑器打开文件都不会以16进制显示,所以还需要一个十六进制编程器,实践中用的是vim文本编辑器。
对vim不了解可以现在实验楼看它的教程:https://www.shiyanlou.com/courses/2。
首先命令行输入“vi 文件名”在vim中打开文件,之后按esc确认自己在普通模式下,按shift+:进入命令模式,输入”:%!xxd“将显示模式切换为十六进制显示。
查找要修改的内容”/e8 d7“,找到后前后的内容和反汇编的对比下,确认是地方是正确的,因为可能有多个地方调用。
修改d7为c3
转换16进制为原格式”:%!xxd -r“,存盘退出”:wq“,注意如果不将其转为原格式vim将以ascll码将16进制数保存,将导致无法运行。
最后程序成功跳到了getshell函数