DongDD's IT

리버싱 예제 - abex crackme2 본문

IT 보안/Reversing

리버싱 예제 - abex crackme2

DongDD 2017. 12. 30. 17:24

리버싱 예제 - abex crackme2


Problem



맨 왼쪽은 시작화면이고 Name과 Serial을 입력받을 수 있는 텍스트 창과 버튼 3개로 이루어져있다. 아무것도 입력하지 않았을 시 최소 4자리 이상의 name을 입력해달라는 message가 출력되고 Name을 입력한 후 다시 눌렀을 때는 serial이 일치하지 않는다는 message가 출력된다.

입력한 Name과 Serial이 어떠한 검사를 통해 일치하다는 것이 확인되면 통과할 수 있는 문제인 것 같다.


Analysis


Ollydbg를 통해 실행하면 Entry point(0x00401238)에서 프로그램이 시작된다.


먼저 Code->Search for -> All referenced strings를 통해 출력되었던 message를 찾아보았고 위 부분이 4자리 이상의 Name이 아닐 때 동작하는 코드이다. vbaLenVar를 통해 입력한 Name의 길이를 알아내고 길이를 저장하는 역할인 것 같다. 함수 종료 후 0x18F338에 입력한 Name의 길이가 저장되는 것을 볼 수 있다. 그 후에 vbaVarTstLt를 통하여 문자열의 길이가 4이상인지 확인하여 맞다면 TEST를 통해 바뀐 flag를 이용해 JZ를 통해 다음 단계로 넘어가고 아니라면 아무것도 입력하지 않았을 때 보았던 message가 실행된다.


Serial를 생성하는 전체적인 부분이다. 일부만 참조했지만 전체 부분을 보면 입력받은 Name의 길이만큼 반복문을 수행하며 한 문자마다 Serial로 변환해주는 과정이다.

전체적인 과정은 위와 같다. Name에서 한 글자를 가져와 #516으로 들어가 문자를 Serial로 변환하기 위해 Ascii Hex code로 변환한다. 이 함수의 return값(eax)은 문자의 Hex code로 변환된 값이다. 이 값을 [EBP-0D4]에 저장한다. 그 이후 vbaVarAdd를 통해 변환된 Ascii hex code에 특정 값을 더한다. 마지막으로 #573으로 들어가 더한 값을 다시 문자로 바꿔준다. 이 후 한 글자씩 읽어오며 같은 방식으로 문자열의 끝 문자까지 수행한 다음 생성된 Serial과 입력한 Serial이 일치하는지 확인한다.



varadd의 일부분이다. 사실 이부분이 더하면서 Serial을 생성하는 부분이지만 코드가 너무 복잡해 제대로 이해하기가 너무 어려웠다. 정확한 이해는 하지 못했지만 check가 끝난 후 생성된 serial과 이 함수와 이 함수 시작전의 부분을 보고 어느 정도 파악을 했다. 일단 이 함수를 시작하기 전에 64의 값을 stack에 넣어주는 부분이 있었다. 이 프로그램은 생성된 serial을 stack에 저장하는데 그 부분과 이 부분을 생각해보아 serial이 생성되는 알고리즘을 알 수 있었다.

코드가 너무 복잡해서 완벽한 분석을 하지는 못했다.


Solution


1) 프로그램 종료 후 Stack을 확인



Serial을 생성하는 모든 Loop를 돈 후 stack에 저장되어있는 값을 보면 Serial Number를 알 수 있다. Name에 "1234"를 입력했을 때 생성되는 Serial Number는 "95969798"인 것으로 추측되었고 이 값을 넣고 check를 실행하니 통과할 수 있었다.


2) Stack을 통해 확인한 Serial과 분석한 내용 조합

"1234" -> "95969798"이라는 serial 생성이 된 것과 아까 분석하며 여러가지 얻었던 정보를 조합해보면 이 Serial이 어떻게 생성되는지 예측할 수 있었다. 분석하면서 눈에 띄었던 stack에 넣어주는 64값을 생각해보면 다음과 같이 Serial이 생성되는 것 같다.

입력 받은 문자를 Ascii hex code로 바꾼 후 64를 더한 후 다시 문자열로 바꿔주는 것 같았다.

즉, 1(31) + (64) = 95, 2(32) + (64) = 96, 3(33) + (64) = 97, 4(34) + (64) = 98, 이런 식으로 Serial이 생성된다고 추측되었고 이것을 이용해 다른 Name과 해당 Name에 대한 Serial을 계산해 넣어보니 통과할 수 있었다.




References



Code -> Anaysis에서 3가지 선택지를 볼 수 있다. 

1) Anayse code : Ollydbg가 사용자가 보기 쉽게 LOCAL.X 등의 방식으로 표현해주는 방법이다.

2) Remove analysis from selection : 현재 선택된 LOCAL.X와 같이 표현되어 있는 명령어를 EBP-0xXX와 같은 형태로 Register EBP의 상대주소로 표현해준다.

3) Remove analysis from module : 프로그램 전체 코드의  LOCAL.X와 같이 표현되어 있는 명령어를 EBP-0xXX와 같은 형태로 Register EBP의 상대주소로 표현해준다.




Stack -> Addressing 부분에도 3가지 선택지가 있는 것을 볼 수 있다.

1) Relative to selection : 주소값으로 표현된다.

2) Relative to ESP : ESP Register의 상대주소로 표현된다.

3) Relative to EBP : EBP Register의 상대주소로 표현된다.



후기


1번 문제와 비슷하게 문제 해결은 stack을 보고 쉽게 해결할 수 있었지만 코드 분석은 너무 어려웠던 것 같다. 아직 분석하는 방법에 대해 잘 몰라서 오랜 시간이 걸렸고 완벽하게 파악하지도 못한 것 같다. 답을 얻어내기는 쉬운 문제였지만 코드 분석을 하기는 어려운 문제인 것 


Comments