반응형

Easy_CrackMe.exe
0.04MB

 


파악

 

 

실행하면 위와 같이 입력하는 부분이 뜬다.

 

 

"seansean"을 임의로 입력하고 확인 버튼을 누르면 위와 같이 "Incorrect Password" 메시지가 뜬다.

 


분석

 

 

위의 부분은 EP 부분이다.

 

 

x64dbg 내에 있는 문자열 찾기 탭에 들어가면 위와 같이 문자열들이 뜨는데 "Congratulation !!" 문자열과 Incorrect Password" 문자열이 보인다.

 

 

"Congratulation !!" 문자열을 더블 클릭하여 이동하면 위와 같이 보이는데, 40110D 주소에서 esp+4에 있는 값과 'E'를 비교 후 같으면 "Congratulation !!" 메시지를 띄우고, 다르면 401135 주소로 점프하여  "Incorrect Password" 메시지를 띄운다.

 

 

스크롤을 쭉 올려서 401080 주소부터 분석을 하면 된다.

 

00401080 주소에 F2로 BP를 걸어둔 후 F9 키를 눌러 프로그램을 실행한다.

 

 

"seansean"과 같이 임의의 값을 입력한 뒤 "확인" 버튼을 누른다.

 

 

그러면 위와 같이 401080 주소에서 멈춘다.

 

rep stosd 명령은  EAX에 있는 값을 EDI 레지스터에 담긴 값에 해당하는 메모리 주소에 ecx에 있는 값만큼 반복하여 채운다는 것이다.

더보기

rep :

- ecx에 담긴 값만큼 카운트하여 반복한다.

- edi에 담긴 값을 자료형의 크기만큼 ecx가 감소하는 횟수와 동일한 횟수로 증가시킨다.

 

stos : al or ax, eax에 있는 값을 edi에 담긴 값에 해당하는 메모리 주소에 복사한다.

stosb : AL(bytes)

stosw : AX(words)

stosd : EAX (double words)

 

https://www.tutorialspoint.com/assembly_programming/assembly_stos_instruction.htm

 

위의 401080 주소부터 401096 주소의 어셈블리어를 해석하면

 

스택에서 64h byte만큼의 공간을 늘리고 edi에 담긴 값을 저장한 뒤 ecx에 18h, eax에 0을 넣고, edi에 esp+5에 해당하는 스택 주소를 넣은 다음 esp+4에 해당하는 스택 주소에는 0을 넣어준 후 스택에 64h 라는 값을 저장한 후 rep stosd 명령을 수행하라는 것이다.

 

 

F8 키를 이용해 401096 주소에 멈춰 rep stosd 명령이 수행되기 직전의 esp+4 주소의 상태를 보면

 

rep stosd 명령을 수행하기 전 esp+4에 해당하는 주소 영역에 있는 값들

 

위와 같이 esp+4(19FA80) 주소에 0이 들어있게 된다.

 

 

그리고 EDI에는 esp+5의 주소인 19FA81이 들어가있다.

 

이 상태에서 F8 키를 눌러 rep stosd 명령을 실행한다.

 

rep stosd 명령이 수행된 후 esp+4 주소

 

그러면 위와 같이 19FA80 주소부터 19FADF주소까지 모두 0으로 채워지게 된다.

 

ecx의 값이 18이니 18h byte가 0으로 채워져야 하는 거 아닌가 싶은데, 

 

stosd는 4byte이고, ecx에 담긴 값 18h * 4 = 60h인데, 이를 10진수로 바꾸면 96byte이다.

 

그러므로 총 96byte가 0으로 채워진 것이다.

 

 

이후 401098 주소의 stosw 명령과 40109A 주소의 stosb 명령은 각각 AX 레지스터에 담긴 값을 DI 레지스터에 복사, AL 레지스터에 담긴 값을 DL 레지스터에 복사하라는 의미이다.

 

 

F8 키로 4010AA 주소의 GetDlgItemTextA() API를 호출하기 직전까지 간다.

 

GetDlgItemText API는 WinAPI를 공부하면 배우게 되는 API 함수인데, 이전에 프로그램에 "seansean"이라고 입력했던 입력 창에서 "seansean" 문자열을 가져오겠다는 것이다.

(https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-getdlgitemtexta)

 

4010AA 주소의 GetDlgItemTextA API 함수 호출 후 19FA80 스택 주소의 값

 

이전에 rep stosd 명령으로 초기화 했던 스택 영역 19FA80 주소를 보면 위와 같이 "seansean" 문자열이 들어있다.

 

 

4010B0 주소를 보면 위와 같이 esp+5 주소에 있는 값과 'a'(61)을 비교하여 맞으면 그냥 넘어가고, 다르면 401135 주소로 점프한다.

 

esp+5 주소는 19FA81주소인데, "seansean" 문자열에서 두 번째 글자 'e' 부분으로 글자가 일치하지 않기 때문에 401135 주소로 점프할 것이다.

 

두 번째 글자가 'a' 이어야 한다는 것을 알았다.

 

이어서 4010B9 ~ 4010C3 주소의 명령을 보면, 스택에 2를 넣고, esp+A 주소에 있는 값을 스택에 넣고, 406078 주소에 있는 "5y" 문자열을 스택에 넣은 후  

 

4010C3 주소에서 401150 주소에 있는 함수를 호출하는데, 401150 함수의 결과값이 담긴 eax 레지스터의 값이 0인지 확인하여 0이 아니면 401135 주소로 점프한다.

 

esp+A주소부터 2byte는  "seansean" 문자열에서 3번째와 4번째에 있는 "an" 문자열이다.

(push 2로 인해 esp에 담긴 값이 달라진다는 것을 인지해야 한다.)

 

3번째와 4번째 문자열이 "5y" 이어야 한다는 것을 알았다.

 

 

그렇다면 여기서 입력한 문자와 비교 대상인 문자가 일치하지 않았을 때 jmp 하는 401135 주소를 보면 위와 같이 "Incorrect Password" 문자열이 띄워지는 부분이다.

 

즉, 여기까지 알아낸 정보는 "sa5ysean" 이어야 한다는 것이다.

 

 

이어서 40606C 주소에 있는 "R3versing" 문자열을 esi에 넣고, esp+10(19FA84) 주소에 있는 값(입력한 값)을 eax에 넣은 뒤 

 

각 문자열에서 한 문자씩 가져와 bl과 dl 레지스터에 담고, dl에 담긴 값을 cl에 복사한다.

 

비교 후 다르면 401102 주소로 점프한 다음 401135 주소로 점프한다.

 

비교 후 같으면 cl에 담긴 값이 0인지 test 명령으로 AND 연산하고, test 명령 결과가 0이면 ZF 플래그가 1로 설정되어 JE 명령이 수행되므로 4010FE 주소로 점프하여 401135 주소로 점프한다.

즉, esp+10(19FA84) 주소에 있는 값(입력한 값)이 존재하는지 확인하는 것이다.

 

입력한 값과 비교 대상 문자열의 값이 같고, 입력한 값이 존재한다면, eax+1 위치에 있는 글자, esi+1 위치에 있는 글자를 가져와 비교한다.

 

이렇게 2글자씩 끊어 비교한 후 일치하면 eax에 2를 더하고, esi에 2를 더해 다음 비교할 두 글자 위치로 이동하여 다시 비교한다.

 

즉, 4010DA ~ 4010FC 주소에서 루프를 돌아 두 글자씩 끊어 "R3versing" 문자열과 비교하는 것이다.

 

더보기

adc와 sbb

 

adc는 add와 비슷하고, sbb는 sub와 비슷하다.

 

adc는 더하고, sbb는 빼는 명령어이다.

 

다만 add와 sub와는 다른 점이 carry의 값도 뺀다는 것이다.

 

예를 들어

 

sbb eax, 2 : eax에 담긴 값에 2를 빼고 CF의 값도 뺀 후 eax에 저장한다는 것이다.

 

adc eax, 2 : eax에 담긴 값에 2를 더하고 CF의 값도 더한 후 eax에 저장한다는 것이다.

 

 

마지막으로 입력한 문자열의 가장 첫 번째 문자가 'E'와 일치한지 비교하고, 일치하면 "Congratulation!" 메시지를 띄운다.

 

정리하자면

 

두 번째 글자가 'a'인지 확인하고

 

3번 째 글자와 4번 째 글자가 "5y"인지 확인하고

 

5번째 글자부터 "R3versing" 문자열과 일치한지 확인한 다음

 

최종으로 첫 번째 글자가 'E' 인지 확인한다.

 


결과

 

 


인증

 

반응형

'전쟁 > reversing.kr' 카테고리의 다른 글

[reversing.kr] Replace  (0) 2023.12.17
[reversing.kr] Music Player  (0) 2023.06.23
[reversing.kr] Easy_UnpackMe  (0) 2023.06.22
[reversing.kr] Easy_KeygenMe  (0) 2023.06.22

+ Recent posts