虽然没有做出来,也阻止不了我来分享。
看了其他几位大牛的writeup,很多反调试手段并没有特别指明。
可以参考风间仁的writeup,对反调试处理过程较为详细。http://bbs.pediy.com/thread-218241.htm
这道程序是使用VB语言写的,然后作者使用手工汇编对程序增加了几个反调试的处理。所幸的是只是做了VB程序入口前的反调试。
第一个反调试,修改程序入口,
作者将程序入口修改为0x0,意味着在程序入口(EIP)在基址0x00400000处,在0x00400000处的汇编指令发现会跳转到0x00401090。
HEADER:00400000 dec ebp
HEADER:00400001 pop edx
HEADER:00400002 push edx
HEADER:00400003 inc ebp
HEADER:00400004 push 401090h
HEADER:00400009 retn
第二个反调试(不太合适),VB程序入口变形
VB程序的入口就是将程序控制权交给MSVBxx.dll,这个入口就是ThunRTMain。而在到达这个入口前,作者大量使用push +retn指令,使用非正常手段来控制程序流程。
第三个反调试 堆栈段寄存器
从.text:00408EC0 开始,利用pop SS + pushf + pop edi,判断TF标志,进行流程控制。
具体解释可以搜索加粗关键字
第四个反调试 OEP 程序入口
004088F4 B8 26FFBFFF mov eax, FFBFFF26
00408908 F7D0 not eax
00408911 8B00 mov eax, dword ptr [eax]
004088DF A3 E5884000 mov dword ptr [4088E5], eax
004088E4 /E9 57000000 jmp 00408940
mov eax, dword ptr [eax],恰好是程序入口的第二个字节,如果没有修改程序入口地址,那么 eax=0,否则是10H,
再通过mov [4088E5],eax 隐秘地修改跳转指令的偏移。
第五个反调试 IsDebuggerPresent
这个比较常见,不叙述了
第六个反调试 修改VB程序的指令
我想说,这个无语。修改了三个加法指令,并互调两个VB全局变量
做完题目后,我萌生了一个想法,对这个程序脱壳,还原它的本来面目。
VB程序的入口在 jmp ThunRTMain,在到达这个入口前,程序已经被还原成了作者未加壳前的样子。
可以对程序进行patch,修改jmp ThunRTMain,为
.text:00401088 loc_401088: ; CODE XREF: .text:loc_401088j
.text:00401088 jmp short loc_401088
对应指令为 0EBH 0FEH。当启动程序时,便会卡在这里。
然后使用OD加载,然后在dump,最后修改OEP为0x00001090,再还原修改的指令为jump ThunRTMain
完毕,可以流畅运行。
最后使用VB decompiler逆向出算法。(from 风间仁)
2 3 4 5 6 7 8 | c=1711722997.0
条件1:
sqrt ((c+a+b)*(c+a-b)*(c+b-a)*(a+b-c))*0.5/(c+a+b) =373414231.362502
条件2:
(c*a*b)/ sqrt ((c+a+b)*(c+(a)-b)*(c+(b)-a)*(a+(b)-c)) =874402299.931726
|
三种解题思路
第一种使用matlab等数学软件,是最快的办法(不算安装软件的话)。
第二种发现这两个分别是内切圆和外切圆公式。
最后一种就是枚举。
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。