20145218PC平台逆向破解

实践目标

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

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

我们将学习两种方法

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

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

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

实践要求

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

基础知识

汇编指令

  • NOP:NOP指令即“空指令”,在x86的CPU中机器码为0x90(144)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。可以用于破解程序的call验证。
  • JNE:条件转移指令,如果不相等则跳转,机器码75。
  • JE:条件转移指令,如果相等则跳转,机器码74。
  • JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
  • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
  • CALL:将下一条指令的所在地址入栈,并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序)。

Linux指令

  • objdump -d test:反汇编test
  • info r:查看寄存器
  • %!xxd:查看二进制文件

反汇编了解程序基本功能

  • 输入指令objdump -d 20145218 | more
  • 找到该程序的关键函数,如下图所示:

  • foo函数功能:将用户输入的字符再次在屏幕上显示出来。
  • getshell函数功能:打开一个可用Shell。
  • main函数中调用了foo函数。

第一种方法——直接修改机器指令

  • 我们如果想要用到shell功能,就要使main函数不调用foo函数,而是调用getshell函数,这一点我们可以通过直接修改机器指令做到。
  • 找到与调用foo函数有关的机器指令,由图可得,call 8048491是汇编指令,即,将调用位于地址8048491处的foo函数;对应机器指令为e8 d7ffffff,所以我们要将机器指令中foo函数的物理地址改为getshell函数的。
  • 由汇编指令及其对应的机器指令,我们可得:0xd7ffffff+0x80484ba = 0x8048491
    即:call机器码 = 跳转地址 - call指令的下一个eip 所以可以算出调用getshell函数的机器码为e8 c3ffffff,所以我们只要将d7修改为c3即可。

具体步骤

  • 我们可以先运行一下原文件,看一下foo函数功能,如下图所示:

  • 然后输入vi 20145218,查看可执行文件20145218
  • 进入后发现是乱码,输入%! xxd查看十六进制表示:

  • 输入/e8 d7查找需要改动的地方,按i进入文本编辑模式,改为e8 c3

  • 输入%! xxd -r,退出16进制模式(若不退回到乱码模式,运行文件会报错)
  • 输入:wq!,保存并退出。
  • 这时我们再运行文件,结果如下图所示:

第二种方法——通过构造输入参数造成bof攻击改编程序执行流

  • 通过观察foo函数的汇编代码,我们可以发现其存在BOF漏洞,但并不知道需要输入多少字符才会造成BOF,所以我们一个字节一个字节的输入,不断尝试,观察程序什么时候崩溃,即出现Segmentation fault字样。

  • 使用gdb调试,看什么时候可以覆盖寄存器%eip的值,且要让程序调用完foo函数后再调用getshell函数。(%eip寄存器就是保存下一条指令的内存地址)
  • gdb 20145218,进入gdb调试
  • info r,查看溢出时寄存器状态如下,尤其观察%eip的值:

  • 再次调试查看是哪个字符被覆盖到了eip中:

  • 我们可以发现,“1234”覆盖了其新的eip,所以我们只需要将getshell的内存地址替换这4个字符,getShell的内存地址是0804847d,替换后即,简单说是输入11111111222222223333333344444444\x7d\x84\x04\x08(低字节在高位)
  • 因为无法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件,perl -e 'print "12345678123456781234567812345678\x7d\x84\x04\x08\x0a"' > input(\0a代表回车键)
  • (cat input; cat) | ./20145218,将input文件作为输入:

20145218PC平台逆向破解的更多相关文章

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

    目录--PC平台逆向破解 1 逆向及BOF基础实践说明 1.1 实践内容 1.2 实践要求 1.3 基础知识 2 实验步骤 2.1 直接修改程序机器指令,改变程序执行流程 2.2 通过构造输入参数,造 ...

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

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

  3. 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解

    2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...

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

    实验一 PC平台逆向破解 实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另 ...

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

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

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

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

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

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

  8. Exp1 PC平台逆向破解 20165235 祁瑛

    Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...

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

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

随机推荐

  1. mysql复制(高可用架构方案的基础)

    mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以 ...

  2. 【转】JMeter基础之——一个简单的性能测试

    上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站是fnng.cnblogs.co ...

  3. 腾讯云搭建php环境

    1.安装搭建论坛必要的软件 apache  php  mysql CentOS系统我们可以直接使用 yum install 的方式进行软件安装,腾讯云有提供软件安装源,是同步CentOS官方的安装源, ...

  4. .Net 框架实现AOP(动态代理实现AOP,本文为翻译)

    在上一节,我们将静态实现AOP,但是对于一个大型项目,要想为每个类,每个方法都去实现AOP ,进行日志记录和权限验证似乎是不可能的. 即使可能对于成百上千个类维护,也是很难维护.所以今天的主题就是如标 ...

  5. JS中有几种数据类型分别是哪几种

    number,string,boolean,null,undefined,object

  6. js处理数值和日期本地化

    js处理数值和日期本地化 const s = new Intl.NumberFormat('zh-cn'); s.format(111.111) // "111.111" cons ...

  7. Android 4 学习(13):Local Broadcast Manager & Intent Filter

    参考<Professional Android 4 Development> Local Broadcast Manager 简介 Local Broadcast Manager由Andr ...

  8. PL/SQL查询设计器

    被微软惯坏的我,在使用PL/SQL进行oracle多表连接查询操作时候经常挠头. 今天无意间发现了PL/SQL也有查询设计器,虽然没有sqlserver的强大好用,但足够用了. 在菜单栏 工具---& ...

  9. mysql免安装版1067错误终极解决办法|在windows平台下MySql启动时的1067错误的解决方法及反思

    [windows事件查看] 我的电脑--此电脑--右键管理--计算机管理--系统工具--事件查看器--Windows日志--应用程序--找错误标志,如下图 [提示] 按部就班,可能并不能解决你的问题, ...

  10. 数据预处理:PCA,SVD,whitening,normalization

    数据预处理是为了让算法有更好的表现,whitening.PCA.SVD都是预处理的方式: whitening的目标是让特征向量中的特征之间不相关,PCA的目标是降低特征向量的维度,SVD的目标是提高稀 ...