20165309 《网络对抗技术》实验一:PC平台逆向破解


目录


一、实践目标

  • 本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。
  • 我们实践的目标就是想办法运行这个代码片段,然后学习如何注入运行任何Shellcode。

返回目录


二、基础知识

  • 什么是漏洞?漏洞有什么危害?

    • 我觉得漏洞就是攻击者进行未授权访问和破坏的“机会”,也是程序产生非预期行为的隐患。
    • 漏洞会导致诸多安全问题,甚至会影响到软、硬件设备。被侵入后,我们的数据、隐私等会很容易被窃取、利用,所以,勤打补丁很重要。
  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
    • 我们可以利用objdump -d得到汇编代码,然后对应起来看汇编指令和机器码。(以下指令的机器码均在括号中标出)
    • NOP:“NULL”,一般用来控制CPU的时间周期,达到时钟延时的效果。(90)
    • JNE:条件转移指令,如果不相等则跳转。(75)
    • JE:条件转移指令,如果相等则跳转。(74)
    • JMP:无条件转移指令可转到内存中任何程序段。段内直接短转Jmp short(EB)段内直接近转移Jmp near(E9)段内间接转移Jmp word(FF)段间直接远转移Jmp far(EA)。
    • CMP:比较指令,CPU将目的操作数和源操作数做减法从而根据运算结果修改标志位的值,然后用相应的跳转指令来进行选择执行哪一段代码。
    • 推荐一波参考资料:汇编指令和机器码的对应表汇编指令机器码对应列表
  • 反汇编
    • objdump -d : 将代码段反汇编。
    • objdump -S : 将代码段反汇编的同时,将反汇编代码与源代码交替显示,编译时需要使用-g参数调试信息。
    • objdump -l : 反汇编代码中插入文件名和行号。
    • objdump -j section : 仅反汇编指定的section。
    • objdump -t :输出目标文件的符号表。
    • objdump -h :输出目标文件的所有段概括。
    • objdump -x :以某种分类信息的形式把目标文件的数据组成输出,可查到该文件的的所有动态库。
  • 十六进制编程器
    • 在VIM里时我们可以通过如下方式使用:

      • :%!xxd :进入十六进制模式。
      • :%!xxd -r :退出十六进制模式。

返回目录


三、实验原理、内容及步骤

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

1.1实验原理

程序中的main函数会通过call指令调用foo这个函数,实验的这一环节就是要改其地址、换其函数、实现“想要”的功能(详见下述步骤)。

1.2内容及步骤
  • 首先,来找一找共享文件夹的“pwn1”在哪儿:

  • 然而,我们发现,它现在运行不了:

  • 因为需要装个支持32位程序的库,这里参考了学长的博客,其中,用的更新源来自解决kali更新源时出现签名无效问题



  • 现在可行了,如图可见foo函数的功能:

  • 用反汇编,看一看实验核心函数的部分,这里,我们重点关注main函数的call指令这一行:call指令对应的e8,我们要做的就是把四字节的偏移量ff ff ff d7(小端序,补码)换成getShell函数对应的。





  • call指令在执行时,会EIP当前的值,也就是下一条指令的地址——0x080484ba压栈,然后修改寄存器EIP,将EIP指向foo函数的起始地址(因为EIP+偏移量= 0x080484ba + 0xffffffd7 = 0x08048491目的地址)。
  • 所以要修改的是call指令的偏移量,由计算0x0804847d - 0x080484ba = 0xffffffc3,简而言之,要把d7换成c3了。在vim下修改:如下图指令进入十六进制模式,然后定位,换后回到二进制模式。





  • 保存退出后,我们可以看到call函数使程序跳转到了getShell函数。

  • 运行后,我们实现出了shell~

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

2.1实验原理
  • 通过观察上一环节的反汇编页面,可知foo函数中使用了gets函数,该函数不会检查用户输入的长度,通过“栈溢出”覆盖栈中保存的RET地址,可以改变程序的执行流。
  • 我们这里要做的就是利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

2.2内容及步骤
  • 我们要确认一下字符串的缓冲区长度,进gdb调试,输入字符串如1111111122222222333333334444444455555555,发生段错误产生溢出。(注意EIP的值,是ASCII 5)



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

  • 这里的字节序是小端序,getShell的地址(0x0804847d)放在字符串中就是\x7d\x84\x04\x08
  • 使用输出重定向“>”将perl生成的字符串存储到文件input中,再用16进制查看指令xxd查看input文件的内容是否如预期,然后将input的输入通过管道符“|”作为pwn2的输入,再现shell功能:

  • PS.看到了不用perl语言的一种方式:

3.注入Shellcode并执行

3.1实验原理
  • 植入代码的构造类型(NSR、RNS、AR),可学习缓冲区溢出攻击这篇报告。实验中用的是RNS类型。
  • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令,注入shellcode即返回地址为shellcode的起始地址。

3.2内容及步骤
  • 安装execstack程序以便后续设置易于攻击的环境:apt-get install execstack
  • 准备工作(搬运一下老师的实验指导):
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
  • 构造RNS攻击结构:<32字节任意数据> + <4字节 RET覆盖地址> + <NOP垫> + <shellcode>,最后一个字符千万不能是\x0a

  • 注入:

  • 再开另外一个终端,用gdb来调试pwn3这个进程。

  • 在gdb中连接进程,在foo函数的RET位置设置断点,在断点处暂停后,查看栈的情况:



  • NOP垫的开始地址是0xffffd34c,shellcode在其基础上加4字节,于是修改\x4\x3\x2\x1\x50\xd3\xff\xff。攻击成功:

返回目录


四、问题与解决

  • 问题1:报错bash: ./pwn1: 没有那个文件或目录
  • 解决1:上述博客 三、1.2 中已详解。
  • 注意2:十六进制下修改地址后要换回二进制再保存退出。

返回目录


五、实验收获

我觉得这个实验在操作上是很容易的,我也算是切身领会了BOF攻击神奇的乐趣,但在理解方面我还需要下一些功夫,有些知识自己看的时候并不能弄清楚,上课听老师讲完才知道,自学成效堪忧...还有一点收获是:谨防入坑。

返回目录

20165309 《网络对抗技术》实验一:PC平台逆向破解的更多相关文章

  1. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  2. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

  3. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  4. 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

  5. 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...

  6. 2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解 实验1-1直接修改程序机器指令,改变程序执行流程 先输入objdump -d 20165305pwn2查看反汇编代码 ...

  7. 2018-2019-2 《网络对抗技术》 Exp1 PC平台逆向破解 20165215

    2018-2019-2 <网络对抗技术> Exp1 PC平台逆向破解 20165215 目录 知识点描述 实验步骤 (一)直接修改程序机器指令,改变程序执行流程 (二)通过构造输入参数,造 ...

  8. 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...

  9. 20165214 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3

    <网络对抗技术>Exp1 PC平台逆向破解之"逆向及Bof基础实践说明" Week3 一. 实验预习 1.什么是漏洞?漏洞有什么危害? 漏洞就是在计算机硬件.软件.协议 ...

  10. 2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解 实验内容及步骤 第一部分:直接修改程序机器指令,改变程序执行流程 关键:通过修改call指令跳转的地址,将原本指向被 ...

随机推荐

  1. windows之电脑开机出现 this product is covered by one or more of the following prtents

    电脑开机出现 this product is covered by one or more of the following prtents 有次意外断电后就每次都出现这个提示,然后要等检查完才能进入 ...

  2. CentOS 7 Gitlab+Jenkins持续集成+自动化部署

    基于上次的环境<部署Gitlab+Jenkins持续集成环境> 来实现自动化部署 系统管理–>插件管理–>安装以下插件: Credentials Plugin(默认已经安装) ...

  3. 目标检测方法——R-FCN

    R-FCN论文阅读(R-FCN: Object Detection via Region-based Fully Convolutional Networks ) 目录 作者及相关链接 方法概括 方法 ...

  4. CCF CSP 201509-1 数列分段

    题目链接:http://118.190.20.162/view.page?gpid=T32 问题描述 试题编号: 201509-1 试题名称: 数列分段 时间限制: 1.0s 内存限制: 256.0M ...

  5. deepin Gtk-WARNING **: 无法在模块路径中找到主题引擎:“adwaita”

    虽然没影响使用,但是看着有点不爽. 执行 sudo apt-get install gnome-themes-standard 就可以了.

  6. ios开发蓝图

  7. 记一次JAVAWEB项目部署

    需求 原本服务器上tomcat部署了一个javaweb项目在80端口,这次要部署另一个javaweb项目在8090端口,或者同时部署在同一端口不同目录下. 解决方法 不同端口部署 不同端口部署我们需要 ...

  8. java枚举类型详解

      枚举类型是JDK1.5的新特性.显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类.而这些类都是类库中Enum类的子类(java.lang.Enum<E>).它 ...

  9. 在ubuntu的bash中循环执行脚本,并在内存不足时重启

    #!/bin/bash date ma=`grep MemAvailable /proc/meminfo | awk '{print $2}'` echo MemAvailable = $ma run ...

  10. 利用策略模式实现了同一接口的多个Servicel实现类,如何同时注入Controller

    解决方法如上图,通过给实现类起别名,并在controller中,通过@Qualifier注解获取不同的实现类,之前没有这样写,会出现这样的情况: 通过@autowired注解注入dao层时为空,会报空 ...