SECCON2018 Online予選のwriteupです

Reversing

Runme

PEファイルが渡されたのでIDAで読み込んで処理を追いかける

  1. スタックに0x22をプッシュしてsub_401034を呼び出し
  public start
  start proc near

  var_4= dword ptr -4
  push  ebp
  mov   ebp, esp
  push  esi
  call  ds:GetCommandLineA
  mov   [ebp+var_4], eax
  push  eax
  push  22h
  call  sub_401034
  ...snip
  1. スタックに0x43をプッシュしてsub_401060を呼び出し
  sub_401034 proc near

  arg_0= byte ptr 8
  arg_4= dword ptr 0ch

  push  ebp
  mov   ebp, esp
  push  esi
  movzx ecx, [ebp+arg_0]
  movzx edx, [ebp+arg_4]
  movzx edx, byte ptr [edx]
  cmp   ecx, edx
  jnz   loc_4018BB

  mov   ecx, 1
  mov   edx, [ebp+arg_4]
  inc   edx
  push  edx
  push  43h
  call  sub_401060
  ..snip
  1. スタックに0x3Aをプッシュしてsub_40108Cを呼び出し
  sub_401060 proc near

  arg_0= byte ptr 8
  arg_4= dword ptr 0ch

  push  ebp
  mov   ebp, esp
  push  esi
  movzx ecx, [ebp+arg_0]
  movzx edx, [ebp+arg_4]
  movzx edx, byte ptr [edx]
  cmp   ecx, edx
  jnz   loc_4018BB

  mov   ecx, 2
  mov   edx, [ebp+arg_4]
  inc   edx
  push  edx
  push  3Ah
  call  sub_40108C
  ..snip
  1. その後も延々とスタックに文字をプッシュし続けている様子

  1. スタックにプッシュされた文字を全部集めればフラグゲット
  #!/usr/bin/python
  arg = "22 43 3a 5c 54 65 6d 70 5c 53 45 43 43 4f 43 32 30 31 38 4f 63 6c 69 6e 65 2e 65 78 65 22 20 53 45 43 43 4f 4e 7b 52 75 6e 6e 31 6e 36 5f 50 34 37 68 7d"
  r = "".join(map(lambda x: chr(int(x, 16)), arg.split(" ")))
  print(r)

Forensic

unzip

渡されたzipを解凍してパスワード付きzipとスクリプトを取得する スクリプトはパスワード付きzipを生成する際に使われたもよう

$ cat makefile.sh
echo 'SECCON{'`cat key`'}' > flag.txt
zip -e --password=`perl -e "print time()"` flag.zip flag.txt

perlのtime()関数は実行されたその時のエポックタイムを返す flag.zipのタイムスタンプをエポックタイムに変換すれば良い

$ ls --full flag.zip
-rw-r--r--. 1 root root 225 2018-10-27 00:10:41.000000000 +0900 flag.zip

出力されたエポックタイムをパスワードに指定してflag.txtを解凍すればフラグゲット

#!/usr/bin/python3.6
from datetime import *
r = datetime(2018, 10, 27, 00, 10, 41).timestamp()
print(int(r))