본문 바로가기
Security/Reversing

Abex crackme #4

by jino22 2021. 2. 7.

틀린 부분이 있다면 언제든지 댓글 남겨주세요! 

 

Abex crackme #4  문제 풀이

crackme4.exe
0.02MB


 

이 프로그램을 실행시키면 시리얼번호를 입력하는 칸이 있고 register버튼이 비활성화 되어있다. 분석을 통해 알맞은 번호를 찾아 입력하여 register버튼이 활성화 되도록 하는 것이 이번 문제의 핵심이다.

프로그램 실행시

지금 상태에서는 정답 메시지도 확인할 수 없기 때문에 힌트를 찾기 힘들다. 이럴 땐 API검색을 사용한다.

알맞은 시리얼 번호를 찾으려면 비교 함수를 사용할 것이므로 API중 비교함수를 찾는다.

[코드화면 > 오른쪽 마우스 > search for > all intermodular calls] 원하는 API에서 엔터키를 누르면 그 코드로 이동하며, API에서 바로 BP를 걸 수도 있다.

API확인

* 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만 제거하고 실행하여 번호를 입력해야 확인이 가능하다.

728x90
반응형

'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

댓글