个人感觉从这一节真的学到了很多,比如如何在OD中寻找一些对应函数中指令的位置,如果查找某些寄存器的值等,下面将我的学习心得贴出来,内容完全由本人一字一句手敲出来,转载请注明出处。
主要是结合OD调试来说明如何寻找各个关键点的位置,计算距离等问题。
注意:找位置计算距离等时将shellcode定义为8个\x90即可
1.首先要知道.data中cookies的位置,OD加载PE文件,在反汇编窗口根据关键字查找,因为要找cookies,也就是程序最开始定义security cookies的位置,应该是在test函数进去后开始的地方,所以找两个关键字锁定:
MOV EAX,DWORD PTR DS:[_security_cookies] 通过该句,我们知道,这个就是将cookies的值放入eax寄存器中,所以,通过中间一列的十六进制可以得知在.data中cookies的位置是:
00403000(反着的,注意),
那么,这三句就是对应的产生cookies的代码了:
注意此时的EBP的值(通过寄存器区可以看到):
2.寻找malloc产生的内存的首地址,这个也很好找,因为在反汇编的命令中就含有malloc这个关键字,我们要找首地址,就是要找当这个函数执行后的eax的寄存器内容:
我们单步调试将这句执行后,观察寄存器EAX的内容:
那么,通过这两个参数,我们就知道要将test的i设置成多少了。
3.寻找栈中的cookies的位置,这个依然还是要查找关键字,既然到了栈中了,那么肯定就是最后函数返回前的cookies的检查这一步,那么关键字应该是security_cookies_check,注意观察,找到了这个CALL这个函数这一步:
注意不要把位置弄错了,我们只要看调用这里,不要看这个验证函数的里面的内容,因为下面也有个security-check-cookies关键字,但是那是函数里面了,同时,我们可以通过,MOV,XOR,CALL这三个指令得知这里是反向进行上面第一步中的产生cookies的操作,好的,现在我们直接点一下上面的MOV指令,然后按f4,让程序运行到这里:
因为这一步就是从栈中取出security-cookies,然后再与EBP进行异或,然后再去与.data中的cookies进行比较,一致的话说明就没有问题,而且也就可以肯定这个栈中的0012FF60就是我们要找的在栈中存放cookies的位置。
但是呢,在调试过程中有一个问题,因为我们只为shellcode赋值为8个90,显然我们没有精心构造数据,所以如果这个时候去校验cookies是肯定不对的,而且00403000这个时候是四个90(我们shellcode的最开始4个字节的内容),但是呢,我们可以通过自己记录原先的00403000和ebp的内容,来看这两个异或后的结果和我们现在栈中的cookies的值是否与我们栈中的这个值一致,一致也就能说明现在0012FF60这个地方就是栈中放cookies的地方。
具体方法呢,就是我们重新在OD下载入程序,分别鼠标执行(F4)两个地方,第一个地方就是我们上面1中的那个地方
第二个地方就是刚才第3步这个地方:
那么计算C1DA8E87 XOR 0012FF64 = C1C871E3,ok验证成功。
4.寻找dest的首地址,其实当我们执行完(到)第3步时,也就是test函数的内容已经执行完了,那么8个90已经复制到了dest中了,通过查看右下角栈区,我们很容易找到8个90所在的位置,那么这个地方就是dest了:
显然dest的首地址就是0012FF94
5.最后我们来看一看test函数的返回地址,这个地址实际上需要通过OD提供的注释来查找,当我们完成到第3步的验证时,这个时候大概函数也就快要返回了,那么我们在栈区中看一下:
注意观察栈区的0012FF68这一行的注释里面写着这样一句:
很显然,这里就是存放的函数的返回地址。
6.我们注意到典型的栈中的结构布局:
在security cookies后面还有一个4字节的EBP,然后才到返回地址(这个地方我们要放我们的shellcode,也就是DEST的起始地址的)。
7.计算。
栈中的security cookies位于:0012ff60
Dest(相当于BUFF)位于:0012fe94
他们之间相隔:0012ff60 - 0012fe94 = CC(204)
而shellcode最开始4个字节的内容是要给00403000的,那么剩下的shellcode还有200个字节,用于弹窗的shellcode是168个字节,那么还剩32个字节,所以从shellcode弹窗后的32个字节全部放\x90,接着放我们计算好的security cookies(4个\x90与EBP异或后的结果),接着放4个\x90掩盖EBP,接着放dest的首地址0012fe94,这就是shellcode的布局。
基本上就是这样了,主要是自己的一个学习总结,转载请注明出处以及联系方式:xujiaphp@gmail.com