분석 도구 : Immunity Debbuger
문제는 Name이 CodeEngn일 때 Serial을 구하라는 것
해당 exe 파일을 실행해보니 실제로 Name과 Serial을 적는 칸이 있다.
애초에 문자는 입력할 수 없는 것 같고
맞지 않는 Serial 숫자를 적으면 'Try Again !' 이라는 문자열이 뜨는 것 같다.
디버거에 실행 파일을 올린 후 분석 시작
먼저 'Try Again !' 등 문자열이 있는 곳에 문제의 해답이 있을 수 있으므로
[Search for] - [All referenced text strings] 로 실행 파일에 담겨진 모든 문자열을 확인한다.
crack이 목적이므로
'CRACKED' 가 있는 곳으로 더블클릭하여 이동한다.
+) CMP Dest, Src
CMP 구문은 두 개의 피연산자를 비교한다.
Destination 피연산자에서 Source 연산자를 묵시적으로 빼서 값을 비교한다.
두 피연산자의 값이 같으면 결과는 0이 될 것이고, ZF(Zero Flag)는 1이 된다.
두 값이 다르면 결과는 0이 아닌 값, ZF는 0이 된다.
+) 명령어 DWORD PTR DS : [주소값]
DWORD 는 크기(BYTE : 1byte, WORD : 2bytes, DWORD : 4bytes),
PTR 은 기준을 의미한다.
즉, '주소값을 기준으로 4byte를 ~명령어~ 한다' 는 의미
따라서, CMP EAX, DWORD PTR DS:[45B844]의 의미는
EAX 값과 DS 값(45B844 주소 기준 4Byte 값)을 비교해서
두 값이 같으면 ZF=1, 다르면 ZF=0 이 된다는 것
+) JNZ (Jump Not Zero) 주소 = JNE (Jump Not Equal) 주소
결과가 0이 아닐 때(ZF=0) 해당 주소로 이동하고,
0이 아닐 때(ZF=1) 바로 다음(아래) 명령어를 실행한다.
따라서, JNZ SHORT 00458854 의 의미는
위에서 비교했을 때 두 값이 같으면 바로 다음 명령어를 실행(성공 메시지),
두 값이 다르면 00458854(Try Again) 로 점프한다는 것
분기점 (00458837) 에 BP를 설정하고
두 개중 어떤것에 serial 값이 저장됐는지 확인하면 쉽게 serial 값을 얻을수 있을 것이다.
serial 값에 1234 를 입력했더니
EAX 에 000004D2가 저장이 된다.
우리가 입력한 1234(10진수) → 4D2(16진수)로 바뀌어 저장된 것 !!!
CMP 명령어에서 DS 값 (45B844 주소 기준 4Byte)과 비교하므로
45B844 주소로 가서 들어있는 값을 확인하였다.
00006160(16진수)가 저장되어 있다.
이제 이를 10진수로 변경하면 원하는 serial을 획득할 수 있다!
00006160 → ?????
'Study > Reversing' 카테고리의 다른 글
CodeEngn Challenge : Basic RCE L06 (0) | 2021.04.07 |
---|---|
CodeEngn Challenge : Basic RCE L16 (0) | 2021.03.30 |
Reversing.kr 1번 풀이 (0) | 2021.03.24 |
main 함수 찾기 (0) | 2021.03.23 |
OllyDBG, 어셈블리어 (0) | 2021.02.04 |