20165207 Exp1 PC平台逆向破解
20165207 Exp1 PC平台逆向破解
0.写在最前面
在做三个实验的前两个的时候,我还没有到博客里去看作业的要求。当时我的主机名是kali5207也就是用我的学号命名的,要求的是姓名全拼命名kali,所以当时我的命名是不规范的。故将改名这一段写在最前面。修改主机的名字也就是修改“hostname”,实际上需要修改的是一个配置文件,在/etc目录下文件名就是hostname。
如图:
进入vim编辑器之后,只有一条内容,就是当前的名字“kali5207”,将其修改为:LiTianLin20165207Kali,然后命令模式下wq保存退出,再重启虚拟机。
重启之后效果如下
如图:
PS:本来我想用下划线规则来改名,就是:litianlin_20165207_kali,但是重启之后两条下划线就没有了。因为下划线不被识别显示,所以改用了驼峰规则。
1.1需要回答的问题
1.1.1实验收获与感想
上学期有一门课的教材是《深入理解计算机系统》,里面有讲x86-64汇编。所以上课讲的时候,我觉得我听得很懂。自己做起来的话,就又是另一回事了。收获就是,函数栈帧掌握的更好了,了解了gdb的强大的另一面。
1.1.2什么是漏洞,漏洞有什么危害
我理解漏洞就是程序在逻辑结构上的不严谨的地方,并且可以被攻击者利用。
漏洞的危害比如,蠕虫病毒可以用漏洞来进行传播、攻击者可以利用漏洞对被攻击者进行远程控制或者窃取被攻击者信息、浏览器漏洞给网页木马提供机会等等。
1.2 需要描述的内容
1.2.1相应指令的机器码
NOP:0x90
JNE:0x75
JE:0x74
JMP:0xEB(8位相对短跳转时)
0xE9(16位相对跳转时)
0xFF(16位/32位绝对跳转时)
EA(远距离绝对跳转并且地址由操作数ptr(指针)给出 格式为:ptr16:32)
CMP:0x38(目的操作数为8位内存或寄存器,源只能为8位寄存器)
0x39(目的是16位内存单元或者寄存器,源只能为16位寄存器)
0x3A(目的是8位寄存器,源是8位内存单元或者寄存器)
0x3B(目的是8位寄存器,源是8位内存单元或者寄存器)
0x3C(源操作数是8位立即数,目的是AL)
0x3D(源操作数是16位立即数,目的是AX)
下面的关于反汇编与16进制编程器、能正确修改机器指令改变程序流程、能正确构造payload进行bof攻击的三个要求在下面的实验过程中有所体现。
2.实验内容
2.1修改机器码,改变程序执行流
首先把老师提供给我们的可执行文件pwn1拷贝到虚拟机里,然后复制一份,用这份来做这个第一个实验。
提前已经知道了pwn1这个文件有关键的三个函数除了main函数之外还有foo函数和getshell函数。这第一个小实验就是要把main函数中调用foo函数的call指令进行修改,最终让call指令调用getshell函数。
既然如此,首先要反汇编一下这个文件,了解其具体内容。使用命令objdump用-d参数使用其反汇编功能,在利用管道符将结果传递给more让more来进行分页查看
好了,在这里最上面有getShell的起始地址804847d
还有下面call调用foo的汇编指令以及对应的机器码,汇编指令是:call 8048491 译码之后变成了e8 d7 ff ff ff ,其中e8代表了call,而后面的d7 ff ff ff是一个“偏移”,用它加上ip寄存器的值(call的下一条是80484ba)在存进ip里便能实现函数调用,也就是说:eip + d7 ff ff ff = 8048491,所以说我们要改的是32位的d7 ff ff ff让改之后的东西加上ip之后变成804847d
于是,打开功能强大的宿主机win10的计算器,注意选DWORD(双字,即32比特),然后计算一下80484ba离804847d有多远
算出来之后的值,求补码之后得到了c3 ff ff ff。所以只要把对应位置的d7改成c3就可以了
vim打开这个文件,在命令模式下输入%!xxd以16进制的方式查看,再输一个斜杠"/"进行搜索,直接搜索e8d7没有搜到
因为e8和d7分开了,直接搜d7,再确认一下就好了
换成c3,我是用i进入插入模式换的
换好之后要给人家恢复原貌不能直接wq保存退出,要先xxd -r撤销掉这个16进制的效果。然后执行这个pwn5207_1,获得root权限
2.2利用缓冲区溢出攻击覆盖掉返回地址,然后执行getshell
刚才我们已经看过了foo函数,有一个很关键的一句话给了我们缓冲区大小的信息:
常被用来做返回值的eax指向了ebp向上28个字节的地方算上ebp里面存的32位的地址,那要被覆盖的无用的地方应该是32个字节。
用gdb验证一下:
所以说,报错内容里面说找不到的地址“34333231”就是我在32个字节之后输进去的1234的ascii码,栈底就是那1234之前的四个4的ascii码
那么我需要做的就是,在32个字节之后放进去我需要让程序跳到的那个位置(804847d),下面是我在上这周二的课之前的一个想法:
大概就是,输入四个字符四个字符被用ascii码翻译出来之后,那个32位的码就是804847d
问题也很明显,不是每个数都有ascii码,7d和08 还有04都还好说但是遇到了84就没有这个对应的字符了
下面是按照这周二讲的用perl语言的方法做出来的结果:
2.3构造payload进行攻击
这次要输入的东西比上一个小实验更长,结构是:32字节(道理是一样的) + shellcode地址(因为要调注进去的shellcode肯定要先把返回地址变成第一句shellcode的地址) + 爬行区(一堆nop:0x90) + shellcode
所以,这一步最关键的就是找到shellcode的地址,来让payload生效。
操作过程是这样的,我参考老师提供的指导把东西复制了下来,然后覆盖返回地址那里改成1234用以标记
用第二个小实验的管道符的方法运行pwn5207_3,需要注意的是那个用来生成input_shellcode的串是没有回车的(也就是说不手敲回车暂时没有输出),否则敲了下回车执行结束了,gdb根本抓不到这个进程,更不用说通过调试来确定返回地址了。就这样,先不敲回车,让它先阻塞。然后新打开一个标签页,在那里查看pwn5207_3的进程号,在通过进程号调这个进程,在foo返回的位置设置断点。
如图,pwn5207_3的进程号是33209,打开gdb使用attach命令调试33209进程。需要设置断点的最关键的地方就是foo返回的那一句,这一句再往下四个字节之后就要开始shellcode了(那就是shellcode的起始地址,就是刚才那四个字节里要填的东西),以及我们已经知道那一句的地址是80484ae,所以b *0x80484ae设置断点,然后回到开始那个标签,回车,让阻塞的进程往下跑。
于是gdb的标签这边断点命中,此时攻击尚未发生,但是foo函数的栈帧基本到底了,这时候的esp再往下指四个字节(就是跳过返回地址那四个字节)就能指到shellcode开始的地方,所以要看esp的值:
是d2ec,所以shellcode要替换的东西就是ffffd2ec+4=ffffd2f0
改!
成功辽
PS:部分计算过程:
20165207 Exp1 PC平台逆向破解的更多相关文章
- 20155324《网络对抗》Exp1 PC平台逆向破解(5)M
20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...
- 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解
2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...
- 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 ...
- Exp1 PC平台逆向破解 20165235 祁瑛
Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...
- 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 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解
2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...
随机推荐
- node项目部署相关问题
process.env process.env属性返回一个对象,包含了当前Shell的所有环境变量. 通常的做法是,新建一个环境变量NODE_ENV,用它确定当前所处的开发阶段,生产阶段设为produ ...
- SqlServer数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)
查询表信息(表名/表描述) Value ) AS value FROM sysobjects a Where a.xtype = 'U' AND a.name <> 'sysdiagram ...
- zTree实现节点修改的实时刷新
一.应用场景 在实际应用中会遇到动态操作树各节点的需求,在增加树节点后如何实时动态刷新树就十分有必要了. 二.项目实践 比如要在test1234节点下新建子节点,首先要选中test1234节点,添 ...
- ceil 和floor
ceil 天花板 floor 地板 ceil向上取整 foor向下取整
- Spring接受前台的数据超过256出现如下异常:
转载自:http://blog.csdn.net/dracotianlong/article/details/47604723 Spring接受前台的数据超过256出现如下异常: org.spring ...
- UVALive 3938 - "Ray, Pass me the dishes!" - [最大连续子列和+线段树]
题目链接:https://cn.vjudge.net/problem/UVALive-3938 参考刘汝佳书上说的: 题意: 给出一个长度为n的序列, 再给出m个询问, 每个询问是在序列 $[a,b] ...
- linux:用户及文件权限管理
学习内容来自实验楼.莫烦python.CSDN 一.Linux 用户管理 1. 查看用户 who am i 或者who mom likes who -a:打印所有能打印的 who -d :打印死掉的 ...
- SSL/TLS 握手优化详解
随着 HTTP/2 的逐渐普及,以及国内网络环境越来越糟糕(运营商劫持和篡改),HTTPS 已经开始成为主流.HTTPS 在 TCP 和 HTTP 之间增加了 TLS(Transport Layer ...
- Why should we typedef a struct so often in C? - Stack Overflow
https://stackoverflow.com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c As Greg Hewg ...
- Python面试数据库
1.列举常见的关系型数据库和非关系型都有那些? 关系型 : MySQL,SQL Server ,Oracle , Sybase, DB2 非关系型 : Redis, MongodDB 2.MySQL常 ...