Midnight Monologues

日々勉強したことを書いてきます

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

tiny.png



添付の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 !!