您的位置:首页 > 其它

2018-3-7 20155317 王新玮 Exp1 PC平台逆向破解(5)M

2018-03-07 15:06 369 查看

2018-3-7 20155317 王新玮 Exp1 PC平台逆向破解(5)M

任务要求:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

NOP、JNE、JE、JMP、CMP汇编指令的机器码:

NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)

JNE:条件转移指令,如果不相等则跳转。(机器码:75)

JE:条件转移指令,如果相等则跳转。(机器码:74)

JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)

CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

在开始之前,我们首先要学会两样东西

1.反汇编

objdump -d pwn1(文件名)|more


  

这条命令的用途是将可执行程序进行反汇编,变成机器指令



2.其次呢我们要学会使用vi编辑器, 我们用vi查看pwn1,输入:

vi pwn1




vi pwn1(文件名) linux下的vi编辑器功能十分强大,不仅可以编辑任何一个文件,而且可以以不同进制进行查看,如下图,进入编辑界面后,敲入

:%!xxd


,则以16进制进行查看。



本次实验要做的是通过修改指令,修改指令间的跳转:在完成本次任务之前,我们先来看一下本次实验的原理:

如下图所示:我们可以看到,在机器语言中,调用指令最根本的是找到了指令所在的偏移地址,例如下图中main的地址为080484af,而call指令后面的8048491对应的是foo函数的地址。所以说,如果想要改变指令的调用,那么我们只需要修改偏移地址的值就可以了。

而且从下图中我们可以看到,前后两者是一一对应的,也就是说,如果改变前着的值,那么对应后面的指令跳转我们也能相应的改变。



完成这些之后呢,我们就能知道e8对应的就是call指令,而e8之后的数字代表着调用函数的偏移地址,我们只需要将foo函数的地址变成getshell函数的地址就可以了



从上图中我们可以看到,foo函数的地址为08048291,getshellh函数的地址为0804847d,用16进制的减法我们可以精确的算出getshell比foo低了14,也就在原来的基础上减去14即可。而在linux环境下,采用小端存储的方式,也就是说d7为低位,就是说将到d7减去14即可,也就是变成c3。完成这些以后,我们采用vi编辑器进行修改。



我们在下面输入:/e8表示查询e8.然后,点击i键进行修改。将d7写为c3,然后按下esc,输入:wq保存退出。

/e8 d7  \\查找

%!xxd - r    \\恢复二进制格式

:wq     \\保存退出


 再次进行objdump -d 进行查看



这样我们就完成了本次任务的实验操作。

实验过程中可能出现的问题:

如果是64位的卡里虚拟机,无法运行可以参考老师写的博客:http://www.cnblogs.com/zl20154312/p/8511455.html,其中如果出现源链接连接不上的情况,可以填入以下链接 :deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: