-
-
[原创]第3题 影分身之术 Writeup
-
2019-3-16 19:23
5431
-
这是一个Win32逆向,用Delphi写的
里面似乎实现了一个浏览器?
ckpswd()函数是用Js写的
提取获得一段Js
eval(
function(p,a,c,k,e,d) {
e = function(c){
return(
c<a ? '' : e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))
};
if(!''.replace(/^/,String))
{
while(c--)
d[e(c)]=k[c]||e(c);
k = [
function(e){
return d[e]
}
];
e = function(){
return'\\w+'
};
c = 1
};
while(c--)
if(k[c])
p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);
return p
}('a 6() { f="n"; 3 = 8.5.l.q; c (3.d(f) ==0) { g=3.h; b=f.h; o(3.p(b,g)); } 9 { 4("r!<" + 3 + "> e j i 2 ;-)"); m "1"; }}a k(){ 4("7!");}',62,28,'|1234|GUID|a|alert|all|ckpswd|congratulations|document|else|function|i|if|indexOf|is|key|l|length|my|not|ok|pswd|return|simpower91|sptWBCallback|substring|value|wrong'.split('|'),0,{}))
运行得到
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!");
}
得到Flag第一段是simpower91
再找sptWBCallback函数
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;
}
发现处理这个的函数在492088
校验了第二段的长度是否为4
然后似乎进了一个VM,这个VM跑的是真·X86指令,而且是跑一句跳一下,类似ROP的感觉
可以动态调试把字节码拿出来
add eax, 7fh
....
xor edx, edx
....
cmp eax, edx
可以看到是把每一个EAX的值加上0x7F,清空了edx,在VM之外载入了edx的值,然后和eax比较
通过调试,取出各个EDX的值,计算得到最后4位为
a123
最终的Flag即为
simpower91a123
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界