반응형

 

Crackme 6번을 실행하면 위의 사진과 같이 ReWrit의 Crackme#1번 문제라는 것과 어렵게 생각하지 말라는 것과 패스워드는 오직 숫자로만 되어있다는 것을 문구로 띄워주고 Password 입력을 기다리고 있다.

 

 

Crackme 6번의 EP 코드이다.

 

 

문자열 찾기 기능을 이용하면 위의 사진과 같이 프로그램 실행 시 봤던 문구들이 적혀있다.

 

Password 문구 부분으로 이동한다.

 

 

먼저, 40152E 주소에 BP를 설정한다.

 

40152E 주소의 mov 명령으로 esp+4 주소에 “Password:” 문자열을 담고, 401536 주소의 mov 명령으로 esp 주소에 4433c0의 값을 담은 뒤 함수를 호출한다.

 

이는 “Password:” 문자열을 띄워주는 printf() 같은 함수이다.

 

이어서 ebp-4 주소의 값을 eax에 담고 eax의 값을 esp+4에 담은 뒤 현재 esp 주소에 443460의 값을 담고 함수를 호출한다.

 

즉, ebp-4 주소에 있는 값을 esp+4 주소에 담고, 443460 주소에 있는 값을 esp로 담은 뒤 호출하는데 이 부분은 “Password:” 문자열을 띄우고 Password를 입력받는 부분이므로 scanf() 같은 함수이다.

 

 

Password를 입력받은 뒤 7F97E56C와 비교하는 cmp 명령이 있다.

 

이때 ebp-4에 있는 값과 7F97E56C를 비교한다.

 

비교 후 같지 않으면 “Wrong!” 문자열 출력 부분으로 가고

비교 후 같으면 “Correct, good job! :)” 문자열 출력 부분으로 간다.

 

 

현재 EIP는 40152E를 가리키고 있는 상태이고, 이 상태에서의 EBP는 64FF28이므로 ebp-4의 주소는 64FF24이다.

 

64FF24 주소에는 현재 31이라는 값이 들어가있다.

 

scanf() 같은 함수를 호출한 뒤 우리가 입력한 값이 ebp-4 즉, 64FF24 주소에 들어간다고 예측이 가능하다.

 

그러면 즉 현재는 31이라고 되어있는 값이 401550 주소의 call 명령이 실행되고 나면 입력한 값으로 바뀐다는 것이고, 그 값이 7F97E56C와 동일해야 한다는 것이다.

 

 

그렇다면 Password로 7F97E56C를 입력한 뒤 디버거를 보면

 

 

 

401550 주소의 명령이 실행된 후 ebp-4(64FF24) 주소의 값은 7F97E56C이 아니라 7만 들어가있다.

 

7F97E56C의 맨 앞자리 7만 들어가고 뒤에 F 문자부터는 삭제된 것이다.

 

이전에 프로그램 실행 했을 때 Password 값은 숫자로만 되어 있다는 문구가 있었다.

 

즉, 숫자로만 되어 있는 값이 16진수 7F97E56C와 동일하면 된다는 것이다.

 

 

계산기에서 7F97E56C를 입력한 뒤 10진수로 변환하여 해당 값을 Password 값으로 넣으면 된다.

 

 

디버거에서 Ctrl+F2를 눌러 재실행 한 뒤 F9와 F8로 Password 입력 부분까지 실행하고 2140661100을 넣은 후 디버거에서 확인하면

 

 

ebp-4(64FF24) 주소에 7F97E56C가 들어가있으니 401555 주소에 있는 cmp 명령 결과 값이 일치하므로 ZF 플래그가 1로 설정된다.

 

jne 명령은 ZF 플래그가 0으로 설정되어 있어야 점프하는데 ZF 플래그가 1로 되어 있으므로 점프하지 않고 40155E 주소로 넘어가 Correct, good job! :) 문구가 띄워질 것이다.

 

반응형

'전쟁 > crackme' 카테고리의 다른 글

Crackme # 8(Crack me by hackereh@!)  (0) 2022.06.23
Crackme #7  (0) 2022.06.22
abex' crackme #5  (0) 2022.06.14
abex' crackme #4  (0) 2022.06.14
abex' crackme #3  (0) 2022.06.14

+ Recent posts