티스토리 뷰

CodeEngn Basic RCE의 1번 문제입니다.





HDD를 CD-Rom으로 인식시켜주 GetDriveTypeA의 리턴값을 구해야 하는 문제군요.


파일을 다운로드 받아보겠습니다.





'Reverse_L01'이라는 이름의 파일입니다.


실행시켜 보겠습니다.




"너의 HD를 나의 CD-ROM으로 생각하게 만들어라"라는 문자열이 나오네요.


OK를 눌러보면,




어쨌든이것은 CD-ROM이 아니다!”라고 뜨네요.



파일을 올리디버거로 열어보겠습니다.





먼저 MessageBoxA 함수부터 살펴보겠습니다.


MessageBoxA 함수란 이름 그대로 메시지 박스를 띄워주는 함수입니다. 내용을 보면 아까 파일을 실행했을 때 나왔던 문자열들이 보이네요.


그런데 아까 확인하지 못한 문자열이 하나 있네요.


바로 “OK, I really think your HD is a CD-ROM! :p”라는 문자열입니다.


드라이브가 CD-ROM 일 때 나타나는 성공 문자열인 것 같네요.


우리는 HDDCD-ROM으로 인식시키기 위해서 GetDriveTypeA의 리턴값을 구해야 하므로 성공 문자열을 띄어야 한다는 것이네요.


먼저 GetDriveTypeA의 리턴값을 보기 위해서 GetDriveTypeA 함수까지만 실행해보겠습니다.






함수가 호출되고 종료되었습니다.


이제 레지스터 창에서 리턴값을 확인해보겠습니다.






EAX 레지스터는 리턴값을 담는 레지스터입니다.


그러므로 GetDriveTypeA의 리턴값은 3입니다.






계속 실행하다 보면 EAX2번 감소하고, ESI3번 증가합니다.


그래서 CMP 비교문까지 오게 되면 EAX1, ESI3이 됩니다.


여기서 JE 명령어란 Zero Flag의 값이 0이면 점프하는 것입니다.


Zero Flag의 값을 0으로 설정 하려면 CMP EAX, ESI을 했을 때 EAX와 ESI의 값이 같아서 0이 나와야 합니다.


하지만 여기서는 EAX ESI가 다르므로 Zero Flag의 값이 1이 되어 JE 명령문에서 점프를 하지 않고 실행되어 실패 문구를 띄우므로 우리는 EAX ESI의 값을 맞춰줘야 합니다.


그럴러면 EAX2가 더 커야 하므로 우리는 GetDriveTypeA의 리턴값인 EAX+2 시켜주어야 합니다.


다시 실행 시켜 주어서 GetDriveTypeA의 리턴값을 +2 해주고 실행을 시켜주면






EAX와 ESI의 값이 각각 3이 되어 일치가 됩니다.






EAX ESI의 값이 일치하므로 JE문에서 점프를 하여 0040103D로 오게 됩니다.






계속 실행시켜주다 보면 성공 문자열을 띄우게 됩니다.






코드엔진 사이트에 수정한 GetDriveTypeA의 리턴값을 인증해보겠습니다.







댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함