20155213 《网络攻防》 Exp1 PC平台逆向破解
20155213 《网络攻防》 Exp1 PC平台逆向破解(5)M
实践内容
- 通过对实践对象——pwn20155213的linux可执行文件的修改或输入,完成以下三块:
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode
- 三块内容也实际包含了现实情况下bof攻击的三种方法:
- 运行原本不可访问的代码片段
- 强行修改程序执行流
- 以及注入运行任意代码
实践所涉及指令
汇编中的指令:
* call:使程序跳转到某个地址并开始执行,被调用的过程位于当前代码段内。它的机器指令是一个16位的有符号数,也就是说被调用的过程的首地址必须位于距离当前call指令-32768~+32767字节的地方。在指令执行的时候,处理器先把IP的值压栈,然后根据操作数调整IP的值(IP=IP+操作数+3),这直接导致处理器的执行流转移到目标位置处。
* ret:近返回指令。执行的时候,处理器从栈中弹出一个字到IP中。
* NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
* JNE:条件转移指令,如果不相等则跳转。(机器码:75)
* JE:条件转移指令,如果相等则跳转。(机器码:74)
* JMP:无条件转移指令。段内直接短转Jmp
* CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。- gdb中的指令:
* attach:直接在gdb中把一个正在运行的进程连接到gdb中,以便于进行动态调试;
* disassemble:命令用于反汇编,它可被用来查看当前执行时的源代码的机器码,其实际上只是把目前内存中的指令dump出来。 linux中的指令:
* ps:用来查看进程
* grep:是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
* prel: Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用。实践一:直接修改程序机器指令,改变程序执行流程
Step1:通过
objdump -d pwn1对文件进行反汇编,并获得需要的三个信息,如下图:

- Step2:计算出需要修改的地方,计算方法:首先,须知,这是小端显示的虚拟机,其次存储在可执行文件中的地址都是相对地址,所以根据绝对地址
0x8048491和0x804847d可以计算出两个函数foo和getShell相对地址差值为0x14,由于getShell函数在比foo函数低地址部分,所以使用foo的相对地址(0xffffffd7)减去0x14得到0xffffffc3; Step3:根据第二步所得,使用vim修改pwn20155213文件。

具体步骤如下图:

- Step4:运行修改后的程序:

可以看出修改的是正确的,已经可以成功调用getShell部分代码。
实践二:通过构造输入参数,造成BOF攻击,改变程序执行流
- Step1:通过测试输入,判断那几个字节覆盖到后面的指令:

可以看到eip处,出现的是‘5’的ascii码值,所以可以判定,覆盖出现在输入的后八字节;将输入的后八字节改成12345678,再次调试;

可以看出,覆盖出现在后八字节的前四字节,所以构造这四个字节就可以完成要求了;
- Step2:构造字符串:因为键盘无法输入16进制数,所以使用prel方法,将
getShell的内存地址写入输入字符串中,

由图可见,测试成功。
实践三:注入Shellcode并执行
- 准备工作:
- 先使用execstack设置pwn20155213文件为设置堆栈可执行,然后关闭地址随机化;按照下图敲入指令:

- 先使用execstack设置pwn20155213文件为设置堆栈可执行,然后关闭地址随机化;按照下图敲入指令:
- 构造要注入的payload:
- Linux下有两种基本构造攻击buf的方法
retaddr+nop+shellcodenop+shellcode+retaddr
- 因为
retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面,缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边,使用nops+shellcode+retaddr,nop一为是了填充,二是作为“着陆区/滑行区” - 若猜的返回地址只要落在任何一个
nop上,自然会滑到我们的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;然后在命令行中输入(cat input_shellcode;cat) | ./pwn20155213 - 打开另一终端进行gdb调试:
找到进程号3191

在gdb调试中使用attach命令进行调试:

- 由图所示,
0xffffd39c的下一个地址就是所需地址; - 修改输入字符串:
perl -e 'print "A" x 32;print "\xb0\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 运行
(cat input_shellcode;cat)|./pwn20155213,如下图;

攻击成功。
- Linux下有两种基本构造攻击buf的方法
20155213 《网络攻防》 Exp1 PC平台逆向破解的更多相关文章
- 2015531 网络攻防 Exp1 PC平台逆向破解(5)M
2015531 网络攻防 Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串 ...
- 2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解
2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解 目录 一.逆向及Bof基础实践说明 二.直接修改程序机器指令,改变程序执行流程 三.通过构造输入参数,造成BOF攻击,改变程 ...
- 20155239吕宇轩 Exp1 PC平台逆向破解(5)M
20155239 网络对抗 Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程器 (1分) ...
- 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解
2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...
- 2018-2019-2 20165312《网络攻防技术》Exp1 PC平台逆向破解
2018-2019-2 20165312<网络攻防技术>Exp1 PC平台逆向破解 一.Exp1.1 直接修改程序机器指令,改变程序执行流程 知识要求:Call指令,EIP寄存器,指令跳转 ...
- 20155226 《网络攻防》 Exp1 PC平台逆向破解(5)M
20155226 <网络攻防> Exp1 PC平台逆向破解(5)M 实践目标 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串 该程序同时包含另一个代 ...
- 20155308《网络攻防》 Exp1 PC平台逆向破解(5)M
20155308<网络攻防> Exp1 PC平台逆向破解(5)M 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是 ...
- 20155321 《网络攻防》 Exp1 PC平台逆向破解(5)M
20155321 <网络攻防> Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...
- 20155330 《网络攻防》Exp1 PC平台逆向破解(5)M
20155330 <网络攻防>Exp1 PC平台逆向破解(5)M 实践目标 运行pwn1可执行文件中的getshell函数,学习如何注入运行任何Shellcode 本次实践的对象是一个名为 ...
随机推荐
- linux下指定源下载
我们默认使用yun 安装的时候 使用的 是外国的网站进行下载的 那么下载肯定是慢的 我们可以更改为国内的站点进行下载的 比如临时更改为国内的站点进行下载 pip install -i +你的源 p ...
- [控件] 动态实时设置CAShapeLayer贝塞尔曲线的坐标点
动态实时设置CAShapeLayer贝塞尔曲线的坐标点 效果图: 源码: PathDirectionView.h 与 PathDirectionView.m // // PathDirectionVi ...
- Linux查看系统当前字符集
常用的命令展示 参考当前环境的字符集 方法一: cat /etc/sysconfig/i18n [ssh客户端工具最好也是utf-8,保持一致] 方法二:echo $LANG 设置当前环境的字符集 方 ...
- jQuery插件实例三:图片滚动[切换]效果一
图片切换效果在很多网站上都能看到,是一种常见的广告/活动宣传方式,通常位于网页上端.这个插件是众多图片切换效果的形式中的一种,数据源可在前端配置,也可从后台通JSON格式传输数据,当然,数据格式是固定 ...
- firewalld防火墙简单理解总结(一)
参考文章:https://linux.cn/article-8098-1.html https://linux.cn/article-9073-1.html #多区域使用示例,重点参考 前言 防火 ...
- ZT 计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48
计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48 分类: C/C++ [转]计算一个无符整数中1Bit的个数(1) Count the number of bits ...
- JS 事件冒泡、捕获。学习记录
作为一个转行刚到公司的新人,任务不多,这一周任务全部消灭,闲暇的一天也别闲着,悄悄的看起了书.今天写一下JS的事件冒泡.捕获. 也是今天看的内容有点多了,有些消化不了,就随手记录一下.纯属自我理解,如 ...
- JNLP应用程序无法打开的解决办法
JNLP应用程序无法打开: 1.控制面板-Java-Java 选项卡-查看.用户选项卡勾选对应版本JDK(没有就添加,路径填类似:D:\Program Files\Java\jre6\bin\java ...
- 【转】Android中获取应用程序(包)的信息-----PackageManager的使用(一)
转载请注明出处:http://blog.csdn.net/qinjuning 本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占 ...
- PHP类的静态(static)方法和静态(static)变量使用介绍
PHP类的静态(static)方法和静态(static)变量使用介绍,学习php的朋友可以看下 在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class ...