문자열 확인
본격적인 분석에 앞서 문자열을 확인해 본다.
00406030에 비밀번호가 틀렸을 경우에 나올 문자열이, 00406044에 비밀번호가 맞을 경우에 나올 문자열로 추정되는 문자열이 보인다. 해당 문자열의 Xref를 보면 sub_401080에서 사용이 된다.
루틴 분석
위의 경우에는 비밀번호를 확인하고 그 결과에 따라, Congratulation !! 이라는 메시지박스를 출력 또는 Incorrect Password 라는 메시지박스를 출력합니다.
401080 함수의 시작 부분을 보면, 로컬 스택으로 0x64 만큼 사용한다. 그 후 GetDlgItemText 함수를 호출한다.
각 인자에 대한 설명은 다음과 같다. 핸들과 컨트롤 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 |