zoukankan      html  css  js  c++  java
  • 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函数

     

    
    
    
    
  • 相关阅读:
    MD5
    第一阶段冲刺(十)
    团队作业进度报告
    第一阶段冲刺(九)
    团队作业进度报告
    第一阶段冲刺(八)
    第一阶段冲刺(七)
    团队作业进度报告
    第一阶段冲刺(六)
    团队作业进度报告
  • 原文地址:https://www.cnblogs.com/guoyicai/p/8525386.html
Copyright © 2011-2022 走看看