Study/Reversing

[CodeEngine] Basic RCE L01

줴림 2025. 4. 10. 11:39

동아리 과제로 CodeEngine Basic 문제를 풀기로 했다. 겹치는 문제 되도록 없이 풀기로(?) 했지만, 아무래도 1번부터 차근차근 푸는 게 좋을 것 같아서 난 1번부터 시작.

하자마자 난관 봉착.

계속 암호화가 어쩌고저쩌고... 하면서 Olly디버거로 열리지 않아서 과제 진행이 안되고 있었다. 유튜브의 도움을 받아 'Windows 보안 → 악성 소프트웨어 어쩌고 → 제외'에서 앞으로 과제 파일을 저장할 폴더를 제외시켜주고,
반디집을 다운받아서 압축을 풀었더니?

01.exe를 실행했더니 드디어 이런 메시지 창을 볼 수 있었다. 여기서 확인을 누르면 오른쪽과 같이 뜬다. 이번 문제는 HDD를 CD-ROM으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는지를 알아내면 된다. 벌써부터 쉽지 않아 보인다.

OllyDbg 사용해서 01.exe를 열면 다음과 같은 언어들이 보인다.

뭘 알아보기 전에 OllyDbg 단축키부터 알아야 할 듯. 이게 뭔... 아니 그리고 다른 블로그들 풀이랑 전혀 다른 코드들이 보이는데 이거 맞냐? 진짜 스트레스 받아서 못 살겠다. 2시간을 파일 열기만 하고 있었다.

다른 OllyDbg 다운받고 열었더니 드디어 뭔가 다른 화면을 볼 수 있었다. (싯팔...)

작아서 안 보이지만 ㅋ

코드를 보면 00401018에서 GetDriveTypeA라는 함수가 실행되고, 401024에서 EAX랑 ESI를 비교를 해주는데.. 알아보기 위해 breakpoint를 걸어보았다. 이대로 실행하면 어떻게 될까.

아까처럼 메시지 창이 뜨고 breakpoint를 준 00401018에서 멈췄다.

다시 F11을 눌러서 이어서 실행시키니까 2번째 breakpoint에서 멈췄다. 이후 코드를 보니까 EAX == ESI이면, 'JE SHORT 0040103D'가 실행이 된다. 이건 두 값이 같으면 0040103D 주소로 이동하라는 뜻. 0040103D 주소가 실행되면 HDD가 CD-ROM으로 인식됐다는 메시지가 나온다. 두 값이 같지 않으면 바로 다음 주소인 0040102A의 명령이 실행되므로 Error 메시지가 나온다.

그렇다면 성공 메시지로 넘기려면 어떻게 해야 하나. 일단 생각나는 건

1. JE를 JMP로 바꿔서 무조건적으로 점프하게 만드는 것
JMP로 바꾸고 F7 눌러서 하나씩 실행해보니까 무사히 정상 메시지로 넘어갔다.

JMP로 바꾸고 나서 결과. 성공 메시지가 나왔다! :p

 

2. EAX 값을 바꾸는 것
두 중단점 사이의 코드를 보면 무슨 연산이 어쩌고저쩌고 있다. 차례대로 ESI + 1, EAX - 1, ESI + 1, ESI + 1, EAX - 1를 의미하는데, 대충 정리하면 ESI + 3 == EAX - 2 이어야 정상 메시지로 출력한다는 거겠지. 그럼 EAX == ESI + 5. ESI 값이 00401000이니까 00401005를 넣으면 될까 싶었는데 안된다. 입력까지는 되는데 코드를 실행시키니까 00000001로 돌아감. 생각해보니 중단점은 해당 주소의 코드를 실행하기 전에 멈추는 거였어서, 그 다음 주소인 0040101D에 중단점을 걸고 EAX를 수정해야 한다. 그래야 GetDriveTypeA가 실행되고 난 이후의 EAX 값을 수정해서 비교할 수 있으니까!

아주 잘 보면, 난 지금 00401024에 있다. EAX랑 ESI 값 둘다 00401003으로 의도한 대로 잘 됐음을 볼 수 있다. 또 F11을 눌러서 실행하면 역시 성공 메시지가 뜬다. 굿굿