众所周知,通常在进入一个CALL (函数) 时候会把下一条指令的地址压入 esp 寄存器中,后面随着各种指令的执行 esp 也会发生变化,例如(pushad,popad,push,pop )等指令堆栈都会发生改变,而 esp 中存放着栈顶的的地址当然也会跟着变化,知道遇到 retn 指令时候 [esp] 的值为返回地址,这就是我们常说的堆栈平衡。 (以上内容纯属个人理解,如有错误还请多多指正。) 可以看到上图 [esp+0x24] 为第一层返回地址 [esp+0x48] 为第二层返回地址,当我们调用功能 CALL 的时候,这些返回地址肯定会发生变化。
https://bbs.pediy.com/thread-190668.htm这里有资料 @ 机械瞑衍 牛讲的很清晰.透彻.
https://bbs.pediy.com/thread-190668.htm
这里有资料 @ 机械瞑衍 牛讲的很清晰.透彻.
这个很简单,无非就是拿现在的返回地址跟原始的返回地址做比较就好。
重新挂上INT3还原HOOK
这里给小白科普一下,大牛请无视:
TF(bit 8) [Trap flag] 将该位设置为1以允许单步调试模式,清零则禁用该模式。TF位为单步调试,可用于简单的反调试及实现我们的重新挂钩上INT3,单步调试指令执行后TF位自动置0. 无需恢复
TF(bit 8) [Trap flag] 将该位设置为1以允许单步调试模式,清零则禁用该模式。
感觉这段时间对VEH的学习让我对调试体系有了一些基础的认识,另外也可以使用硬件断点来检测CALL调用是否合法,原理也一样的,还可以不用恢复INT3模拟被HOOK了的指令 "esp - =4;[esp]=edi"可以模拟 push edi 另外小菜我想实现对阳光值写入的监控 判断写入的地址是否和合法地址时候遇到梗了,VirtualProtect()函数的第二个参数Size无论如何设置它改变的都是一个页的属性 我设置一个定时器循环写入不可写属性然后异常接管里面判断异常发生的地址,但无论如何我自己都不会判断它写入异常的地址是否为阳光地址 只有解析IA-32指令这种方法吗?小菜我只想的出来这种方法但无论如何功力都差了写火候。求各位赐教! 各位元旦快乐! 2018.1.1 Aperodry
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
机械瞑衍 竟然提到了我 混个脸熟吧 哈哈~