-
-
[原创]看雪CTF.TSRC 2018 第十题 侠义双雄 WP
-
发表于:
2018-12-21 10:47
7754
-
[原创]看雪CTF.TSRC 2018 第十题 侠义双雄 WP
先看一眼界面:
于是查PEiD,发现是Delphi编译的,直接用DeDe找到窗口过程:
其中 Button1Click 函数响应的是右上角的关闭按钮,就把目光转到了 Button2Click 函数上。但无奈调试时发现在 Button2Click 中的断点一直没有断到过,只能再看看 FormCreate 和 FormShow 中有没有猫腻了。在 FormShow 中发现了如下代码信息:
哈哈,竟然用HTML画界面,用vbscript弹窗口,那验证代码肯定在ckpswd()
中了!
毫无疑问,ckpswd()
函数肯定是js代码了,而且根据上面的HTML代码来看,中间部分数据是加密的,那他肯定要解密这段数据交给HTML解析函数去处理,这时候直接观察这段数据解密过程(我直接F9运行起来后内存搜索了),最终发现解密完后的HTML代码如下:
发现解密出的js代码还有一次解密操作,于是解密最终的js代码:
发现Key:kanxueCTF2018bySimpower91
,这个key竟然在最终cklswd()代码解密之前就存在了(震惊)!
直接用内存搜索的方法找到了解密后的js代码,感觉有些过意不去啊,作者的解密逻辑都没有分析,回头来看看作者是怎么解密的吧。
用IDR导出分析后的Map文件,使用开源的IDA插件 ida-pro-loadmap 导入MAP文件,这样就可以识别这些库函数了(插件在库函数头的注释中写上了函数名,就方便手动修改函数名了),修好函数名了再用IDA导出MAP文件给OD使用:
看下部分代码:
这代码逻辑肯定是作者构造的,于是开始调试分析。
重点在sub_467ACC -> sub_467878 -> sub_46750C -> sub_467938
中,sub_467878
函数结尾为jmp [esp-4+var_3C]
,sub_46750C
中有一句call dword ptr [ebx+1030h]
,sub_467938
中有一句call dword ptr [ebx+1060h]
,这些都是疑点。
调试后发现作者在利用栈来布局数据和ShellCode,而作者对栈的使用也是比较夸张的,直接承包了整个栈空间:
sub_467938
中call dword ptr [ebx+1060h]
是进入函数sub_467974
,而该函数会根据 4691AF 位置的数据解密出如下ShellCode,这段ShellCode会作为sub_46750C
中call dword ptr [ebx+1030h]
的参数:
sub_46750C
中call dword ptr [ebx+1030h]
是执行在堆中释放的代码:
sub_467878
函数结尾的jmp [esp-4+var_3C]
是跳转执行一句代码再返回到指定位置,这句代码就是上面解密出的ShellCode中的,例如:
时间问题,没有调完,有空以后再填坑吧。直接写出目前我调试后发现的代码逻辑吧:
目前不能下结论,由于作者忽略了HTML代码在内存中很容易搜到的问题,导致题目很快被破解了,不然完整分析解密过程还是需要比较长的时间~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2018-12-21 10:51
被KevinsBobo编辑
,原因: