<보안 study>/CTFs

[Insomni'hack 2019]Beginner_Reverse

gosoeungduk 2019. 1. 28. 01:56
반응형

[TMI]

대회 당일에 몸이 안좋아서 하루종일 누워있다가 겨우 한 문제 풀었다.



<문 제 설 명>


babyrust to become a hardcore reverser


문제 설명에 나와있듯 이 바이너리는 rust라는 생소한 언어로 되어있었다.

덕분에 rust 공부도 쵸큼 된 것 같다. ㅋㅋ(몰라도 대충 로직 분석으로 풀 수 있었지만...)



우선 Shift + F12 로 힌트가 될만한 문자열이 있는지 탐색해보았는데 "Submit this and get you'r points!" 라는 뭔가 정답을 알 수 있을 것 같은 문자열이 보였다.


이 문자열은 beginer_reverse::main 함수에 담겨져있으며 이 함수를 call 하는 main 함수에는 별다른 점이 없기 때문에 이 함수가 핵심 함수임을 알 수 있었다.



문자열이 박혀있는 부분이다. 이 부분에 브레이크를 걸고 동적디버깅을 하려고 하였으나 어떤 짓을 해도 걸리지 않게 설계되어있는 것 같았다. (안그래도 아픈 와중에 여기가 안되버리니 함수이름대로 패닉에 빠져버렸다 ㅇ ㅁ ㅇ ;;;;)


https://doc.rust-lang.org/std/macro.panic.html


그래서 panic 함수에 대해 알아보니 프로그램에 문제가 있을 때, 종료시키는 그런 함수인 것 같았다.


전체로직을 분석하기로 마음먹고 처음부터 분석하기를 몇 시간... 핵심 파트를 발견하였다.



do ~ while 문인데 이제 중요한 것은 LABEL_51 부분이다. off_562626189F00 변수 안에는 "Submit this ~ get points!" 문자열이 박혀있었고, 그것을 print 해주는 파트이다.


이 LABEL_51을 거치려면 do ~ while 문에서 부터 빌드업을 잘 시켜놔야한다.


동적디버깅을 시작해보자.



LABEL_51을 출입할 수 있을지 판별해주는 조건문의 v30 + 1 변수에는 0x22(34)의 값이 들어있었고 Right_result 값이 34가 되어야한다는 것이다.


그런데 위에 do ~ while 문을 보면 Right_result 는 어떠한 비교구문에 대한 참 거짓 값을 0에서부터 더해나가는 과정이다.

그러면 비교구문을 실행시켜보면서 알아보자


우리가 입력하는 input_value는 배열에 저장되어 index 하나씩 옮겨가며

바이너리에 전역변수(?)로 박혀있는 compare_value 의 정체만 밝히면 플래그에 대한 정보는 금방 알 수 있을 것이다.



compare_value의 모습이다. 0x7F941EA28000이 index가 0일때의 값이고 4바이트 간격으로 어떠한 값들이 박혀있다.


설명을 하자면 compare_value의 index를 하나씩늘리면서 >>2 와 ^10 연산을 시켜준 값을 우리가 넣은 input_value 한 문자씩 비교를 한다.


즉 (compare_value>>2)^10 의 값을 알아내면 우리가 input으로 넣어야하는 값이 무엇인지 알 수 있을 것이다.



리스트 index가 34개라 캡쳐를 대충했지만 이런식으로 짜놓고 돌려보았다.




성공~






반응형

'<보안 study> > CTFs' 카테고리의 다른 글

[TokyoWesterns 2019] EASY_CRACK_ME  (0) 2019.12.21
[CodeGate2017] Goversing  (0) 2019.07.29
[Saudi and Oman CTF]Back to basics  (0) 2019.02.14
[Saudi and Oman CTF]I love images  (0) 2019.02.14
[Evlz_ctf]find_me  (0) 2019.02.08