2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3 20165211
目录
实验目标
目标一:手工修改可执行文件,改变程序执行流程,直接跳转到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原理
参考资料
缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例。缓冲区可以是堆栈(自动变量)、堆(动态内存)和静态数据区(全局或静态)。
若将函数返回地址修改为指向一段精心安排的恶意代码,则可达到危害系统安全的目的。此外,堆栈的正确恢复依赖于压栈的EBP值的正确性,但EBP域邻近局部变量,若编程中有意无意地通过局部变量的地址偏移窜改EBP值,则程序的行为将变得非常危险。
反汇编和十六进制编程器
反汇编:objdump -d pwn |more
,反汇编文件,并可翻页查看
十六进制编程器:使用perl -e
命令
实验内容
任务一:手工修改可执行文件
- 首先将pwn1进行备份,
cp pwn1 pwn20165211_1
可生成一个和pwn1一样的文件pwn20165211_1。
- 使用
objdump -d pwn20165211_1|more
将pwn20165211_1反汇编,可得到以下代码,可按enter进行浏览。在得到的反汇编结果中,有很多的部分是这个文件所导入的函数,主要部分如下
在这里,我们可以看到一行关键信息
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
查找定位,查看前后的数,发现为我们所需要修改的地方。
- 修改
d7
为c3
- 注意此时保存文件会造成文件的损坏,需要输入
:%!xxd -r
将文件转化为原格式
- 使用
:wq!
写文件并退出
- 修改后再反汇编文件,发现
call
指令后面已变为getShell
函数,说明修改已成功。
- 运行文件,输入指令,发现已成功获得主机的shell
任务二:利用foo
函数的Bof
漏洞,触发getShell
函数。
首先明确我们的目的,在知道了函数
getShell
,通过触发这个函数,即可获得主机的Shell
。实际就是想利用这个可执行文件foo
函数的BOF
漏洞,通过输入超过长度的字符串buf,即可将返回地址覆盖变为getShell
的地址,从而触发函数。
首先,通过反汇编,明确buf的最大长度有多少?主要看的是foo函数
在红框框出的位置,我们可以看到,给buf分配的栈空间,一共有1c(即为28)个字节
如下图,是堆栈的示意图,我们可以看到,EBP占4个字节,所以,返回地址之前一共有32个字节,故构造的字符串应该是32字节的任意数据加getShell
的地址。
- 以上是我们推算的过程,可以通过构造字符串来验证我们的推算是否正确。构造一个
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF12345678
来验证我们的想法。输入gdb ./pwn20165211_2
,来调试改文件,输入我们构造的字符串,结果如下图:
此错误为返回地址为一个无效的地址,查看错误信息,发现为4321的ASCII码值。则可知道我们的想法是正确的,那么接下来就是将1234的位置替换为getShell
的首地址0804847d
,通过上图,我们可以看到,其地址应该为逆序的输入进去则为输入应为\x7d\x84\x04\x08
,
但是,在程序输入时,我们无法直接输入十六进制值,故使用
Perl
语言进行构造我们需要的输入语句,存入input1
文件里,可查看input1
是否符合要求。(\x0a
为回车)
利用管道语句,将
input1
作为pwn20165211_2
的输入。查看发现成功获得shell
.
任务三:注入一个自己制作的shellcode。
参考资料
在对待一些有BOF漏洞的程序时,这种方法应该是最具有普适性的吧,毕竟不是所有的文件里面都会藏着一个
getShell
。首先是一些准备工作,通过以下的操作设置堆栈可执行,关闭地址随机化。
注入自己构造的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的问题了。
首先先写出我们的攻击buf
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF\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,并注入。
- 打开另一个终端,调试这个进程。首先(获取进程号
启动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的更多相关文章
- 20155324《网络对抗》Exp1 PC平台逆向破解(5)M
20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...
- 20155232《网络对抗》 Exp1 PC平台逆向破解(5)M
20155232<网络对抗> Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程 ...
- 20155227《网络对抗》Exp1 PC平台逆向破解(5)M
20155227<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...
- 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解
2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...
- 20155208徐子涵 《网络对抗》Exp1 PC平台逆向破解
20155208徐子涵 <网络对抗>Exp1 PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...
- 20145325张梓靖 《网络对抗技术》 PC平台逆向破解
20145325张梓靖 <网络对抗技术> PC平台逆向破解 学习任务 shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并 ...
- # 《网络对抗》Exp1 PC平台逆向破解20155337祁家伟
<网络对抗>Exp1 PC平台逆向破解20155337祁家伟 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会 ...
- 20145206邹京儒《网络对抗技术》 PC平台逆向破解
20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...
- 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解
20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...
- 20145336张子扬 《网络对抗技术》 PC平台逆向破解
#20145336张子扬 <网络对抗技术> PC平台逆向破解 ##Shellcode注入 **基础知识** Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...
随机推荐
- 深入解密.NET(Tuple元祖)
元组(Tuple)数学概念上是指包含特定元素与数列的数据结构,n-Tuple称为一个n元祖.比如拿数据表来类比,数据表的每一行就是一个元祖,每一列是元祖的一个属性. 它可以视为由于你不想大动干戈创建一 ...
- Appium基础(三)对象抓取
一.启动Android模拟器 二.打开App应用,这里以计算器为例子 三.打开uiautomatorviewer.bat 这个文件在Android SDK-->Tool目录下 双击uiautom ...
- Css预处理器---Less(二)
三.Less语法 (1)变量 //less代码 @nice-blue : #5B83AD; @light-blue : @nice-blue + #111; #header { color : @li ...
- 了解MQ
一.了解RocketMQ? rocketMQ是阿里开源的一款十分优秀的消息队列,rocketMQ具有很多其他消息队列不具有的特性,更重要的是rocketMQ是用java开发的学习成本较低,并且经历了双 ...
- Python二分法查找
1.1二分前提是有序,,否则不可以2分,2分查找的时间复杂度是O(log n):排序后二分查找到适当的位置插入数值 lst = [37,99,73,48,47,40,40,25,99,51] def ...
- Python基础知识摘要
python字典 增,删,改,查 1.增:XXX[新的key] = value 2.删:DEL XXX[key] 3.改:XXX[已经存在的key] = NewValue 4.查:aList.exte ...
- 导入javax.servlet。伺服登记无法解决:The import javax.servlet.MultipartConfigElement cannot be resolved
解决办法:
- Solid Dominoes Tilings (轮廓线dp打表 + 容器)
第一步先打一个表,就是利用轮廓线DP去打一个没有管有没有分界线组合数量的表 #include<bits/stdc++.h> using namespace std; ; <<; ...
- Python学习记录之-----类
面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大 ...
- Chrome浏览器相关细节整理
一.上传文件卡死 可能时由于输入法的原因导致上传文件浏览器卡死.将输入法改为英文模式再操作上传文件就不会卡死了.