혹시나 어셈블리어를 모르시는 분들은
반드시 어셈블리어를 공부하시고 문제 풀이에 임하시기 바랍니다 ^_^
GetDriveTypeA의 리턴값을 물어보는군요!
가장 대표적인 Ollydbg로 열어보겠습니다 :D
OllyDbg v1.10
www.ollydbg.de
Ollydbg는 대표적인 디버거 툴로 위의 사이트에서 간단하게 다운받으실 수 있습니다 :D
이렇게 어셈블리어가 나옵니다!
어셈블리어란?
쉽게 말하면, 컴퓨터의 언어인 기계어를 사람이 보기 쉽게 변환한 언어라고 생각하시면 됩니다 :D
더 자세히 알고 싶으시면 밑의 사이트를 읽어 주세요!
https://ko.wikipedia.org/wiki/%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4
어셈블리어 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 어셈블리어(영어: assembly language) 또는 어셈블러 언어(assembler language)[1]는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 컴퓨터 CPU마다 지원하는 오퍼레이션의 타입과 개수는 제각각이며, 레지스터의 크기와 개수, 저장된 데이터 형의 표현도 각기 다르다
ko.wikipedia.org
자! 차례대로 분석해봅시다!
다들 잘 아시겠지만 혹시 모르시는 분들을 위해서 ~_~
먼저 간단한 단축키를 알려드리겠습니다!
[F7] 명령어 실행(함수 진입 O)
[F8] 명령어 실행(함수 진입 X)
[Ctrl+F2] 프로그램 재시작
[F8]을 눌러서 열심해 내려갑시다!
MessageBoxA 함수를 만납니다!
다들 잘아시겠지만
오른쪽에 보면 Style, Title, Text, h0Wner 보이시죠?
이것들은 MassageBoxA의 인자입니다!
함수를 불러올 때 인자를 먼저 넣고 함수를 부른다는거 잊지마세요 !
함수가 반환되면 EAX 레지스터에 값을 저장시킵니다 :D
GetDriveTypeA가 3이 반환이 되는군요!
[F8]을 이용해서 계속 내려가 봅시다!
내려가면
CMP 명령어를 통해 EAX, ESI를 비교하고
JE 명령어를 통해 40103D로 점프할지를 정합니다.
JE는 EAX, ESI가 같으면 정해진 주소를 넘어갑니다!
(정확히는 ZF가 1이 되면 넘어가게 됩니다. 이부분은 찾아서 공부해보시기 바랍니다.)
하지만 EAX(1), ESI(401003)이 서로 다르기 때문에 계속 실행하여
원하는 것을 얻지 못하게 되죠!
그럼 문제에서 GetDriveTypeA가 무엇이 되어야 CD-Rom을 인식시킬 수 있냐인데!
반환값이 3이 아니라 다른 값이어야겠죠!
비교문에서 401003의 값을 맞춰주기 위해
뒤에서 EAX 레지스터 값이 총 2번 감소하기때문에
"401005"를 반환시키면 401003이 되겠죠 :D
INC REG => REG값을 1 감소 시킨다.
DEC REG => REG값을 1 증가 시킨다.
EAX 레지스터를 더블클릭하여 강제로 값을 변환시켜보았습니다!
그리고 조건문까지 내려갑시다 :D
조건문에서 EAX와 ESI가 401003으로 같은 값이 된거 보이시나요 :D
그래서 조건이 만족하기 때문에 40103D로 점프하게 됩니다!
(ZF가 1이 된것도 확인하셔야 합니다!)
쨘! 이렇게 원하는 인식 시킬 수 있게 되었습니다!
그럼 GetDriveTypeA가 반환되어야 하는 값은 "401005"가 되겠네요 :D
그럼 다음문제에서 뵙도록 하겠습니다 !
'CTF > CodeEngn.kr' 카테고리의 다른 글
Basic RCE L06 (0) | 2020.02.12 |
---|---|
Basic RCE L05 (0) | 2020.02.10 |
Basic RCE L04 (0) | 2020.02.09 |
Basic RCE L03 (0) | 2020.02.07 |
Basic RCE L02 (0) | 2020.02.03 |