le0s1mba

[CodeEngn] Basic L01 본문

Security Challenges/CodeEngn

[CodeEngn] Basic L01

le0s1mba 2025. 3. 11. 22:07

https://codeengn.com/challenge/rce_basic


주어진 01.exe 파일을 실행시켜 보면 위의 사진처럼 HD를 CD-Rom으로 생각할 수 있게 만들어 보라고 한다.

 

해당 파일을 x32dbg로 열어 보면 이런 짧은 코드를 볼 수 있다.

누가 봐도 "YEAH!"를 출력해야 할 것처럼 보이므로 0x40103D로 jmp 하는 0x401026으로 이동해 보겠다.

 

바로 위에서 cmp eax, esi 연산을 하는데, je는 두 값이 같을 때 jmp 하므로 eax와 esi의 값이 같아야 한다.

근데 해당 eax와 esi는 inc와 dec 연산으로 값이 바뀌고 있다.

연산을 간단하게 정리하면 eax -= 2, esi += 3 연산을 진행 중이다.

 

가장 간단하게 이 문제를 푸는 방법은 cmp eax, esi 부분에서 두 레지스터 값을 바꾸는 것이지만, 문제에서 요구하는 대로 풀어볼 것이다.

 

문제 설명을 보면 GetDriveTypeA의 리턴 값이 무엇이 되어야 하냐고 묻고 있다.

https://learn.microsoft.com/ko-kr/windows/win32/api/fileapi/nf-fileapi-getdrivetypea

 

GetDriveTypeA 함수(fileapi.h) - Win32 apps

디스크 드라이브가 이동식, 고정, CD-ROM, RAM 디스크 또는 네트워크 드라이브인지 여부를 확인합니다. (ANSI)

learn.microsoft.com

해당 사이트로 이동해서 반환 값을 보면 DRIVE_CDROM이란 것이 있고, 설명에는 "드라이브는 CD-ROM 드라이브입니다."라고 적혀 있다.

현재 찾고 있는 것도 CD-ROM 이기 때문에 해당 값 5를 가지고 연산을 해보면 esi가 0이라고 쳤을 때, eax에 5를 넣어 두 레지스터의 값을 3으로 맞출 수 있다.

 

그럼 이제 0x40101D에 bp를 걸고 

저 eax의 값을 esi + 5로 바꾸게 되면 cmp에서 두 값이 같아지게 된다.

 

이렇게 실행을 해보면

문제를 풀 수 있다.


더보기
flag : 5

 

'Security Challenges > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic L06  (0) 2025.03.12
[CodeEngn] Basic L05  (0) 2025.03.12
[CodeEngn] Basic L04  (0) 2025.03.12
[CodeEngn] Basic L03  (0) 2025.03.11
[CodeEngn] Basic L02  (0) 2025.03.11