2018-2019-2 网络对抗技术 20165322 Exp1 PC平台逆向破解

2018-2019-2 网络对抗技术 20165322 Exp1 PC平台逆向破解

实验准备

由于kali镜像的原因,系统没有32位的运行库,pwn1文件没法运行,所以我们需要做一些准备工作。

  • 下载阿里云与中科院的更新源
    • 和安装教程里的相同,输入指令leafpad /etc/apt/sources.list打开sources.list文件,直接原来的源在后面家伙加上需要补充的更新源就可以了。
    • 这里用同学分享在群里的博客中的源更新失败了,原因大概是kali对应的版本不正确,因此找不到相应的ip地址。多找几个教程总能有适合自己的源。
    #中科大
    deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
    deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
    
    #阿里云
    #deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
    #deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
    

    • 执行:apt-get clean,apt-get update两条指令即可,之前的博客也说过apt-get upgrade是对所有软件进行更新,耗时过长,且容易蓝屏。不需要做这一步。
  • 安装32位运行库
    • 更新好源以后,开始安装32位的运行库,主要是kali官方源不含这个32位的运行库,所以才有以上操作。
    • 执行指令apt-get install lib32z1即可
    • 此时试运行./pwn1已经能运行成功。

任务一:直接修改程序机器指令,改变程序执行流程

  • 实验内容:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 攻击目标:运行原本不可访问的代码片段
  • 攻击原理:如图所示,代码一共有3个模块,1.getshell;2.foo函数;3.main函数。正常情况下,程序先从main函数开始执行,然后调用foo函数,运行完foo函数以后程序返回到main函数里。因此,正常情况下,getshell是不会被执行到的。我们要做的就是把pwn1程序进行反汇编,然后直接修改程序的机器指令,使程序由main函数直接跳转到getshell函数里。

  • 实现过程:
    • 首先备份pwn1文件:cp pwn1 pwn20165322
    • 对文件进行反汇编:objdump -d pwn20165322

    • 找到相对应的3个函数,我们发现,main函数里有一行指令:call 08048491 <foo>对应的正好是foo函数的起始地址,它所对应的机器码为e8 d7 ff ff ff(此处e8为call指令的机器码)。我们要让call指令跳转到getshell函数的地址0804847d就必须要修改call指令前面的机器码,这个机器码由下图的计算方法所得到:
      *这里有个值得注意的地方:由于d7 ff ff ff在机器上是由小端形式储存,但是我们平时计算的习惯是按大端来读取,所以平时要换算成ff ff ff d7来进行计算。
    • 接着使用命令vi pwn20165322修改文件。
    • 进入之后是乱码,使用:%!xxd转换为16进制显示。
    • 使用/d7命令寻找e8d7ffffff机器指令所在地。
    • 找到以后按回车,按r修改d7为c3。
    • 然后使用:%!xxd -r换回乱码的样子再用:wq!保存即可。
    • 此时再次对程序进行反汇编objdump -d pwn20165322,看到main函数里的机器指令和汇编指令已经修改了

    • 运行一下./pwn20165322成功进入getshell函数。

猜你喜欢

转载自www.cnblogs.com/wangyaojia/p/10517682.html