CodeEngn Challenges Basic RCE L01 abex crackme#1 풀이과정입니다.
실행결과
CD-ROM으로 인식시키는 문제입니다
확인 버튼을 누르면 CD-ROM 드라이브가 아니라는 메세지박스가 나옵니다
이번에는 총 3가지 방법으로 해당 부분을 우회해보겠습니다.
첫번째 방법 , 범용 레지스터 중 ESI 레지스터 변조
PE Header를 확인해보겠습니다.
시작주소(ImageBase + Address of Entry Point)는 004010000 입니다.
디버거로 프로그램 확인을 해보겠습니다.
사진으로 보면 윈도우10 환경에서 디버거로 확인할 경우 ESI 레지스터에 401000가 쌓인것을 확인할 수 있습니다.
윈도우7은 ESI레지스터가 0부터 시작인데 윈도우10의 경우 ESI레지스터가 시작주소로 되어있습니다.
윈도우10으로 넘어가면서 운영체제 방식이 바뀌어 레지스터에 시작주소가 채워지는걸로 추측됩니다.
아래 사진은 윈도우7에서 디버거로 확인한 결과입니다.
윈도우10과는 다르게 ESI레지스터가 0으로 시작하는것을 확인할 수 있습니다
이점을 유의하고 윈도우10 환경에서 진행하도록 하겠습니다.
차례대로 분석해보니 GetDriveTypeA 함수를 확인할 수 있습니다.
GetDriveTypeA 함수는 인자로 전달받은 드라이브가 어떤 종류의 드라이브인지 판별하여 값을 리턴해줍니다.
GetDiveTypeA에서 하드디스크로 인식하여 EAX레지스터에 리턴값이 3으로 반환되는것을 확인하였습니다.
CD-ROM으로 인식시키기 위해 EAX레지스터를 5로 변조합니다.
연산과정을 거쳐 EAX레지스터가 3이 되는것을 확인하였습니다.
CMP비교문을 통해 EAX값과 ESI레지스터값을 비교합니다.
윈도우7의 경우 지정한 부분에 연산 과정을 거쳐 EAX, ESI 레지스터의 값을 맞춰줬지만,
윈도우10의 경우 ESI레지스터의 기본값이 시작 주소(00401000)으로 되어 GetDriveTypeA 리턴값을 5로 변조하여도 값이
같아지지 않습니다.
윈도우7 연산 후 레지스터 값 | 윈도우10 연산 후 레지스터 값 | |
EAX레지스터 | 3 | 3 |
ESI레지스터 | 3 | 00401003 |
EAX레지스터, ESI레지스터 비교문(CMP) 전에 ESI 레지스터 변조
ESI레지스터: 00401003 -> 3
레지스터 비교후 같으면 해당 주소(40103D)로 점프
성공
두번째 방법 , EFLAGS(플래그 레지스터) 변조
EFlags란 시스템 제어 또는 어셈블리의 처리 조건 용도 등 여러 상태 저장에 사용되는 레지스터이다.
Zero Flag(ZF)
제로 플레그는 산술 논리 연산의 결과가 0일 때에 1로 설정한다. 리버스 엔지니어링에서는 제로 플레그는 구조를 추적하는데 매우 중요한 플래그이다.
두개의 operand를 비교하는 CMP명령어를 수행하여 동일하다면 ZF값은 1, 동일하지 않다면 ZF값은 0으로 출력
(Zero Flag(ZF): 연산 명령 후 결과 값이 0 되면 ZF값은 1(True)로 된다.)
비교문이 참 값으로 반환되는 1로 변조
성공
세번째 방법 , 분기 명령어 변조
비교 명령어인 JE명령어를 JMP나 JNE로 변조시켜 비교하지 않고 강제로 JMP하게 만든다.
성공