문자열 확인

본격적인 분석에 앞서 문자열을 확인해 본다.

00406030에 비밀번호가 틀렸을 경우에 나올 문자열이, 00406044에 비밀번호가 맞을 경우에 나올 문자열로 추정되는 문자열이 보인다. 해당 문자열의 Xref를 보면 sub_401080에서 사용이 된다.

루틴 분석

위의 경우에는 비밀번호를 확인하고 그 결과에 따라, Congratulation !! 이라는 메시지박스를 출력 또는 Incorrect Password 라는 메시지박스를 출력합니다.

401080 함수의 시작 부분을 보면, 로컬 스택으로 0x64 만큼 사용한다. 그 후 GetDlgItemText 함수를 호출한다.
UINT GetDlgItemText(
  HWND hDlg, // handle
  int nIDDlgItem, // 컨트롤 ID
  LPTSTR lpString, // 문자열 버퍼
  int nMaxCount // 버퍼의 길이
);
각 인자에 대한 설명은 다음과 같다. 핸들과 컨트롤 ID 를 넘겨주고, 그에 대한 문자열이 반환값이다.
var_64 즉 call 이 끝난 후 cmp 부분에서 esp+0x4는 lpString의 문자열이 들어있다. 따라서 esp+0x5은 lpString[1] 이라는 것을 알 수 있고, 0x61 과 비교를 한다.
[*] password: { _ a }

그 후 스택에 0x2 를 넣고, ecx 에 esp+0x0a 를 넣는다. 여기서 esp+0x0a 에는 lpString[2] 의 값이 들어있다. 왜냐하면 위에서 esp+0x4 에 lpString[0]이였고, 그후 0x2를 넣었기 때문에 esp+0x8 이 lpString[0]이 되었다.

0x406078 을 스택에 넣는데, 해당 주소에는 5y 라는 문자열이 들어있다. 그 후 ecx (lpString[2])를 스택에 넣고, sub_401150 함수를 호출한다. 즉 sub_401150(lpString[2], 0x406078, 2) 이며, 2인자의 주소는 포인터로 보인다.
sub_401150 함수 안에 들어가 보면, 해당 함수는 strncmp 함수 인 것을 알 수 있다. 따라서 lpString[2] 와 5y 2자리를 비교한다.
[*] password: { _ a 5 y }

그 다음으로는 ebx, esi 를 순차적으로 스택에 넣고, esi 에는 R3versing 의 주소 값을 넣는다. 그리고 esp+0x10 을 eax 에 넣는다. 앞에서 push 2번을 하였기에, esp+0x10 에는 lpString[4] 가 들어간다.

그 후에 dl 에 lpString 을, bl 에 R3versing 을 한 글자씩 넣고 이 둘을 비교한다. 그리고 test cl,cl 을 통해 문자열의 끝인지도 확인을 한다.
[*] password: { _ a 5 y R 3 v e r s i n g }

마지막으로 문자열(lpString) 의 처음이 0x45("E") 인지 확인을 한다.
[*] password: { E a 5 y R 3 v e r s i n g }

Reference

'0x00 Reversing > 0x01 Reversing.kr' 카테고리의 다른 글

Reversing.kr :: Ransomware  (0) 2019.12.09
Reversing.kr :: Easy_ELF  (0) 2019.10.05
Reversing.kr :: Easy_Unpack  (0) 2019.03.01
Reversing.kr :: Easy_Keygen  (0) 2019.02.26

+ Recent posts