0Day安全软件漏洞分析第2版阅读随笔3

0Day安全软件漏洞分析第2版阅读随笔3

开启第三章的阅读

第三章-开发shellcode的艺术

shellcode这个专用术语来通称缓冲区溢出攻击中植入进程的代码。这 段代码可以是出于恶作剧目的的弹出一个消息框,也可以是出于攻击目的的删改重要文件、窃取 数据、上传木马病毒并运行,甚至是出于破坏目的的格式化硬盘等。请注意本章讨论的shellcode是这种广义上的植入进程的代码,而不是狭义上的仅仅用来获得 shell的代码。

​ 我们还会经常看到另一个术语——exploit。 植入代码之前需要做大量的调试工作,例如,弄清楚程序有几个输入点,这些输入将最终 会当作哪个函数的第几个参数读入到内存的哪一个区域,哪一个输入会造成栈溢出,在复制到栈区的时候对这些数据有没有额外的限制等。调试之后还要计算函数返回地址距离缓冲区的偏 移并淹没之,选择指令的地址,最终制作出一个有攻击效果的“承载”着shellcode的输入字符 串。这个代码植入的过程就是漏洞利用,也就是exploitexploit一般以一段代码的形式出现,用于生成攻击性的网络数据包或者其他形式的攻击性 输入。expliot的核心是淹没返回地址,劫持进程的控制权,之后跳转去执行shellcode。与shellcode具有一定的通用性不同,exploit往往是针对特定漏洞而言的。

比如我们在第二章里写的代码:

开发shellcode需要解决的问题

​ 通过上面的介绍,你应该已经明白了什么是shellcode,正是我们在第二章植入的那段机器码。在第二章的植入代码部分,我们是通过手动查找得到函数调用的地址以及函数返回地址,这显然不是通用的。加之,当存在缺陷的函数处于ddl中,并且被程序动态装载,地址每次都存在变化,这时就需要我们找到一种方式,使得能够自动定位到shellcode的地址。

定位shellcode

栈帧移位与jmp esp

关于栈帧移位,笔者在这里不太了解实际的过程,暂且记下,现在只关注如何动态定位。

​ 通过前两章的调试,我们其实已经很清楚指令执行和栈变化的过程,可以发现的是,每次函数调用完成之前,都会将之前减去的栈偏移加回来,所以我们可以发现,此时esp(64位下rsp)寄存器的内容正好在我们的返回地址的下一个位置,注意这里指的是栈上返回地址对应的地方,esp是栈帧指针。

​ 所以动态定位不就可以实现了,我们在系统找到一个jmp rsp指令的地址,然后在返回地址处填上这个地址,那么之后就会执行这个指令跳转到当前rsp存放的地址,也就是栈上淹没返回地址处后一个位置shellcode就在这之后执行。

所以重新的规划大概如下图:

x64dbg如何搜索跳板指令位置

笔者之前已经提到,我是在64位机器上进行的操作,所以只能采用x64dbg,没有使用书里的OD,暂时没有找到什么好用的插件可以之间定位到我们需要的dll库中的跳板位置,所以这里我采用原始的搜索方式。

直接右键搜索命令:jmp rsp

这里我就直接采用了第一个地址00007FFC81014A53,在内存布局中找到,确认是系统模块

crack_me5

程序和crack_me4是一样的,只是我们要改变我们的劫持流程。

首先我们已经获取到了跳板地址,在上面,由于是系统模块,所以一般还是不会变的。然后找到MessageBoxA函数的地址,采用读书笔记2的方法。

可以发现这次的地址改变了,说明确实是动态加载的,所以这里应该有个疑问MessageBoxA的地址怎么动态获取,笔者在这里还不知道具体的解决方案。查到是00007FFC8361A000,查到ExitProcess函数的地址为00007FFC82DEE3B0

下面制作我们所说的exploit:在之前的基础上加入了退出调用

1
3132333435363738313233343536373831323334353637383132333435363738313233343536373831323334353637383132333435363738534A0181FC7F11114883EC4833DB5348B82165723068737833508BC45350505348B8A06183FC7F11111148C1E01848C1E810FFD04883C44848B8B0E3DE82FC7F111148C1E01048C1E810FFD04883C448

然后进行调试过程:

我们在strcpy函数调用之后那个地方打断点,直接运行到那个地方,这里因为防止截断,我将64位中的0换为了1,然后在此时修改栈上的数据,目前没有找到更好的解决办法

已经跳转到了我们的跳板地址

这里参考读书笔记2,修改一下在栈上的执行权限,继续步进

可以发现已经如我们分析的那样,跳转回到了我们布置好的shellcode

正常跳转到弹窗函数:

可以发现已经跳到退出函数的地方

然后就可以正常退出了,虽然不知道为何不能弹窗。唉