20145221《网络对抗》PC平台逆向破解

实践目标

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

实践要求

  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分)
  • 掌握反汇编与十六进制编程器 (1分)
  • 能正确修改机器指令改变程序执行流程(1分)
  • 能正确构造payload进行bof攻击(2分)
  • Optional:进阶,shellcode编程与注入

实践两种方法

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

其实我们还可以做的更多,比如说注入一个自己制作的shellcode并运行这段shellcode。

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

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

基础知识

  • 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:直接修改程序机器指令,改变程序执行流程

反汇编,了解程序的基本功能

  • 键入指令:objdump -d 20145221 | more

  • 找到该程序的关键函数(暂不考虑其余库函数),如下图

  • 根据上图易知,程序通过main函数入口开始执行代码,然后main函数会调用foo函数(功能为:将用户输入的字符回显在屏幕上),其中还有一个没有调用的getshell函数(功能为:打开一个可用Shell),显然如果程序正常执行,是不会运行getshell函数部分的,而我们就是要通过修改程序机器指令,达到改变程序执行流程的目的。

直接修改机器码

  • 所以,最基本的思路就是让main函数不再调用foo函数,转而调用getshell函数。观察如下代码:

root@KaliYL:~# objdump -d pwn1 | more 0804847d <getShell>:
804847d: 55 push %ebp
...
08048491 <foo>:
8048491: 55 push %ebp
...
080484af <main>:
...
80484b5: e8 d7 ff ff ff call 8048491 <foo>
80484ba: b8 00 00 00 00 mov $0x0,%eax
...
  • 首先我们要找到call指令机器码与汇编代码的关系如下:0x80484ba + 0xd7ffffff = 0x8048491,其中机器码e8表示call

  • 将上述计算式抽象出来可得:call机器码 = 跳转地址 - call指令的下一个eip

  • 由此我们计算调用getshell函数的机器码为:e8 c3 ff ff ff

  • 接下来我们只需要修改机器码即可:

    • Step1:vi 20145221,用vim编辑器查看可执行文件20145221;

    • Step2:%! xxd,进入vi编辑模式后,发现乱码,键入前述指令查看其16进制表示;

    • Step3:/e8 d7,查询需要改动的机器码的位置,锁定后,按i进入文本编辑模式,将其改为e8 c3

    • Step4:%! xxd -r,退出16进制模式(注意:此处如果直接以16进制形式保存退出,运行该文件会报错

    • Step5::wq!,保存并退出。

  • 此时,我们可以再用反汇编指令查看其机器码,不难发现此时已经改变了原代码。

  • 退出到终端,执行指令:./20145221,结果如下:

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

反汇编,了解程序的基本功能

  • 同上,不赘述。

确认输入字符串哪几个字符会覆盖到返回地址

  • 通过观察foo函数的汇编代码,不难发现其存在BOF漏洞,那我们需要输入多少字符才会造成BOF呢?在此,我们采用每个字节的进行输入,观察程序什么时候崩溃。

  • 经试发现,当输入达到28字节产生溢出Segmentation fault

  • 现在能明确该程序有BOF了,接下来我们接着往后输入,观察什么时候可以覆盖其返回地址,让程序调用完foo函数后走向getshell函数,就能达到目的了。在此,我们使用用GDB调试工具。

GDB调试,确认用什么值来覆盖返回地址

  • gdb 20145221,进入调试,并输入一串可让其溢出的字符;

  • info r,查看溢出时寄存器状态如下:

  • 不难发现,此时“1234”覆盖了其新的eip,所以我们只需要将getshell的内存地址替换这4个字符,就可以达到程序向getshell函数转移的目的。

  • 构造一串特殊的输入,由于getShell的内存地址是0x0804847d,而其对应的ASCII没有字符,所以我们通过一个简单的perl脚本语言来构造输入值。

    • perl -e 'print "12345678123456781234567812345678\x7d\x84\x04\x08\x0a"' > input
    • 注意:kali系统采用的是大端法,所以构造内存地址时注意顺序,末尾的\0a表示回车换行。
  • (cat input; cat) | ./20145221,将input文件作为输入,结果如下:

实践总结

  • 本次实践是我第一次体会到BOF攻击的效果,之前都是理论的学习,知道有这么一个漏洞,但缺少实践的训练。此次通过特殊构造的“20145221”文件,利用2种不同的方法,达到了获取shell的目的,还是很有趣的。
  • 但老师结束时也提到,这个只是简单的训练,真正的BOF是结合了shellcode编程与注入,这一点还有待加强,需要继续努力学习。

20145221《网络对抗》PC平台逆向破解的更多相关文章

  1. 20155334 网络对抗PC平台逆向破解(二)

    注入Shellcode并运行攻击 shellcode就是一段机器指令(code) 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe) ...

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

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

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

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

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

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

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

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

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

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

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

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

  8. 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解

    2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...

  9. 2017-2018-2 20155228 《网络对抗技术》 实验一:PC平台逆向破解

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

随机推荐

  1. Mybatis插入数据后返回主键id

    有时候使用mybatis插入数据后,需要用到记录在数据库中的自增id,可以利用keyProperty来返回,赋值给实体类中的指定字段. 单条记录插入并返回 First, if your databas ...

  2. xpath教程 2 - lxml库

    xpath教程 2 - lxml库 这些就是XPath的语法内容,在运用到Python抓取时要先转换为xml. lxml库 lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HT ...

  3. (3.13)mysql基础深入——mysql日志分析工具之mysqlsla【待完善】

    (3.13)mysql基础深入——mysql 日志分析工具之mysqlsla 关键字:Mysql日志分析工具.mysqlsla 常用工具 [1]mysqldumpslow:官方提供的慢查询日志分析工具 ...

  4. (3.5)mysql基础深入——mysqld_safe脚本功能及流程

    (3.5)mysql基础深入——mysqld_safe脚本功能及流程 目录 1.mysqld_safe过程总结 2.mysql_safe启动的好处 3.mysqld_safe 参数 4.mysqld_ ...

  5. dedecms首页调用随机文章全自动时时更新

    dedecms织梦系统是全站生成静态html的,这个对搜索引擎比较友好,但是有时我们要调用文章,让蜘蛛每次来访问都感觉像是有添加新内容一样,要如何做到呢? 可以添加以下dedecms随机文章调用的参数 ...

  6. Python 使用ctypes调用 C 函数

    在python中通过ctypes可以直接调用c的函数,非常简单易用 下面就一步一步解释用法吧,以Linux为例讲解. 1, 首先确定你的python支持不支持ctypes python2.7以后cty ...

  7. 主成分分析(PCA)算法,K-L变换 角度

    主成分分析(PCA)是多元统计分析中用来分析数据的一种方法,它是用一种较少数 量的特征对样本进行描述以达到降低特征空间维数的方法,它的本质实际上是K-L变换.PCA方法最著名的应用应该是在人脸识别中特 ...

  8. javascript按字节截取标题中字符串

    在网页展示中经常会碰到,标题过长,需要截取字符串,用CSS的实现的话各种兼容问题,下面为大家介绍下javascript如何按字节截取字符串 做为一个前端开发人员在网页展示中经常会碰到,标题过长,需要截 ...

  9. 关闭WPS启动时显示的在线模板

    关闭WPS启动时显示的在线模板 以WPS2016为例,如下图: 操作步骤如下: ①点击在线模板页面右下方的"设置"选项 ②"设置"界面打开后,选择启动WPS默认 ...

  10. AdaBoost Classifier和Regressor

    Adaboost原理传送门 AdaBoost在我看理论课程的时候,以分类为例子来讲解的,谁知道sklearn里面基本上都有classifier和regressor两种.这个倒是我没想到的!!! fro ...