-
-
[原创]【2019看雪CTF】Q1赛季 第三题影分身之术 WP
-
2019-3-23 13:07
5273
-
[原创]【2019看雪CTF】Q1赛季 第三题影分身之术 WP
【2019看雪CTF】Q1赛季 第三题影分身之术 WP
本题是delphi写的程序。试运行了下,发现有些似曾相识的感觉。后想起去年也出了个有很多地方类似的题,看了下作者是同一人,想来是去年的增强版。
这次题目分两部分,一部分还是web页面及js代码,第二部分是编码后的代码逐步解码并执行,应该算是一种VM吧。
第一部分页面代码及脚本代码如下(部分是解后的代码):
<center>
<br><br><br>
<input value="" id="pswd" size=39></input>
<br><br><br>
<input type=button value="checkMyFlag" onclick="ckpswd();">
</center>
function sptWBCallback(spt_wb_id,spt_wb_name,optionstr){
url='#sptWBCallback:id=';
url=url+spt_wb_id+';eventName='+spt_wb_name;
if(optionstr) url=url+';params=optionstr';
location=url;
}
function ckpswd() {
key="simpower91";
a = document.all.pswd.value;
if (a.indexOf(key) ==0) {
l=a.length;
i=key.length;
sptWBCallback(a.substring(i,l)); }
else {
alert("wrong!<" + a + "> is not my GUID ;-)");
return "1234"; }}
function ok(){ alert("congratulations!");}
从上面的脚本代码能看出,输入的前10字节为simpower91
,后面的输入通过#sptWBCallback:id=xxxxx;eventName=xxxxx;params=optionstr
这种形式的“url”参数id传回应用。
在0x492088
处的函数解析url参数,然后调用493F70
处函数。
493F70
函数先检查了传入的输入长度是否为4:
CODE:00493FB5 call unknown_libname_60 ; get length
CODE:00493FBA cmp eax, 4
然后检查data.txt
是否存在(这个应该是测试时带的功能),如果存在就读取内容作为VM代码解析执行;不存在就读取文件结尾的VM代码解析执行。
VM代码解析执行前先解码,解码比较简单,就是按字节取反或与0xff
异或。4734B0
应该是VM相关处理的入口。VM代码分为两种,一种是需要handler处理的,一种是直接的机器码,示例如下:
0000032C aOrign_5 db 'orign'
seg000:00000331 ; ---------------------------------------------------------------------------
seg000:00000331 add eax, 7Fh
seg000:00000334 xor edx, edx
seg000:00000334 ; ---------------------------------------------------------------------------
seg000:00000336 aSimvm_7 db 'simvm'
seg000:0000033B db 1
seg000:0000033C db 0
seg000:0000033D db 5
seg000:0000033E db 0
seg000:0000033F db 0
seg000:00000340 db 0F0h
VM的解析并写机器码在472EAC
中实现,中间竟然还出现了相应汇编字串。
这个VM当时没完全看明白,但是校验算法可以看出来是传入参数按字节加0x7f后与常量比较,可在4734F1
处下断跟踪。得到后4字节为a123
。
最终flag为simpower91a123
。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法