zoukankan      html  css  js  c++  java
  • 20165101刘天野 2018-2019-2《网络对抗技术》Exp1 逆向与Bof基础

    20165101刘天野 2018-2019-2《网络对抗技术》Exp1 逆向与Bof基础

    1. 逆向及Bof基础实践说明

    1.1 实践目标

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

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

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

    三个实践内容如下:

    • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

    • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

    • 注入一个自己制作的shellcode并运行这段shellcode。

    这几种思路,基本代表现实情况中的攻击目标:

    • 运行原本不可访问的代码片段
    • 强行修改程序执行流
    • 以及注入运行任意代码。

    1.2 基础知识

    1.2.1 掌握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.2.2Bof原理

    程序堆栈示意图如下:

    EBP为栈底指针,ESP为栈顶指针,EIP存放下一条执行的CPU指令。

    1.2.3常用的Linux程序及操作

    objdump -d:从objfile中反汇编那些特定指令机器码的section。

    perl -e:后面紧跟单引号括起来的字符串,表示在命令行要执行的命令。

    xxd:为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式。

    ps -ef:显示所有进程,并显示每个进程的UID,PPIP,C与STIME栏位。

    |:管道,将前者的输出作为后者的输入。

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

    1.3 实验步骤

    1.3.1直接修改程序机器指令,改变程序执行流程

    使用objdump -d pwn1将pwn1反汇编,得到以下代码(只展示部分核心代码):

    我们注意到,80484b5: e8 d7 ff ff ff call 8048491 <foo>这条汇编指令,在main函数中调用位于地址8048491处的foo函数,e8表示“call”,即跳转。

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

    vim pwn20165101,进入文件修改机器指令。

    接下来把乱码转换为十六进制机器指令。按下ESC键,输入:%!xxd 修改为十六进制模式,再进行编辑。

    查找要修改的内容:/e8 d7

    键盘输入i进入插入模式,将d7修改c3

    按下ESC键进入命令模式,转换十六进制为原格式:%xxd -r,输入:wq命令保存退出。

    运行文件,测试是否攻击成功

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

    输入gdb pwn20165101-2进行调试

    (gdb)r,运行该程序,输入1111111122222222333333334444444455555555,程序产生一个信号,程序将跳转到未知区域,此时代表存在缓冲区溢出漏洞。

    输入(gdb)info r查看各寄存器的状态,其中eip寄存器中为0x35353535,即在输入字符串的“5”的部分发生溢出。将“5”的部分改为其他数字进一步确认

    输入1111111122222222333333334444444412345678由此可以看到,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell。

    由反汇编结果可知getShell的内存地址为:0804847d

    对比eip 0x34333231 0x34333231 ,正确输入为 11111111222222223333333344444444x7dx84x04x08

    接下来需要生成一个包含这样字符串的文件,来构造输入值(此处要注意字节序)。

    使用perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input命令构造文件。
    末尾的a表示回车换行

    输入(cat input;cat) | ./pwn20165101-2,将input文件中的内容注入并执行文件,发现成功获得shell,可输入指令并得到正确回应

    1.3.4注入Shellcode并执行

    首先使用apt-get install execstack命令安装execstack。

  • 相关阅读:
    LeetCode题解之Flipping an Image
    LeetCode 之Find Minimum in Rotated Sorted Array
    LeetCode题解Transpose Matrix
    LeetCode 题解之Minimum Index Sum of Two Lists
    LeetCode题解之Intersection of Two Linked Lists
    LeetCode 题解之Add Two Numbers II
    LeetCode题解之Add two numbers
    href="#"与href="javascript:void(0)"的区别
    有关ie9 以下不支持placeholder属性以及获得焦点placeholder的移除
    ie7下属性书写不规范造成的easyui 弹窗布局紊乱
  • 原文地址:https://www.cnblogs.com/lty12345678911/p/10549414.html
Copyright © 2011-2022 走看看