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 s = 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 |
'해킹 > Write Up' 카테고리의 다른 글
Exploit Exercises Protostar Stack~Net Write Up (0) | 2017.01.27 |
---|---|
Protostar Heap3 Write-Up (0) | 2017.01.25 |
[PythonChallenge-3] equality.html 풀이 (0) | 2016.09.14 |
[PythonChallenge-2] ocr.html 풀이 (0) | 2016.09.14 |
[PythonChallenge-1] map.html 풀이 (0) | 2016.09.14 |