SECCON2018 Online予選のwriteupです
Reversing
Runme
PEファイルが渡されたのでIDAで読み込んで処理を追いかける
- スタックに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
- スタックに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
- スタックに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
- その後も延々とスタックに文字をプッシュし続けている様子
- スタックにプッシュされた文字を全部集めればフラグゲット
#!/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))