URL : https://ch.codeengn.com/
이제 올리디 버거(OllyDbg) 툴을 사용해 01.exe 실행파일을 열어보자!
그래도 안된다면 OllyDbg.exe 실행시키고 01.exe 파일을 실행시킨 OllyDbg.exe 에다가 드래그 앤 드롭 하면 된다.
Open with OllyDbg 클릭!
어셈블리어를 배워 본 적이 없으신 분들은 어셈블리어를 배워서 오길 바란다. (안 배우면 이해 잘 못함..)
막상 문제를 뜯어서 보게 되면 뭐부터 해야 할지 잘 모르는 경우가 있다. 따라서 우리는 어셈블리 코드 OEP부터 차근차근 (F8) 키를 누르면서 실행하자 그와 동시에 레지스터도 같이 확인하자
그러면 어느 순간 처음 우리가 실행했던 메시지 창이 띄워진 것을 확인할 수 있다.
그러면 MessageBox 함수를 호출했기 때문에 Text에 있는 글자가 출력이 된 것이다.
확인 버튼을 누르지 말고 레지스터 창 밑에 있는 것이 '스택(stack)'이라는 창이다.
스택(stack) : 실제 데이터가 저장되는 공간
그러면 스택(stack)와 어셈블리 코드를 같이 확인해 보자
PUSH라는 것은 말 그대로 '넣다' 라는 뜻이다.
따라서 빨간색 네모를 보면 PUSH 0 이니까 0을 넣어 준다는 뜻이다.
나머지 위 3개도 의미는 같다.
그리고 이제 확인을 클릭해보자
어! 레지스터 창에 EAX를 보면 1이라고 값이 바뀌었다!
계속 실행해보자..
INC ESI를 실행시켜보았더니 레지스터 창 ESI 값에 1 증가했다는 것을 알 수 있다.
그렇다면 INC ESI 코드를 분석하면 ESI값에 1을 증가시킨다 라는 뜻이다.
계속 실행해보자..
어! 코드를 실행시켰더니 EAX 값이 3에서 2로 줄어들었다.
그렇다면 DEC EAX 코드를 분석하면 EAX 값을 1 뺀다는 뜻이다.
JMP라는 것은 '무조건 점프해라'라는 뜻이기에 다음 코드를 실행하면 바로 밑에 있는 코드로 넘어간다.
사실 레지스터 창에 있는 EIP 값을 확인해 보면 '다음 실행할 주소'를 나타낸다.
ESI 값이 1 증가했으므로 2로 되었다.
또 ESI 값이 1 증가했으므로 3이 되었다.
CMP EAX, ESI 코드를 실행시키면 아무 일도 일어나지 않는다.
왜냐하면 이 코드에선 EAX와 ESI 값을 비교한다는 뜻이다.
계속 실행하자..
JE라는 코드는 CMP로 두 값을 비교했을 때, 비교 값이 둘 다 같으면 원하는 코드로 점프한다는 뜻이다.
(구글에 어셈블리어 조건 JMP라고 검색하면 다양한 조건 점프를 확인할 수 있다.)
따라서 현재 EAX 값은 1이고 ESI 값은 3이다 따라서 같지 않으므로 점프하지 않고 바로 밑에 있는 코드로 갈 수 있다는 것을 확인할 수 있다.
따라서 실패했다는 메시지 박스를 확인할 수 있다.
그러면 어떻게 해야 JE 조건을 만족하여 다음 코드로 넘어갈까?
눈치챘는 분들도 있겠지만 정답은
EAX 값을 변경하면 된다.
그렇다면 무엇으로 변경을 해야 할까?
기본 EAX 값은 3이었다.
다시 어셈블리 코드에서 INC와 DEC를 확인해 보자
ESI 값을 총 3번 증가시켰기 때문에 3이 나오고EAX 값을 총 2번 빼기 했기 때문에 3 - 2 = 1이 나온다.
그렇다면 기본 EAX 값을 5로 변경하게 된다면!?
ESI값은 총 3번 증가시켰기 때문에 3이 나오고EAX 값을 총 2번 빼기 했기 때문에 5 - 2 = 3이 나온다는 것을 확인할 수 있다.
어!? 값이 똑같잖아!
(Ctrl+F2) 키를 눌러 초기화시켜 처음으로 다시 돌아와 EAX 기본 값을 5로 변경시켜보자
여기에서 레지스터 창에 EAX 값을 더블 클릭해준다.
그러면 요런 창이 뜨고 Hexadecimal 값이 3인 걸 5로 변경해 주자 (다른 건 건드리지 마세요!)
그러면 이렇게 변경된 것을 확인할 수 있고
계속 실행하자..
그러면 EAX 값이 전에 나왔던 값 1이 아닌 3인 걸 확인할 수 있고 점프 또한 조건을 만족하여 점프를 했다는 것을 확인할 수 있다.
계속 실행하자..
문제에 보면
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴 값이 무엇이 되어야 하는가
답 : 5
이것이 첫 번째 원래 방법이다.
2번째 방법은 무엇일까?
힌트 : JE 코드를 잘 보아라
정답은 어셈블리어 코드 JE를 더블 클릭해서 JE -> JMP로 바꿔주면 된다.
전에도 말했듯이 (JMP는 무조건! 점프!라는 뜻이다)
Assemble 또는 Enter를 클릭하거나 누르면 된다.
그러면 이렇게 변경이 되고
코드를 실행시켜보면
첫 번째 방법에서 했던 거와 같이 성공했다는 메시지 창을 볼 수 있다.
'【 리버싱 】 > [ CodeEngn ] Basic RCE 문제 풀이' 카테고리의 다른 글
[ CodeEngn ] Basic RCE 6 문제 풀이 (0) | 2021.07.21 |
---|---|
[ CodeEngn ] Basic RCE 5 문제 풀이 (0) | 2021.07.19 |
[ CodeEngn ] Basic RCE 4 문제 풀이 (0) | 2021.07.19 |
[ CodeEngn ] Basic RCE 3 문제 풀이 (0) | 2021.07.18 |
[ CodeEngn ] Basic RCE 2 문제 풀이 (0) | 2021.07.17 |