리버싱 입문

[리버싱 입문](12)[abex crackme 10]

황올뱀 2025. 2. 24. 18:53

 

abex crackme 10

(abex crackme 9은 계속 바이러스 탐지에 걸려서 나중에 풀겠습니다.)

 

이번엔 뭔 프로그램인지도 보기 전에 프로그램이 꺼진다.

맨 위에 IsDebbugerPresent라는 함수 때문이었다.

https://learn.microsoft.com/ko-kr/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent

에 따르면 사용자가 이 프로그램을 디버깅하는지 감시하고 디버거에서 실행중이라면 0이 아닌 값을,

디버깅 중이 아니라면 0을 반환한다.

따라서 IsDebbugerPresent에서 0이 아닌 값을 반환하고

그걸 0을 비교해서 바로 프로그램을 꺼버리는 곳으로 점프했기 때문에 프로그램이 꺼진 것이다.

조건문을 NOP로 바꾸고 다시 실행한다.

 

이번 문제는 알맞은 시리얼을 입력하면 correct가 뜨는 문제다.

DialogBoxParamA로 대화 상자를 만들고 입력을 받는다.

문자열로 비교하는 부분을 찾으면 위와 같이 나온다.

wrong이 나오는 경우는 다음과 같다.

- lstrlen의 반환값과 0E이 다름: lstrlen은 문자열의 길이를 반환하므로 문자열의 길이가 14라는 뜻

- GetUserName과의 반환값이 0임: 유저 이름을 받아오는 함수가 실패함.

- 위 그림의 반복문에서 조건이 맞지 않음:

위에 있는 반복문은 내 username으로 암호를 만든다.

아래에 있는 반복문은 username으로 만든 암호와 내가 입력한 암호를 비교한다.

암호문은 VaZoNeZVaZoNeZ여기에서 내 username첫 글자인 K를 더하고 05랑 xor하고 ecx 1바이트와 더하고 1E를 빼고... 처럼 복잡한 과정으로 나오게 된다.

깔끔하게 반복문 수행 후 나온 암호문을 넣고 check하면 correct가 뜬다.

 

 

 

728x90
반응형