티스토리 뷰

Reversing/* reversing.kr

reversing.kr - Easy Crack

live2skull 2016. 7. 17. 21:59

** 분석 중 문제 함수가 지역 변수 접근에 EBP 를 사용하지 않았음. (ESP 를 대신 사용함.)

Immunity Debugger 에서 LOCAL.n Prefix 를 사용하지 못함. IDA 를 이용해 스택 주소를 확인함.

- ESP >> sub_401080 Call 명령어 실행 후 ret addr의 위치를 기준으로 함.


1. 

프로그램 실행 시 문자열을 입력할 수 있는 창이 뜸.

아무거나 입력하고 "확인"을 누르면, "Incorrect Password" 오류 메세지박스를 출력함.



2. 

메세지박스가 뜨는 코드의 주소를 확인한다.

IDA > String Windows 에서 해당 문자열을 확인.

Xref 을 통해 문자열을 참조하는 코드를 찾는다. {0x0040113C}

# WinMain 에서 DialogProc 콜백 함수를 찾아서 분석할 수 도 있음.



3. 

{0x00401080} 함수의 시작부터 어셈코드를 살펴본다.

인자로는 hDlg를 받는다. (처음에 떠있던 다이얼로그창의 핸들)

또한 일반적인 함수와는 다르게, 함수 에필로그를 수행하지 않고, 오로지 ESP 만을 이용해 EBP 처럼 지역변수에 액세스하는데 사용하였다.

sub esp, 64h 를 수행함으로, 스택에 지역 변수를 사용하기 위한 공간을 할당해준다.


{0x0040108B} ESP-64h부터 총 100바이트를 0으로 채운다. (rep stosd 를 이용해 _memset 과 비슷한 처리를 할 수 있음.)


4.

{0x004010AA} 에서 GetDlgItemTextA 를 통해 텍스트 박스에 입력한 문자열을 받아온다.

{0x0040109F} ESP+8 을 eax에 lea 명령어로 가져온 다음, 스택에 push 하였음. (텍스트 문자열 저장 주소) - LPTSTR

https://msdn.microsoft.com/en-us/library/windows/desktop/ms645489(v=vs.85).aspx



5.

비교 루틴 시작.

{0x004010B0} 문자열이 저장된 주소 + 1h 가 0x61인지 비교한다. (str[1] == 0x61 -> ZF : 1)

0x61 이 아니라면 jnz 를 이용해 "Incorrect Password" 를 출력한다. (틀림)

>> ?a????????


{0x004010B7} str[2] 부터 3까지의 문자열이 "5y"와 일치하는지 _strncmp 로 비교한다.

>> ?a5y??????


{0x004010CF} push ebx, esi -> 비휘발성 레지스터로, 스택에 저장한다.

"R3versing" 의 문자열 시작 부분과 str[3] 부터 2개씩 순서대로 비교한다.

{0x004010E6} str문자열이 끝나면 비교 루틴을 종료. (test reg, reg -> reg==0 이면 ZF가 1이 됨.)

>> ?a5yR3versing


{0x00401112} str 의 맨 첫번째 문자가 'E' 인지 체크한다.

>> Ea5yR3versing



'Reversing > * reversing.kr' 카테고리의 다른 글

reversing.kr - ImagePrc  (0) 2016.07.22
reversing.kr - Music Player  (0) 2016.07.21
reversing.kr - Easy Keygen  (0) 2016.07.20
reversing.kr - Replace  (0) 2016.07.19
reversing.kr - Easy Unpack  (0) 2016.07.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함