实践内容

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

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

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。

实践方法

  1. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  2. 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

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

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

实践要求

1. 掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码

2. 掌握反汇编与十六进制编程器

3. 能正确修改机器指令改变程序执行流程

4. 能正确构造payload进行bof攻击

5. Optional:进阶,Shellcode编程与注入

实践基础知识

  • (1)NOP指令即“空指令”(机器码:90)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。所以NOP指令自然也会占用执行一个指令的CPU时间片。
  • (2)JNE是一个条件转移指令(机器码:75)。当ZF=0,转至标号处执行。
  • (3)JE是一个条件转移指令(机器码:74)。如果相等则跳转。
  • (4)JMP是无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
  • (5)CMP为比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果(机器码:39)。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

实践过程

方法一 直接修改可执行文件的机器指令

  • 键入指令objdump -d hf0145234 | more
  • 找到程序关键函数(即去除运行所添加的各种库函数), getShell , foo , main
  • 从图中可以看出该程序正常运行顺序是从main函数入口开始进行执行,而后调用foo函数,并没有对getShell函数进行调用,而我们可以通过修改main函数中call指令来将原本程序对于foo函数的调用改为对getShell函数的调用。

  • 首先我们要了解call指令是通过修改eip寄存器的值来实现对于函数的调用的,因为eip寄存器永远指向下一条指令的地址,call指令的汇编代码与机器指令间的关系为 0x8048491 = 0x80484ba + 0xd7ffffff,其中 0x80484ba是原本下一条指令的地址, 0x8048491 为经过call指令修改后下一条指令的地址,机器指令中的 e8 是call指令的机器码
  • 因此想要调用getShell,只要修改 d7ffffff 为, getShell-80484ba 对应的补码 c3ffffff 就行了。

  • 接下来输入 vi hf20145234 打开可执行文件hf20145234;
  • 输入 :%!xxd 将文件转换成16进制显示
  • 输入 /e8 d7 搜索查询需要修改的机器码位置,锁定位置后按 i 进入插入模式进行将 e8 d7 修改为 e8 c3 (04b0行)
  • 输入 :%!xxd -r取消16进制显示,并输入 :wq 对文件的修改进行保存并退出(注:若不退出16进制显示直接保存,运行文件会出错
  • 再次使用反汇编指令objdump -d pwnx | more进行查看 发现call 后发生了变化
  • 键入 ./hf20145234 查看运行结果

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

  • 第一步依旧是输入反汇编指令objdump -d hf2 | more进行分析,内容同上

  • 第二步,确认输入字符串中哪几个字符会覆盖到返回地址
    • 输入指令 gdb hf2 调试程序,
    • 如果输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell。
  • 第三步,确认用什么值来覆盖返回地址
    • getShell的内存地址,在未启用ALSR的主机上是固定不变的,通过反汇编时可以看到,即 0x804847d 。接下来要确认下字节序,简单说是输入 11111111222222223333333344444444\x08\x04\x84\x7d ,还是输入 11111111222222223333333344444444\x7d\x84\x04\x08 。
    • 对比之前 eip 0x34333231 0x34333231 ,正确应用输入11111111222222223333333344444444\x7d\x84\x04\x08
  • 第四步,构造输入字符串
    • 由为我们没法通过键盘输入 \x7d\x84\x04\x08 这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。
    • 利用Perl构建input文件进行输入,键入指令 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
    • 使用16进制查看指令xxd查看input文件的内容是否如预期
    • 然后将input的输入,通过管道符“|”,作为pwn1的输入。

20145234黄斐《网络对抗技术》实验一,逆向及Bof基础实践的更多相关文章

  1. 20145311王亦徐《网络对抗技术》MAL_逆向与Bof基础

    20145311王亦徐<网络对抗技术>MAL_逆向与Bof基础 实践目标 运行一个可执行文件,通过逆向或者Bof技术执行原本不应该执行的代码片段采用的两种方法: 1.利用foo函数的Bof ...

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

    20165101刘天野 2018-2019-2<网络对抗技术>Exp1 逆向与Bof基础 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执 ...

  3. 20155235 《网络攻防》 实验一 逆向及Bof基础实践说明

    20155235 <网络攻防> 实验一 逆向及Bof基础实践说明 实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  4. 2018-2019-2 20165114《网络对抗技术》Exp1 逆向与Bof基础

    逆向及Bof基础实践 目录 一.实践目标 二.实验操作和步骤 1.直接修改程序机器指令 2.通过构造输入参数,造成BOF攻击. 3.注入Shellcode并执行 三.实验总结 四.实验遇到的错误和问题 ...

  5. 20165218 《网络对抗技术》Exp1 逆向及Bof基础

    Exp1 逆向及Bof基础 基础知识 1. NOP, JNE, JE, JMP, CMP汇编指令的机器码 指令 机器码 NOP NOP指令即"空指令",在x86的CPU中机器码为0 ...

  6. 20145222黄亚奇 《网络对抗技术》 MAL_逆向与Bof基础

    学习目的 通过一些方法,使能够运行本不该被运行的代码部分,或得到shell的使用: 将正常运行代码部分某处call后的目标地址,修改为另一部分我们希望执行.却本不应该执行的代码部分首地址(这需要我们有 ...

  7. 20145324王嘉澜 《网络对抗技术》 MAL_逆向与Bof基础

    实践目标 •本次实践的对象是一个名为pwn1的linux可执行文件. •该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. •该程序同时包含另一个代码片段,get ...

  8. 20145314郑凯杰《网络对抗技术》实验1 逆向及Bof基础实践

    20145314郑凯杰<网络对抗技术>实验1 逆向及Bof基础实践 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数 ...

  9. 网络对抗实验一 逆向及Bof基础实践

    网络对抗实验一 逆向及Bof基础实践 一.实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  10. 20145230熊佳炜《网络对抗》实验九:web安全基础实践

    20145230熊佳炜<网络对抗>实验九:web安全基础实践 webgoat webgoat的中文是代罪羔羊的意思,而它是一个有很多漏洞的web应用程序,我们可以利用它来研究关于web应用 ...

随机推荐

  1. July 12th 2017 Week 28th Wednesday

    No way is impossible to courage. 勇敢面前没有通不过的路. Without faith and courage, nothing is possible. With t ...

  2. June 27th 2017 Week 26th Tuesday

    Happiness takes no account of time. 幸福不觉光阴过. At the beginning of this week, I planned to make some s ...

  3. 使用combineReducers注意事项

    一.从‘redux’包中引入combineReducers方法: import { combineReducers } from 'redux'; 二.针对state的不同属性写不同的reducer, ...

  4. ADF中遍历VO中的行数据(Iterator)

    在ADF中VO实质上就是一个迭代器, 1.在Application Module的实现类中,直接借助VO实现类和Row的实现类 TestVOImpl organizationUser = (TestV ...

  5. 用@ExceptionHandler 来进行异常处理

    有时候我们想统一处理一个Controller中抛出的异常怎么搞呢? 直接在Controller里面加上用@ExceptionHandler标注一个处理异常的方法像下面这样子 @ExceptionHan ...

  6. Visual C++中MFC消息的分类

    Visual C++中MFC消息的分为三类:标准(窗口)消息.命令消息.控件消息. 1.标准(窗口)消息:窗口消息一般与窗口内部运作有关,如创建窗口,绘制窗口,销毁窗口,通常,消息是从系统发到窗口,或 ...

  7. C# 密封类sealed

    1.密封类定义 如果我们不希望自己编写的类被继承:如果有的类已经没有再被继承的必要,这时,我们可以使用sealed修饰符在类中进行声明,以达到该类不能派生其它类的目的,该类就被称为密封类. 2.密封类 ...

  8. CSS3-transition常用属性及示例

    transition参数 语法 transition: property duration timing-function delay transition属性是个复合属性,她包括以下几个子属性: t ...

  9. css百分比问题——`top`、`left`、'translate'的百分比参照谁?

    比如 top.left.transform属性的translate方法,他们的百分比都是相较谁而言的? top.left是基于父元素的: .parent { position: relative; b ...

  10. SQL SERVER 对权限的授予GRANT、拒绝DENY、收回REVOKE

    -----对用户member授权,允许其具有对数据表person的更新和删除的操作权限:GRANT UPDATE,DELETE ON personTO member WITH GRANT OPTION ...