学习笔记记录~括弧:感觉不会用md,附件更清晰一点……
核心是0x7C93CD24行代码,检查al是否等于1,如果等于1则执行关闭DEP的流程。
1、使用OD插件OllyFindddr DEP->Disable DEP <= XP SP3查找命令:2、仍按上述操作通过step2找到mov al,1指令:为避免地址截断,我们选择0x7C80C1903、写好程序,用OD调试,观察:
4、搜索字符串,在‘ok’处下断点,单步运行,程序正常跳转到0x7C80C190处5、单步继续,来到LdrpCheckNXCompatibility函数里面6、但程序没执行几步,就发生了异常。这是因为执行到0x7c95f70e处mov dword ptr ss:[ebp-0x4],esi 时,ebp为0x90909090,因为写入异常。
要解决这个异常需要调整ebp的值
问题:如何使ebp指向一个能够写入的位置呢?这个位置怎么找呢?答案:通过Push esp POP ebp retn指令将EBP定位到一个可写的位置(和ESP相同的位置)1、使用OllyFindAddr插件,在Disable DEP <= XP SP3搜索结果的setp3查看符合条件的指令,这里我们选第二个0x5D1D8B85(RET 4指返回之后ESP-8)2、于是修改代码:
OD载入运行3、接着跳转到LdrpCheckNXCompatibility函数里面,0x7C95F70E没有报错4、继续单步,执行ZwSetInformationAddress函数5、继续单步,发现返回地址变成了0x4!这是怎么回事?
观察,执行ZwSetInformationAddress函数之前之后这说明因为执行这个函数,导致了shellcode被覆盖。Shellcode覆盖不要紧,大不了不执行嘛,但是LdrpCheckNXCompatibility的返回地址也被覆盖了!这就导致出错!
##提问2:为什么会被覆盖呢?因为shellcode距离ESP太近了,导致栈操作时,shellcode被覆盖!因此,增大栈空间!抬高ESP的值。
提问:如何抬高ESP的值?答案:通过RET + N操作(retn之后,ESP+N)1、通过OllyFindAddr插件中的Overflow return address -> POP RETN+N选项查找相关指令作者建议Number of pop =1 Number of ret = 0x28在搜索过程中,选取指令要求不能对ESP和EBP操作,否则将失去对程序的控制权。这里我们选择0x7C974A19
2、OD载入,此时ESP=0x0012FF34单步,发现ESP变成了0x0012FF3C,相差了8个字节!why?这是因为执行retn ESP-4 , 但指令是retn 0x4,因此ESP-8,因此执行完retn 0x28之后的返回地址在0x0012FF3C处!单步,果然!因此在调整ESP大小时要留出4B的大小,3、更改shellcode
OD载入单步,果然成功了!4、观察调用ZwSetInformationAddress函数前后,shellcode有没有被覆盖调用之前:调用之后:没有被覆盖!单步继续,执行完LdrpCheckNXCompatibility后,程序返回到0x41414141了!
因为leave指令= mov esp,ebp pop ebp
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
Editor 希望能直接将文章内容放到帖子里