리버싱 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

댓글

이 블로그의 인기 게시물

KiCad 시작하기 7 (FreeRoute 사용하기 2)

일본어 문장부호

KiCad 시작하기 3 (새로운 소자 추가하기)

Python urllib.parse.quote()

음악 총보(Score), 파트보(Part)

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

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

Hand Counter App

KiCad 시작하기 6 (FreeRoute 사용하기 1)

RFC 9421