본문으로 바로가기

ECTF-2016 Defushal(rev50) Write Up

category 해킹/Write Up 2016. 10. 29. 22:15

ECTF`16 Defushal(rev50) Write Up (http://www.ectf.in/)




바이너리와 서비스 아이피가 제공되었다. 먼저 바이너리를 분석해보겠다.

바이너리는 level1, level2, level3, level4와 마지막에 check_if_cool까지 통과할 수 있는 문자열을 v5에 입력하면 FLAG를 얻을 수 있는 형식이였다.


<level1>

함수의 구조는 위와 같다. 입력받은 문자열의 길이에서 1을뺀 위치(배열이기떄문에 문자열-1은 문자열에 가장 마지막 문자를 가르킨다.)와 문자열의 맨처음부터시작해서 둘을 하나씩 증가/감소 해주면서 비교해주는것이였다. 그러므로 문자의구조는 AA, ABBA, ABCCBA등 이런식의 패턴을 가진 문자열 일것이다.


<level2>

함수의 구조는 위와 같다. 이것은 입력받은 문자열을 하나씩 0과 xor해보면서 v3에넣고 v3이 0이여야하므로 이조건을 맞춰주면된다.

(실제 프로그램을 돌릴떄는 이부분에서 걸린적이 한번도없다. 아스키범위에 문자열을 넣어준다면 무조건 통과할것이다.)



<level3>

이부분은 마지막 v6을 char형태로 봤다가 '0x1|' 이렇게나오는바람에 1인줄알고 분석하는데 애먹었다..

함수구조는 위와 같다. 먼저 입력값이 알파벳인지 아닌지 판단한다. 알파벳이 아니라면 반복문이도는데 초기값 z를 시작으로 하나씩 더해준다. v4는 한번 더해줄때마다 1씩 증가하므로 총 더해지는 연산이 4번 이루어져야한다. 그리고 v6는 결과값인데 이것이 0x17c 즉 380이 되야하므로 0x5f(95) + 0x5f + 0x5f + 0x5f를 해주면 v6의 값은 380이된다.


그러므로 여기까지 문자열은 "\x5f\x5f\x5f\x5f" 이것이된다.


<level4>

함수구조는 위와 같다. strstr은 문자열중에저 저것이 있나 없나 검사해주는 것이다. 그래서 문자열에 저걸 넣어주면된다.


그러므로 여기까지 문자열은 파이썬으로 (python -c print "\x5f\x5f" + "roor" + "\x5f\x5f") 이런식으로 출력할 수 있다.


<check_if_cool>

함수구조는 위와 같다. 이것은 단순하게 앞에 dud로 시작하면된다. 그러므로 문자열에 추가만해주면된다. (level3의 결과는 알파벳이면 연산을 안함)


그러므로 여기까지 문자열은 파이썬으로 (python -c print "dud" + "\x5f\x5f" + "roor" + "\x5f\x5f" + "dud") 이런식으로 출력할 수 있다.


그러면  You did it. Now report this string to the service 이런식의 문자열이 뜬다. 그러면 위에 아이피를 nc로 접근해서 저 문자열을 입력해주면 FLAG가 나온다. 




+ Exploit Sourse


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from socket import *
  
HOST = '35.161.87.33'
PORT = 7777
 
= socket(AF_INET,SOCK_STREAM)
 
s.connect((HOST,PORT))
 
s.send("dud" + "\x5f\x5f" + "roor" + "\x5f\x5f" + "dud")
 
while True:
    data = s.recv(1024)
    if not data:
        break
    else :
        print data
s.close()
cs