상세 컨텐츠

본문 제목

CodeEngn Basic RCE L01

REVERSING/Reversing Study

by koharin 2021. 5. 1. 17:56

본문

728x90
반응형

IDA Pro로 01.exe 파일을 열었을 때 80386 PE 파일로 인식돼서, 32bit IDA로 열고, x32dbg 디버거를 사용해서 01.exe 파일을 열었다.

IDA,, Binary Ninja를 통해 0x401000이 EntryPoint임을 확인했고, x32dbg에서 Ctrl + G로 401000으로 EntryPoint로 이동했다.

초기 화면에서 F9를 눌러도 EntryPoint 자동으로 찾아준다.

 

eax 레지스터에 GetDriveTypeA의 반환값이 저장되므로, GetDriveTypeA 실행 후 리턴한 주소에 bp를 걸어서 eax 레지스터 값을 확인한다.

일단, Binary Ninja, IDA에서 Graph View로 보면 조건에 따라 2가지 루트가 있는데, HDD를 CD로 인식하는 부분으로는 MessageBoxA가 YEAH를 출력하도록 해야한다.

YEAH를 출력하는 조건으로 GetDriveTypeA의 리턴값, 즉 (eax 레지스터 값 - 2) == (esi 레지스터 + 3)와 동일해야 한다.

조건을 맞추기 위해서는 디폴트로 GetDriveTypeA 호출 이후 esi 값 증가 전 eax와 esi 레지스터가 어떤 값을 가지는지 알아야 한다.

그럼 x32dbg를 사용해서 GetDriveTypeA 호출 이후 INC esi 전 eax와 esi 레지스터 값을 알아보자.

F7로 계속 실행시켜가면서 inc esi를 eip가 가리켰을 때 레지스터 값을 확인해봤다.

 

 

EAX 레지스터는 3, ESI 레지스터는 0x401000 값, 즉 0을 가지고 있다.

GetDriveTypeA 함수의 리턴값이 3인 것이다.

INC esi에서 1 증가해서 esi 레지스터가 0x401001 값이 됐다.

DEC eax에서 eax 레지스터 값이 2가 된다.

이후 2번의 inc esi와 1번의 dec eax를 거친 후 eax와 esi 레지스터 값을 비교한다.

je 01.40103D에서 eax와 esi 레지스터 값이 동일해야 YEAH를 출력하는 MessageBox를 볼 수 있다.

 

0x401000(ESI) + 3 == EAX - 2 (ESI와 EAX는 모두 증감 전 값)

EAX = 0x401000 + 5 = 0x401005

레지스터 값은 레지스터에 커서 놓고 Enter 눌러서 편집할 수 있다.

변경한 것을 확인할 수 있다.

cmp에서 eax와 esi 레지스터 값이 동일하다.

성공적으로 0x40103D로 EIP가 가리킨다.

Ctrl + F9로 함수 내부에서 나가고, 성공적으로 YEAH 메시지박스를 띄웠다!

 

0x401005에서 0x401000은 주소이므로, GetDriveTypeA 함수의 리턴값(EAX)은 5이다.


GetDriveType 함수는 드라이브를 인자로 전달받고 해당 드라이브가 어떤 종류의 드라이브인지 리턴값으로 알려준다.

다음은 GetDriveType 함수의 리턴값이다.

Return Code Description
DRIVE_UNKNOWN
0
The drive type can't be determined.
DRIVE_NO_ROOT_DIR
1
The root path is invalid; for example, there is no volume mounted at the specified path.
DRIVE_REMOVABLE
2
The drive has removable media; for example, a floppy drive, thumb drive, ir flash card reader.
DRIVE_FIXED
3
The drive has fixed media; for example, a hard disk drive or flash drive
DRIVE_REMOTE
4
The drive is a remote (network) drive.
DRIVE_CDROM
5
The drive is a CD-ROM drive.
DRIVE_RAMDISK
6
The drive is a RAM disk.

따라서 현재 드라이브는 HDD이기 때문에 GetDriveType 함수의 리턴값이 3인 것이고, CD-ROM으로 인식시키고 싶으면 GetDriveType 함수의 리턴값을 5로 변조하면 된다.

GetDriveType 함수에 대해 찾아볼까 했는데 그냥 디버깅으로 풀어가고 싶어서 안 찾아봤는데, 이런 방법으로도 풀 수 있었다.

728x90
반응형

'REVERSING > Reversing Study' 카테고리의 다른 글

CodeEngn Basic RCE L03  (0) 2021.05.03
CodeEngn Basic RCE L02  (0) 2021.05.02
리버싱 입문 2. 어셈블러  (0) 2021.04.06
asm 분석: 어셈블리 코드에서 소스 코드 변환해보기  (0) 2021.04.05
x86_64 assembly code  (0) 2021.04.04

관련글 더보기