首页
社区
课程
招聘
[原创]【2019看雪CTF】Q1赛季 第三题影分身之术 WP
2019-3-23 13:07 5273

[原创]【2019看雪CTF】Q1赛季 第三题影分身之术 WP

2019-3-23 13:07
5273

【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虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 236
活跃值: (10)
能力值: ( LV3,RANK:23 )
在线值:
发帖
回帖
粉丝
汪a 2019-3-25 19:07
2
0
看了几个解析,楼主这个是说的最清晰的了。
雪    币: 2428
活跃值: (159)
能力值: ( LV11,RANK:198 )
在线值:
发帖
回帖
粉丝
simpower 2019-3-27 09:45
3
0
下次还会增强哦,本系列题目将会不断进化,欢迎再来
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
poyoten 22 2019-3-27 12:27
4
0
simpower 下次还会增强哦,本系列题目将会不断进化,欢迎再来[em_1]
期待
游客
登录 | 注册 方可回帖
返回