-
-
[原创] KCTF 2019 Q1 第三题 以数据为中心
-
2019-3-23 22:57
9038
-
[原创] KCTF 2019 Q1 第三题 以数据为中心
0x01
Script 提示,直接搜内存 "is not my GUID",得到如下内容,
可见simpower91为key的前半部分
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!");
}
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;
}
0x02 通过下述敏感字符信息,可以直接定位到location=url最终响应的函数位置 Hi_callback_sub_492088
其中将提取param,eventName,id信息作为参数传递给 函数 493f70
而其中id就是我们key的剩余部分
0x03 在493f70函数中,其通过加载data.txt或直接从自身提取0x3D8长度的内容 ,解密得到虚拟执行代码
在众多代码中,我们关注一个内存拷贝函数,其将edx地址处ECX大小的字节复制到eax地址处
0x04 我们主要在下述两个地方下断点
(1) 47300F处,这个地方主要用来复制编译后的指令
(2) 47326D处,此处已经完成(1)中指令迁移和初始化动作,也可以看到编译的是什么指令
这时候我们需要在(1)处断点的eax(如A5041处下断点)
(3) 此时,会在(1)处的eax地址处断下,可知道,此时的eax是我们的id[0]='a'
(4)此时,我们应该取消(1)处eax的断点(以防数据后面汇编出错)
上面(1)(2)(3)(4)实际就是编译执行的过程,如此多次,我们会捕捉到简单的校验逻辑
结拜就是 id[i] + 0x7F 然后与 edx寄存器值比较,如果不等就失败,所以我们捕捉cmp eax,edx指令时edx的值,
然后将断点时捕捉到的值-0x7f,再拼凑一起就可以得到我们key的后面部分id的值
我依次捕捉到 0xE0 0xB0 0xB1 0xB2,所以得到a123
即最后key为
simpower91a123
是由硬件断点追踪id的值的使用来确定上述四个断点,前期也需要对模拟执行器的寄存器布局由一定的分析,如知道+107C常为id+0x7F编译执行结果返回地。
id长度由下面逻辑确定为4各字节
000A5040 | 33 D2 | xor edx,edx | edx:"33D2"
000A5042 | 68 84 3A 47 00 | push crackme2019d7.473A84 |
000A5047 | C3 | ret |
000A5030
000A5030 | 3B C2 | cmp eax,edx | edx:"3BC2"
000A5032 | 68 84 3A 47 00 | push crackme2019d7.473A84 |
000A5037 | C3 | ret |
000A503E | 75 52 | jne A5092 |
000A5040 | 68 84 3A 47 00 | push crackme2019d7.473A84 |
000A5045 | C3 | ret |
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。