리버싱 abex crackme 2 시리얼 부분

사용 프로그램: x32dbg Mar 10 2019



abex crackme 2에서 시리얼(serial) 부분을 리버싱해봅시다.









이름에는 'Jaehwa'를 입력하고 'Check'를 눌러줍니다.


'Check'시 Serial 키를 비교하고 메시지 박스를 내보내므로, 먼저 'Check' 버튼의 이벤트 핸들러를 찾습니다.
일단 그냥 'Check'를 눌렀을 때 나오는 메시지 박스 문구를 찾습니다.
'Please enter at least 4 chars as name!'









여기서 위로 쭉쭉 올라갑니다.




올라가다 보면, NOP이 나오고, 그다음 스택이 생성되는 곳이 있습니다.
여기가 'Check' 버튼의 핸들러입니다.
여기에 breakpoint를 걸어주고, 'Check' 버튼을 누르면 EIP가 저기에서 멈춥니다.


쭉쭉 진행하다 보면, 어느 순간 주석문에 우리가 입력한 'Jaehwa'가 나타납니다.






여기서 'ebp-0x88'에 우리가 입력한 'Jaehwa'가 들어간 것을 확인할 수 있습니다.
쭉 내려가봅시다.
내려가다 보면, 반복되는 구간이 있습니다.
'00403197'에서 '004032A0'구간입니다.






문자열을 하나씩 불러오면서 암호화하는 구간으로 예상됩니다.



'004031F7'주소를 지나면, EAX에 'J'가 들어간 것으로 보아, 'CALL <&rtcAnsiValueBstr>'에서 문자를 읽어오는 것으로 예상됩니다.




반복문 한 바퀴를 돌면, 'EBP-94'에 'AE'가 들어간 것을 볼 수 있습니다.



한 바퀴를 또 돌면, 'EBP-94'에 AEC5가 들어간 것을 볼 수 있습니다.








EBP-94 주소를 잘 관찰하면, 암호화 부분을 찾을 수 있을 것 같습니다.


'00403243'주소에서 BPS-94의 값이 변경되고, '0040325B'주소에서 EBP-94에 Serial 문자가 들어갑니다.





'00403281'주소에서 이전의 시리얼을 모두 더합니다.('AEC5C9')




'00403243'주소 'CALL <&__vbaVarAdd>'에 들어가 봅시다.



'76D85969'주소 'MOVSX EAX, [ESI+0x8]'에서 사용자가 입력한 이름 한 글자를 불러옵니다.('h' 68)

'76D8596D'주소 'MOVSX ECX, [EDI+0x8]'에서 64를 불러옵니다.







'76D85971'주소 'ADD EAX, ECX'를 하여, 'CC'값이 나왔습니다.

'76d85983'주소 'MOV [ECX+0x8]'을 통해 스택에 저장합니다.


즉, Serial 변환 방법은 사용자가 입력한 이름 ASCII 값에 64를 더하는 방식이었습니다.
그리고 Serial의 값이 8자리 인걸로 보아, 이름의 4자리만 사용하는 걸 알 수 있습니다.


이름이 'King'이면 암호는 무엇일까요?
디버깅 없이 풀 수 있습니다.











끝.




카테고리: Reversing

댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

Python OpenCV 빈 화면 만들기

Python bytes.fromhex()

Android Minimum touch target size

tensorflow tf.random.uniform()

tensorflow tf.expand_dims()

KiCad 시작하기 2 (PCB 만들기)

Forensics .pyc 파일 .py로 복구하기

Android Java 8+ Api desugaring

Android Notification with Full Screen