Simple Crack Me Writeup

2018. 4. 28. 04:480x02 Reverse Engineer/0x03. Etc

728x90

출처 : http://www.rohitab.com/discuss/topic/39048-serial-crackme/


주제 : c++ 분석 공부 목적 워게임 


기반 : Dev C++ v5.0 - v5.5 / MINGW32 / GNU C v4.x


바이너리를 열면, UserName과 Serial을 입력할 수 있다. 


소스코드를 보자.


메인함수이다.

메인함수에서 봐야 하는 부분은 start이다. 




문자열을 string 클래스에 넣어둔다.



          Username과 Serial을 std::cin을 이용하여 입력한 후 serialfunc에 접근한다.



         결과문 출력 또한 string 클래스를 이용함을 볼 수 있었다. 


대부분의 crackMe를 풀 때는 참,거짓에 의해 출력문이 나왔는데 c++에서는 이렇게도 적용할 수 있는 것을 알게 되었다.



직접 입력한 pw와 id의 길이를 구한다.

메인에서 입력할 당시는 id -> pw 순이지만 길이 반환은 반대로 하는 것을 보았다.


  username과 serial을 구하고 나면 여러가지 조건문이 나오게 된다.


첫 번째 조건문 

if ( ! (pw_len % id_len ) && (std::string::size(id) & i ) == 1)

여기서 순간 착각을 했다. 그 이유는 어셈으로 작성 된 코드를 급하게 보았기 때문이다.


바로 이 부분인데, div는 몫을 eax에 복사, 나머지를 edx에 복사를 하는데 

eax에만 집중을 하고 있었다. 


즉, pw_len % id_len을 하게 되면 나머지이기 때문에 edx에 들어가게 되며, jnz 조건에 만족하지 않으려면 두 개의 나머지 값은 0이 되어야 한다. 


그 다음 size(id) & i == 1 이 부분인데 

id가 홀수가 되었을 때 &연산을 만나게 되면 무조건 1이 되게 된다. 


그렇다면, id는 홀수 임이 드러났으며 pw와 id를 나누었을 때 나머지 값이 0이 나오기 위해서는 pw는 id의 배수가 되어야 한다. 


그 다음으로 봐야 하는 부분은 여기다.

split함수로 인해 pw 문자열을 '-'을 기준점으로 삼아 new_split_arr에 대입한다.

예를 들어, aa-aa-aa-aa 이면 aa가 new_split_arr[0]~[3]이 되는 것이다.


두 번째 조건문

if ( std::vector<std::string,std::allocator<std::string>>::size(&new_split_arr) == 4 )

new_split_arr 즉, -을 기준으로 4개의 문자열이 존재한다면 해당 조건문에 접근할 수가 있다.


세 번째 조건문

if ( i >= new_split_arr_size ) 

new_split_arr_size는 이미 4임을 알 고 있다.

i가 4가 되었을 때 반복을 멈출 수 있다. 


네 번째 조건문

 if ( str_oper_size != v5 )

사이즈가 4가 아니면 -1을 반환 받고, 실패 구문으로 향하게 된다.




다섯 번째 조건문

if ( str_oper_size != -1 )

반환 값이 -1이 아니다. 즉, 올바른 갯수를 체크하였다면, v18에 success라는 값을 복사한다. 

v18의 default는 fail이었다.


처음에는 Ollydbg로 분석을 진행했었다. 

아직까지 c++의 문법을 잘 아는것은 아니지만, Memory Dump를 살펴보면서 생각해보게 된것은 string 클래스들은 더블포인터 형식인 것 같다. 

예를들어, 어떤 주소안에 있는 값 -> [  ]  -> 한번 더 접근 -> 입력한 시리얼 혹은 네임 


실패 했을 때의 Failed! Incorrect User and Serial combination 문장의 의미를 문제를 풀고 나서 알게 되었다.

문제 출제자분께서는 연산 알고리즘을 요하는 것이 아니라, 네임과 시리얼의 상관관계에 대해서 분석할 수 있는지를 묻는 의도를 지니고 있다고 판단하였다.


고로, 이 문제의 답은 무수히 많다. 

'0x02 Reverse Engineer > 0x03. Etc' 카테고리의 다른 글

KISA Diary 문제풀이 및 상세분석  (0) 2018.05.18
Rootme ch25 C++ Basic  (0) 2018.05.03
BruteForce is Wonderful!  (0) 2018.04.02
XOR IT'S FUN  (0) 2018.04.02
예전에 풀었던 Abex을 키젠 으로 다시 풀기  (0) 2018.03.15