파일을 실행하고, 확인을 눌러보니 Error 메시지가 나왔습니다.
abex` crackme1은 어셈블리어로 제작됐습니다.
어셈블리어는 CPU의 명령어들을 이진수가 아닌 영어의 약자인 기호로 표시하고 기계어보다는 더 높은 수준에서 프로그램을 작성하는 것을 가능하게 합니다.
기호와 CPU의 명령어가 일대일 대응됩니다.
맨 처음 실행하면 위와 같은 화면이 나옵니다.
Windows 8(64bit) 환경에서는 보안문제로 시작할 때 Shift+F9를 먼저 하고 실행해야 합니다.
실행하면 코드가 나오는데 이게 코드의 전부입니다.
이렇게 짧다는 건 다른 컴파일러를 사용해서 만든 프로그램이 아니라 직접 어셈블리어로 만들었다는 것을 알 수 있습니다.
프로그램이 시작되었을 때 블록이 되어있는 부분은 EP 코드라 하고 시작점을 나타냅니다.
PUSH 네 번을 하고 난 후 스택 창입니다.
스택 창에서 PUSH옆에 주소인 0, 00402000 00402012 00000000이 거꾸로 쌓이는 걸 볼 수 있고, Style Title Text h0wner이라는 피라미터를 전달한 것을 확인할 수 있습니다.
빨간색으로 쓰여있는 MessageBoxA를 실행하면 메시지 박스가 뜨는 걸 보니 저 함수는 메시지 박스를 띄우는 함수인 것 같습니다.
그다음, GetDriveTypeA를 실행하면 리턴 값을 저장하는 EAX가 3으로 바뀐 것을 확인할 수 있습니다.
INC는 Increase로 값을 1씩 증가시킵니다.
CMP EAX, ESI로 EAX과 ESI값을 비교합니다.
JE(Jump Equal)는 위에서 비교한 값이 같으면 인자의 주소로 점프하겠다는 의미입니다.
EAX와 ESI의 값은 같지 않으므로 점프하지 않습니다.
맨 처음과 봤던 이 메시지 박스를 다시 확인할 수 있습니다.
F9로 다시 시작을 한 다음,
기존의 JE(Jump Equal) 비교 구문을 수정해 보겠습니다.
더블 클릭해서 JMP로 수정했습니다.
CMP로 비교는 하지만, 결과와 상관없이 무조건 0040103D 주소로 점프를 합니다.
이렇게 결괏값을 바꾼 메시지 박스를 띄울 수 있습니다.
15년도에 작성했던 내용이라 어색하지만 아래 내용들을 알 수 있었습니다.
1. 함수의 파라미터는 역순으로 쌓아서 보낸다.
2. 함수의 리턴 값은 EAX에 저장된다.
3. CMP가 참이면 ZF가 1이 된다.
4. 윈도우 API를 찾아 GetDriveTypeA는 디스크 드라이브가 이동식, 고정, CD-ROM, RAM 디스크 또는 네트워크 드라이브인지 여부를 확인하고 값을 리턴한다.
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea
SECCON 2015 CTF-RPS (0) | 2020.11.03 |
---|