(作者:Pizza)
delphi程序内置webbroswer, 通过工具获取网页html代码.
<HTML>
<HEAD>
<SCRIPT>
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;
}
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, {}))
</SCRIPT>
</HEAD>
<BODY style="OVERFLOW: hidden; BORDER-TOP: 0px; BORDER-RIGHT: 0px; BORDER-BOTTOM: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; BORDER-LEFT: 0px; PADDING-RIGHT: 0px"
scroll=no>
CTF 2019?
<CENTER>
<BR>
<BR>
<BR>
<INPUT id=pswd size=39>
</INPUT>
<BR>
<BR>
<BR>
<INPUT onclick=ckpswd(); type=button value=checkMyFlag>
</CENTER>
</BODY>
</HTML>
eval
执行后得到
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";
}
}
当输入以simpower91
为开头时, 以剩余部分为参数调用sptWBCallback
.
查阅资料得知sptWBCallback
用于程序与网页交互.
3.2、让其中的元素执行webbrowser之外的delphi代码
本来,这有很复杂的解决办法,但那部分属于ATL的知识比较难掌握,因此绕了一下:
让那些需要执行delphi的HTML元素,调用一个函数叫做triggerExEvent,参数是HTML元素的名称,然后是若干参数。
triggerExEvent是javascript函数,有不确定个参数,但第一个肯定是表示元素的名称。 triggerExEvent将参数组成字符串,然后前面冠以"#OnTriggerExEvent:",作为url,然后导航。
在webbrowser的onNavigator2事件里,判断url中是否包含"#OnTriggerExEvent:",如果包含怎作如下处理:
a、cancel这次导航;
b、将"#OnTriggerExEvent:"之后的信息截取,作为参数传递给webbrowser的新增一个事件OnTriggerExEvent事件,其参数有两个:1、控件名称;2、一个字符串参数。
这样,用户可以在OnTriggerExEvent事件里处理HTML的点击等事件了
例如,我为webbrowser派生新类,叫做webbrowserEx,它有一个事件叫做OnTriggerExEvent
有个js文件包含这样的函数:
function triggerExEvent(cmpnt_id,event_nm,optionstr)
{
url='#triggerExEvent:id=';
url=url+cmpnt_id+';eventnm='+event_nm;
if(optionstr) url=url+';params=optionstr';
location=url;
}
搜索字符串#sptWBCallback:
定位到sub_492088
, 程序解析出参数后下访问断点跟踪跟进了虚拟机. 算法大概是
map(lambda x:(ord(x)+0x7F) & 0xFF, data) == [0xe0, 0xb0, 0xb1, 0xb2]
flag:simpower91a123
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法