UMDCTF 2022 - Writeup
金, 04 3月 2022, 23:00 UTC — 日, 06 3月 2022, 23:00 UTCに開催されたUMDCTF 2022 に会社のチームで参加した。 他のチームメンバーの陰で2問だけ解いたので、以下にWriteupを記載する。
Forensic
Renzik's Case
My friend deleted important documents off of my flash drive, can you help me find them? Renziks_Case.zip Author: matlac
添付ファイルはUSBのイメージファイル。
普通に認識できる状態のためFTKImagerで読みだしてみる。
ゴミ箱の中にflagの記載された画像がある。
flag : UMDCTF-{Sn00p1N9_L1K3_4_Sl317h!}
Reverse
tiny
Scan for free crypto currency! tiny.png Author: matlac
添付のQRコードをParseするとBase64エンコードされたXZファイルが取得できる。
XZファイルを解凍するとELFファイル(MISP形式)が得られる。
得られたelfファイルをghidraでdecompileするとmain関数で以下の処理を実施している。
① main関数
undefined4 main(void) { FUN_00400834(0); FUN_00400974(0); return 0; }
②FUN_00400834
undefined4 FUN_00400834(uint uParm1) { uint uStack36; undefined4 uStack32; undefined4 uStack28; undefined4 uStack24; undefined4 uStack20; undefined2 uStack16; int iStack12; iStack12 = __stack_chk_guard; uStack32 = 0x756c6660; uStack28 = 0x70637d6f; uStack24 = 0x3b705566; uStack20 = 0x3c60513e; uStack16 = 0x7d4e; if ((uParm1 & 0x1fffffff) == 0) { puts("lol no"); } else { uStack36 = 0; while ((int)uStack36 < 0x12) { putchar((int)*(char *)((int)&uStack32 + uStack36) ^ uStack36); uStack36 = uStack36 + 1; }
⇒上記のuStack32とuStack28とuStack24とuStack20とuStack16部分については格納された値とindex番号をXORする処理を0x0~0x11(=18)回実施している。
>>> chr(0x75^0x0) 'u' >>> chr(0x6c^0x1) 'm' >>> chr(0x66^0x2) 'd' >>> chr(0x60^0x3) 'c' >>> chr(0x70^0x4) 't' >>> chr(0x63^0x5) 'f' >>> chr(0x7d^0x6) '{' >>> chr(0x6f^0x7) 'h' >>> chr(0x3b^0x8) '3' >>> chr(0x70^0x9) 'y' >>> chr(0x55^0xa) '_' >>> chr(0x66^0xb) 'm' >>> chr(0x3c^0xc) '0' >>> chr(0x60^0xd) 'm' >>> chr(0x51^0xe) '_' >>> chr(0x3e^0xf) '1' >>> chr(0x7d^0x10) 'm' >>> chr(0x4e^0x11) '_'
③FUN_00400974
undefined4 FUN_00400974(int iParm1) { int iStack68; int aiStack64 [13]; int iStack12; iStack12 = __stack_chk_guard; memcpy(aiStack64,&DAT_00400c94,0x34); if (iParm1 == 0) { puts("lol no"); } else { iStack68 = 0; while (iStack68 < 0xd) { putchar(aiStack64[iStack68] >> 2 ^ 2); iStack68 = iStack68 + 1; } } if (iStack12 == __stack_chk_guard) { return 0; } /* WARNING: Subroutine does not return */ __stack_chk_fail(); }
⇒&DAT_00400c94に設定したデータを配列型としてaiStack64に渡している。
&DAT_00400c94
00400c94 00 ?? 00h 00400c95 00 ?? 00h 00400c96 00 ?? 00h 00400c97 ca ?? CAh 00400c98 00 ?? 00h 00400c99 00 ?? 00h 00400c9a 01 ?? 01h 00400c9b b2 ?? B2h 00400c9c 00 ?? 00h 00400c9d 00 ?? 00h 00400c9e 01 ?? 01h 00400c9f 76 ?? 76h v 00400ca0 00 ?? 00h 00400ca1 00 ?? 00h 00400ca2 01 ?? 01h 00400ca3 da ?? DAh 00400ca4 00 ?? 00h 00400ca5 00 ?? 00h 00400ca6 01 ?? 01h 00400ca7 aa ?? AAh 00400ca8 00 ?? 00h 00400ca9 00 ?? 00h 00400caa 00 ?? 00h 00400cab c6 ?? C6h 00400cac 00 ?? 00h 00400cad 00 ?? 00h 00400cae 01 ?? 01h 00400caf 76 ?? 76h v 00400cb0 00 ?? 00h 00400cb1 00 ?? 00h 00400cb2 01 ?? 01h 00400cb3 c2 ?? C2h 00400cb4 00 ?? 00h 00400cb5 00 ?? 00h 00400cb6 01 ?? 01h 00400cb7 0a ?? 0Ah 00400cb8 00 ?? 00h 00400cb9 00 ?? 00h 00400cba 01 ?? 01h 00400cbb 9a ?? 9Ah 00400cbc 00 ?? 00h 00400cbd 00 ?? 00h 00400cbe 00 ?? 00h 00400cbf ce ?? CEh 00400cc0 00 ?? 00h 00400cc1 00 ?? 00h 00400cc2 01 ?? 01h 00400cc3 b6 ?? B6h 00400cc4 00 ?? 00h 00400cc5 00 ?? 00h 00400cc6 01 ?? 01h 00400cc7 fe ?? FEh
aiStack64にstackした値を4バイト毎に2bit右シフトして2でxorする。
>>> chr(0x00CA>>2^2) '0' >>> chr(0x01B2>>2^2) 'n' >>> chr(0x0176>>2^2) '_' >>> chr(0x01DA>>2^2) 't' >>> chr(0x01AA>>2^2) 'h' >>> chr(0x00C6>>2^2) '3' >>> chr(0x0176>>2^2) '_' >>> chr(0x01C2>>2^2) 'r' >>> chr(0x010A>>2^2) '@' >>> chr(0x019A>>2^2) 'd' >>> chr(0x00CE>>2^2) '1' >>> chr(0x01B6>>2^2) 'o' >>> chr(0x01FE>>2^2) '}
②と③を合わせたものがflagになる。
flag : umdctf{h3y_m0m_1m_0n_th3_r@d1o}
感想
・jdata
のzipファイル形式で作成されたelfファイルの仕組みを気付けなくて悔しい。
・CompTIA Security+
:5月取得 ⇒ CISSP
:10月取得目指して頑張るノシ!!୧(๑›◡‹ ๑)୨
・In these times, I'm against the war anyway, so I'll donate !!