2019-2020-2 20175227张雪莹《网络对抗技术》 Exp1 PC平台逆向破解

2019-2020-2 20175227张雪莹《网络对抗技术》

Exp1 PC平台逆向破解

目录

  • 0. 实验目标
  • 1. 实验内容
  • 2. 实验要求
  • 3. 老师提问
  • 4. 所遇到的问题及其解决方法
  • 五、实验感想
  • 六、参考资料

    0. 实验目标

  • 本次实践的对象是一个名为pwn1为了区别于其他同学以改名为“pwn1_20175227)的linux可执行文件。
  • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下个代码是不会被运行的。
  • 我们实践的目标就是想办法运行这个代码片段。
  • 我们将学两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

    1. 实验内容

  • 1.1 直接修改程序机器指令,改变程序执行流程
    • 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
    • 学习目标:理解可执行文件与机器指令
    • 进阶:掌握ELF文件格式,掌握动态技术
    • 步骤:
      • 下载目标文件pwn1,用objdump -d pwn1 | more反汇编并分页显示。

      • 输入/main,查找main函数;其中,"call 8048491 "是汇编指令。
        • 其对应机器指令为“e8 d7ffffff”,e8即跳转之意。
        • 本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba
      • 这条指令将调用位于地址8048491处的foo函数;输入/foo查找foo函数,如下图:
        • 当执行“e8 d7ffffff”时,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值。
      • main函数调用foo,对应机器指令为“ e8 d7ffffff”,
        • 那我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。
        • 用Windows计算器,直接 47d-4ba就能得到补码,是c3ffffff。
      • 下面我们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff。
        • cp pwn1 pwn2复制文件,以保留修改前文件;并用vi编辑pwn2
      • 可执行文件中因为已经汇编为机器代码,在我们看来就是一堆乱码,因此我们需要将他的显示模式切换为16进制模式,即输入Esc+:%!xxd
      • 之后,输入/d7查找e8d7ffffff(可以多查找几次,以防有重复字段,一般关键词前后十个字节一致,就是查找目标值)
    • 找到目标之后回车确认,输入r+c,r+3,将d7修改为c3
    • 输入:%!xxd -r将16进制转换为原格式并存盘退出vi。

    • 再输入objdump -d pwn2 | more反汇编看一下,call指令是否正确调用getShell


      + 运行一下pwn1和pwn2
      + pwn1 功能:显示用户输入的内容
      + pwn2功能:实现shell功能

4. 所遇到的问题及其解决方法

  • 4.1 问题1
    • 描述:无法运行pwn1以及pwn2,如图:

    • 解决方法:它提示我权限不够,添加sudo 或是用su命令进入root权限都不可以运行。查看文件属性之后,我意识到我在首次编辑pwn2时由于输入错误异常退出,于是我将该文件删了,在同一名字下重新编辑,这样操作可能导致文件权限被改变。于是,我将文件重新命名后正常修改后执行即可。结果在此。

猜你喜欢

转载自www.cnblogs.com/zxy20175227/p/12395726.html