리버스엔지니어링 문제 Advance 17

2015. 8. 29. 14:14Security ★ Development/Reversing

반응형

http://codeengn.com/challenges/advance/17


Problem : Find the Name when the Serial is 66BB16A328F74639 

(The 3rd character in Name must be either bruteforced or guessed) 

노래도 나오고 방정식도 움직입니다.  지난번에도 bgm이 나오는 프로그램이 있었지만 이런 것들이 리버싱을 하는데 약간이라도 방해가됩니다.  우선 4013EB에서 호출되는 함수로 가보면 404130부터 8바이트 씩 256의 길이를 초기화하고 있습니다.  



for(int i=0;i<256;i++){

ar[i]=i;

for(int j=0;j<8;i++){

ar[i]=ar[i] shr 1;

if(ar[i]%2==0)

ar[i] xor C96C5795D7870F42;

}

}

이런 모양의 함수가 될 것입니다.


CALCULATE 버튼을 클릭하고 나면 004011C0부터 bp를 걸어 디버깅 할 수 있는데 GetDlgItemTextA이후 EAX의 크기를 4, 10과 비교하므로 크기 제한이 있다는 것을 알 수 있습니다.  0040120C의 00401000함수를 거치면 EDX에 Serial의 값 앞부분이 들어있습니다.  밑에 보면 Text Congratu~가 있고 그 바로 위 점프문을 보면 72706163, 69636369랑 비교하고 있습니다.  00401634의 함수로 가봅니다.  여기서 초기에 위에 복원한 코드에서 만든 배열을 사용하는데 EAX와 EDX에 저장된 값이 72~, 69~이어야 합니다.  


여기에 SHRD 명령이 쓰였습니다.  어떤 명령인지 확실히 짚고 분석합니다.  ARG2는 루프를 위한 값 256이고 ARG1은 입력해준 Name의 첫 글자+이상한 공식이 있는 메모리입니다.  루프는 이 메모리 위치에서 하나씩 증가시키며 00401646에서 값을 이용하고 있고 앞에서 만들어준 값을 00401653 및 0040165D에서 이용하고 있습니다.  

SHRD 및 AL, XOR 등으로 해당 루프의 의도를 파악하기 쉽지 않으니 해당 어셈블리를 복원합니다. 


전체적인 흐름은 위의 순서를 따릅니다.  4015EE에서 해당 메모리 값을 이용해 404130에 값을 만들어놓고 401634에서 404130의 값들과 serial, name, 공식 문자열을 이용한 값인 18F8C4의 값으로 EAX와 EDX를 채웁니다.  그리고 401274에서 EAX와 EDX가 72706163, 69636369인지를 검사합니다.