Easy_CrackMe.exe 를 다운받고 열어보면 위와 같은 창이 뜬다.
admin을 입력해보면,
"Incorrect Password", 패스워드를 찾는 것이 목표인 것 같다.
이제 이 실행 파일을 올리 디버거에 넣어보자.
일단, 문자열부터 살펴보기로 하자
5y, R3versing, EasyCrackMe, Congratulation!!, Incorrect Password 등이 보인당
이제 틀린 비밀번호를 넣었을 때 Incorrect Password가 떴으니 콩그래츠가 뜨도록 풀어보자..
우린 Congratulation!!을 원하니 그 곳을 더블클릭해서 해당 코드로 이동했다.
0040110B, 00401112를 보면 JNZ 00401135라고 되어있당
JNZ: Jump if Not Zero, 제로가 아닐 때, 즉 ZF = 0일 때 점프하라는 뜻이다
00401135는 Incorrect Password를 찍어주는 메시지 박스 부분이다
그럼 이렇게 JNZ 00401135를 사용해 비밀번호가 틀렸다는 출력문으로 가게 하는 곳이 어디인지 찾아보자
00401135 주소 부분을 클릭하면 또 어떤 주소에서 이쪽으로 점프시키는 지 알 수 있다.
우리가 이미 알고 있는 0040110B, 00401112말고도 2개가 더 있다.
즉 총 4개의 분기문을 통해 Incorrect Password를 찍어준다는 것을 알 수 있당
그럼 이젠 우리가 몰랐던 나머지 두 주소, 004010B5, 004010CD로 가보자.
아래와 같다.
일단 코멘트 부분에 문자열이 보인다. 코드부터 살펴보면 004010B5에서 JNZ가 다시 등장한다.
그 윗줄인 004010B0에서 CMP가 보인다.
[ESP+5] 값과 61('a')를 비교하라는 뜻인데 일단 직접 값을 입력해보자.
004010B0에 브레이크 포인트를 걸고, 프로그램을 실행한다
실행 중, 입력 창이 나타나면 임의의 문자열을 넣어보자. 난 'QWERTY'라고 입력했다.
그리고 이제 스택 영역에서 내가 쓴 문자열을 찾아보자!
이렇게 스택 영역에서 오른쪽 마우스를 클릭하면 ESP로 갈 수 있다.
주소 부분을 더블 클릭하면 왼쪽 사진에서 오른쪽으로, ESP를 기준으로 주소를 볼 수 있당
그럼 코드대로 [ESP+5] 부분은, QWERTY의 'W'이다.
즉 CMP BYTE SS:[ESP+5], 61은 'W'와 'a'를 비교하라는 것이다.
그리고 내가 입력한 'W'는 당연히 'a'가 아니므로 Incorrect Password가 찍힌 거였다
그래서 틀렸다는 메시지가 찍히지 않도록, JNZ가 실행되지 않도록 하려면 두번째 자리에 'a'를 입력하면 된다.
우린 이런 식으로 콩그래츠를 볼 수 있도록 하는 패스워드를 찾아갈 것이다.
다음 JNZ는 004010CD에 있다. 그 윗줄을 보면 일단 '5y'를 푸시하고, 주소 00401150를 CALL한다
00401150으로 가보자..
모르는 게 많다.. 일단 정리를 하자면
JECXZ: ECX = 0일 때 점프
REPNE: REPeat Not Equal, 흔히 반복해서 하는 작업을 나타내는 연산자로 ECX에 반복횟수를 세팅하고 그 수만큼 루프를 돌게 된다. 일반적으로 '문자열'을 다룰 때 많이 사용된다. REP는 반복을 의미하고 뒤에 'N'은 NOT, 'E'는 =를 의미하고 있기 때문에 REPNE는 ECX가 0이 아닐 때, 즉 감소하는 ECX가 0보다 큰 상태일 때를 의미한다.
SCASB: SCAn String Byte, EAX의 값 중 일정 영역의 데이터와 EDI의 데이터를 비교한다. SCASB 는 1BYTE => AL, SCASW 는 1Word => AX, SCASD 는 1DWord => EAX, 값이 같으면 ZF(Zero Flag)가 '1'이 된다.
출처: https://realtofree.tistory.com/96
자세한 설명은 뒤에 하고 다시 밖으로 나오자
004010BD 코멘트 부분에 "5y"가 있고 그 밑에 함수를 호출하는 004010C3,
그리고 JNZ 실행 라인인 004010CD에 브레이크 포인트를 걸고 다시 실행해보자.
이젠 패스워드의 두번째 글자를 알았으니 'QaERTY'로 입력할 것이다.
이렇게 입력하면, 일단 첫 번째 분기문은 통과한다.
그렇게 위에서 설명한 00401150 주소의 함수로 들어가면
내가 입력한 'QaERTY'와 '5y'라는 문자열 사이의 관계를 파악할 수 있다.
다음은 F7로 라인 별로 실행한 결과이다.
대충 이런 식으로 "ERTY"의 E와 "5y"의 5를 비교한다.
이대로 계속 F7을 누르다보면 이 함수도 리턴되고 다시 비밀번호가 틀렸다는 메시지 박스로 귀결된다.
결국 패스워드의 세 번째 글자는 '5'라는 것이다.
대충 감이 오겠지만 'Qa5RTY'로 입력했을 땐 아래처럼 비교한다.
이제 'Qa5yTY'까지 알아냈고 계속 진행해보자.
다음 분기문은 0040110B에 있다.
이번엔 004010EO에서 BL('R)과 DL('T')를 비교한다.
그리고 BL에 'R3versing'이라는 문자열이 들어가면서 반복문을 돈다.
R이 맞다면 3을, 3이 맞다면 그 다음 v를 004010FC에서 검사하며 맞으면
다시 004010DA로 돌아가 다음 글자 검사를, 맞지 않으면 00401135로 돌아가는 것이다.
결국 'y' 이후에는 'R3versing'이 붙어야 한다는 것도 알아냈다.
이제 입력값은 'Qa5yR3versing'이다.
아마 이번에 마지막 분기문이 될 것이다.
가장 처음 'a'를 알아냈을 때와 같은 형태다.
[ESP+4]가 45('E')이면 된다. 직접 0040110D에 브레이크 포인트를 걸어 확인하자.
ESP+4인 곳, 즉 'Q'를 45, 즉 'E'와 비교하고 있다. 패스워드의 가장 첫 글자가 'E'라는 뜻이다.
최종 패스워드는 'Ea5yR3versing'일 것이다.
E와 a를 추측한 것처럼 5이후 문자열도 ESP+x의 값으로 유추할 수 있다...!
난 안 그랬지만..
'Wargame > reversing.kr' 카테고리의 다른 글
Music Player (150) (0) | 2020.05.31 |
---|---|
Easy Unpack (100) (0) | 2020.05.31 |
Easy Keygen (100) (0) | 2020.04.26 |