Exp1-PC平台逆向破解
1.实验结果
1.1直接修改程序机器指令,改变程序执行流程
1.2通过构造输入参数,造成BOF攻击,改变程序执行流
1.3注入Shellcode并执行
2.实验体会
2.1实验收获与感想
本次实验在Linux环境下,通过三种方式实现缓冲区攻击,达到不同的攻击目标。通过本次实验,我有以下收获。
2.1.1运用掌握Linux操作系统基本操作
假期在家自学了实验楼的Linux课程,该课程偏向实践,未对诸如命令写法和计算机操作系统的一些基本概论进行说明,所学知识能够支持简单的Linux使用。在本次实验过程中,我不停地查找命令资料,从基础的复制文件,到修改一些系统配置,一些博客给予了我很大的帮助,我印象很深,有一篇博客是这么说的,“指令千万条,勤练第一条”。经过本次实验,目前已经基本能够实现对Linux系统的使用,遇到问题,也知道该如何解决了。
2.1.2掌握缓冲区攻击的基本概念
信安基础课程中,我们就已经学过缓冲区溢出攻击的基本概念的,但没有掌握具体的攻击方法和原理,所谓缓冲区溢出攻击,是一种利用缓冲区溢出漏洞所进行的攻击行动。本实验实现了三种手段,分别达到不同效果如图示。
操作 | 目的 | 分析 |
---|---|---|
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数 | 运行原本不可访问的代码片段 | 我认为这样的操作更像是恶意代码,通过修改可执行文件的内容达到目的 |
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数 | 强行修改程序执行流 | 相较于注入shellcode,这样的操作只能利用本机的函数不能直接执行任意代码 |
注入一个自己制作的shellcode并运行这段shellcode | 注入运行任意代码 | 底层攻击,最为致命 |
2.1.3使用CSS和Typora完成人生的第一篇博客
虽然一年多前就开通了博客园,但始终没有写过自己的博客。
我一开始选了个挺丑的模板,实在是看不下去,然后就花了好几个小时找模板、试模板。寻找模板的过程中也看到了很多好的设计,大部分的模板都是基于HTML或者CSS的。上学期正好学了Java网站设计,虽然学的不精,但基本代码能够看懂,博客园的后台也比较简单,最终选定了这么一个模板。
开学下载课程资料的时候就发现老师的文档多为后缀为.md的文件,就下载了Typora当作阅读器,有时候思维导图做出来也可以导为md文件,我觉得Typora相较于Word更简洁,更强调结构,也省去了很多更改格式的时间。
还有一个困扰我了好一段时间的事儿,我一开始设置使用markdown格式博文后,不知道怎么加入图片(如果是在本地编辑器插入的图片,地址都是本地文件地址,一上传就失效),上网一查好像真有这么一回事(其实就两个提出这问题的),还推荐下载什么cnblogsUpload和dotnet-sdk,安装了之后还不兼容我的PNG格式截图,然后我又装回格式工厂(???)准备转格式,正一筹莫展等安装的时候,发现有一个小小的上传图标,我直接就傻了。。。。
不过还是挺麻烦的,没法实时预览加入的照片,上传过后会消除之前的文件名,刚开始做后面的部分就只能按着截图的标号上传。
PS:这个模板一开始装上总是错位,我把侧边页的CSS文件改来改去没改对,最后发现自己忘了设置不禁用原有模板了-。-,提醒各位同志,原作者的部署文档一定要仔细看,我为我自己的动手脚能力点赞
2.1.4实验感想
老师说的很对,这次的实验如果只是复制代码-运行-截图,这个实验很快就能完成。重要的还是要理解自己在做什么,我中间做错了一两次,在理解的基础上,我发现重复的时候整个操作是很流利的,而且命令行,不一定就比窗口界面更麻烦。
本次的实验确实很简单,我为什么拖到现在呢,说到底——
其实实验的视频我看了一共三遍,课前一遍,测试一遍,考前一遍,每次都想着先把手上另一份作业写完再统一找时机搞这个,就一直拖一直拖,中间找博客模板还找了好长时间,太拖延了,后面实验我会赶上的。
2.2什么是漏洞?漏洞有什么危害?
我认为计算机漏洞是一种人为的或自然产生的,从计算机和计算机网络的底层到高层,由于硬件、软件、协议等方面存在的可被人利用的缺陷。
漏洞的恶意利用可以破坏计算机系统和网络,如果不加防备和改进,漏洞将严重损害我们的信息安全。
PS:真的是俺一个字一个字打出来的
3.实验重点知识
3.1掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
指令 | 机器码 | 作用 |
---|---|---|
NOP | 0x90 | no operation,执行Nop指令只使程序计数器PC加1,同时占用一个机器周期 |
JNE | 0x75 | 若不相等则转移 |
JE | 0x74 | 零/等于 |
JMP | 0xE9 | 无条件转移 |
CMP | 0x3B | cmp(compare)指令进行比较两个操作数的大小 |
3.2掌握反汇编与十六进制编程器
反汇编指令为objdump,可以使用man objdump查看功能(help不行),主要指令如下
bjdump [-a|--archive-headers]
[-b bfdname|--target=bfdname]
[-C|--demangle[=style] ]
[-d|--disassemble]
[-D|--disassemble-all]
[-z|--disassemble-zeroes]
[-EB|-EL|--endian={big | little }]
[-f|--file-headers]
[-F|--file-offsets]
[--file-start-context]
[-g|--debugging]
[-e|--debugging-tags]
[-h|--section-headers|--headers]
[-i|--info]
[-j section|--section=section]
[-l|--line-numbers
[-m machine|--architecture=machine]
[-M options|--disassembler-options=options]
[-p|--private-headers]
[-P options|--private=options]
[-r|--reloc]
[-R|--dynamic-reloc]
[-s|--full-contents]
[-W[lLiaprmfFsoRtUuTgAckK]|
[-G|--stabs]
[-t|--syms]
[-T|--dynamic-syms]
[-x|--all-headers]
[-w|--wide]
[--start-address=address]
[--stop-address=address]
[--prefix-addresses]
[--[no-]show-raw-insn]
[--adjust-vma=offset]
[--dwarf-depth=n]
[--dwarf-start=n]
[--special-syms]
[--prefix=prefix]
[--prefix-strip=level]
[--insn-width=width]
[-V|--version]
[-H|--help]
%!xxd 进入十六进制编辑模式
%!xxd -r 切换回原模式
3.3能正确修改机器指令改变程序执行流程
即实验一的第一部分。
3.4能正确构造payload进行bof攻击
老师介绍有两种payload构造方式,主要取决于堆栈留下的空间是否充足。
PS:如果以“缓冲区注入payload”为关键词搜索,没有太多的知识博文,倒是能找到我们学院之前学生的博文2333333
3.4实验中用到的基础知识
3.4.1文件的基础操作和Vi
文件的操作是最基础的,比如重命名、复制、移动、删除等。
Vi编辑器的使用在实验楼课程中有涉及,提供了一个专门的Vi课程,当时学是学了,过一段时间就忘了,还是得勤加练习。
3.4.2程序安装与root权限
在设置共享文件夹和和使用execstack时都需要使用apt-get命令下载软件包,一开始提醒权限不够,应该是我实验0的时候设置没到位,不过我也有看到同学是直接用root用户做的实验,这里我参考的是https://www.cnblogs.com/fjzhang/p/11345099.html
3.4.3地址位置、补码计算和操作系统知识概念
大二的计算机组成原理、大三上的操作系统课程知识现在就派上用场了。
3.实验过程中遇到的问题
3.1Linux命令不够熟悉
第一次实验过程时常遇到不清楚指令的情况,我参考的是这一篇博客,内容比较全面,找到具体指令还可以再查。
3.2堆栈的概念理解得还不够透彻
之前学习数据结构的时候,没有尝试过编程实现堆栈,一直对堆栈的概念理解的不好。老师的课很细致,手绘图能够比较直接的看懂实验过程,但可能让我自己来画就画不出来了=。=
4.实验过程
4.1准备阶段
4.2直接修改程序机器指令,改变程序执行流程
第一次修改的时候大概是因为vi操作有问题,改动了其他部分,没成功,第二次就没问题了。
4.3通过构造输入参数,造成BOF攻击,改变程序执行流
使用GDB查看
使用perl写入并查看
结果:
4.4注入Shellcode并执行
第三部分的准备工作也相当重要
一开始遇到了个人用户权限不足的问题,我转至root用户修改了权限。
最后成功关闭地址随机化
注入测试
从查看进程这里我犯了两个错,一个是进程号写错了,一个是将猜测地址写入shellcode时高低位弄错了,导致第一次失败。这里先放成功的所有过程。
问题操作截图:
没有运行进程,或者是提前按下回车
attach的程序号错了,后面是做不出来的
第一次注入错误点在于把地址为末尾的AB,写入的时候应该是0xBA而不是0xAB