틀린 부분이 있다면 언제든지 댓글 남겨주세요!
Abex crackme #4 문제 풀이
이 프로그램을 실행시키면 시리얼번호를 입력하는 칸이 있고 register버튼이 비활성화 되어있다. 분석을 통해 알맞은 번호를 찾아 입력하여 register버튼이 활성화 되도록 하는 것이 이번 문제의 핵심이다.
지금 상태에서는 정답 메시지도 확인할 수 없기 때문에 힌트를 찾기 힘들다. 이럴 땐 API검색을 사용한다.
알맞은 시리얼 번호를 찾으려면 비교 함수를 사용할 것이므로 API중 비교함수를 찾는다.
[코드화면 > 오른쪽 마우스 > search for > all intermodular calls] 원하는 API에서 엔터키를 누르면 그 코드로 이동하며, API에서 바로 BP를 걸 수도 있다.
* visual basic으로 개발된 프로그램 = MSVBVM60모듈 사용 (PEview에서도 확인 가능)
strcmp API코드로 가면 EAX, ECX가 스택으로 PUSH되고 strcmp함수의 결과가 EAX에 저장됨을 알 수 있다.
이후 여러 연산을 거친 결과가 EDI에 저장되고 JE명령어에 따라 DI(EDI의 하위16비트)값을 비교하여 점프여부가 결정된다.
아무 시리얼번호나 입력하고 코드를 수행한 결과 TEST DI DI에 따라 DI에 NULL값이 있으므로 ZF=1이 된다. ZF가 1이므로 JE에 따라 00402371로 간다. 그러므로 ZF를 0으로 바꾸면 JE명령어가 실행되지 않고 다음 줄의 코드가 실행되고, registered버튼이 활성화되어 성공 메시지가 출력된다.
즉 EDI에 값을 넣는 부분을 찾으면 된다. BP 위의 코드를 보면 EAX가 EDI에 저장되고 EAX엔 strcmp함수의 결과가 저장된다. 이 함수의 입력 값인 EAX, ECX의 값을 확인해본다.
BP를 다시 설정하고 EAX, ECX값을 확인해본 결과 EAX에는 현재 입력한 시리얼번호가, ECX에는 2253415라는 숫자가 저장되어 있다. strcmp에서는 이 두 레지스터의 값을 비교하여 그 결과를 EAX에 다시 넣는다고 추측할 수 있다.
다시 실행하여 2253415를 넣자 register버튼이 활성화된 것을 확인할 수 있다.
* 주의할 점은 프로그램을 다시 실행할 때마다 일련번호가 바뀌므로 정답을 확인할 때에는 그 상태에서 BP만 제거하고 실행하여 번호를 입력해야 확인이 가능하다.
'Security > Reversing' 카테고리의 다른 글
Reversing Basic Challenge #2 (0) | 2021.04.25 |
---|---|
Abex crackme #5 (0) | 2021.02.07 |
Abex crackme #3 (0) | 2021.02.07 |
PEB TEB (0) | 2021.02.02 |
Abex crackme #2 / ollydbg 단축키 (0) | 2021.01.25 |
댓글