일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- BOF
- PWN
- Shadow 동아리
- 뉴스클리핑
- 웹해킹
- reversing
- termux
- ctf
- RITSEC CTF 2019
- NewsClipping
- SQL Injection
- writeup
- 리버싱
- webhacking
- requests
- Next.js
- Hackerschool
- buffer over flow
- x64dbg
- 리눅스
- RITSEC
- ftz
- Nop Slide
- 보안뉴스
- CodeEngn
- 버퍼오버플로우
- Linux
- HackCTF
- 어셈블리어
- Python
- Today
- Total
Jaeseo's Information Security Story
Codeengn Basic RCE 1번 문제 본문
01.exe 풀이 해설 - HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가
일단 프로그램을 구동 한 다음 구조를 살펴본다.
구조를 살펴보니 GetDriveTypeA를 실행 한 다음 리턴 값을 받고 비교를 하여 CD-Rom인지 아닌지를 확인 하는 프로그램 이다.
일단 작동이 시작 되면 메시지 박스를 출력한 다음 GetDriveTypeA API를 통해 리턴값을 eax에 저장을 하게 되는데 이때 인터넷 검색을 통해 어떤 리턴 값이 Cd-Rom 인지를 찾아 보았다.
CD-ROM은 eax에 5를 리턴 받아야 한다는 사실을 알게 되었다.
그런 다음 GetDriveTypeA API를 실행 한다음의 레지스터값과 그다음에 실행되는 어셈블리어를 분석하였다.
GetDriveTypeA API의 리턴값은 3으로 반환을 받았다.
이때 CD-ROM의 리턴값은 5를 받아야 하기 때문에 EAX의 레지스터를 5로 수정 한다.
그다음 ESI를 1 증가시켜 401000 à 401001로 변경이 되었고
EAX를 1 다운 시켜 5 -> 4로 변경이 되었다.
그 다음 JMP 401021로 이동한다.
그다음 ESI를 1씩 증가 두번을 하여 401001 -> 401003으로 변경이 되었다.
그리고 EAX를 1를 다운 시켜 4 -> 3으로 변경이 되었다.
이때 CMP를 하여 EAX와 ESI를 비교 하게 되는데
401003 과 3를 비교 하기 때문에 ZF는 0를 얻게 되고 CD-ROM이 아니라는 메시지가 출력 될것을 예상 하게 되었다.
ESI의 초기값이 401000이라는 값이 오기 떄문에 결국은 실제 “C:\\”이 CD-ROM이여도 오작동 한다는 것을 알게 되었다.
고로 해결 방법은 여러가지 방법이 나오게 되는데 ESI또는EAX 둘중 하나를 같게 수정 하는 방법과
또는 CMP를 한다음 ZF를 1로 변경하여 JMP를 작동하게 만든다.
그러면 최종적으로 위와 같은 화면을 볼수 있게 된다.
일단 이 문제를 제작자가 원하는 GetDriveTypeA의 리턴값은 5 이지만, 실제로 동작하도록 하는 리턴값은 401005이다.
정답 : GetDriveTypeA == 5 or 401005
pass : codeengn
'Write UP > Codeengn - basic' 카테고리의 다른 글
Codeengn Basic RCE 6번 문제 (0) | 2019.11.15 |
---|---|
Codeengn Basic RCE 5번 문제 (0) | 2019.10.14 |
Codeengn Basic RCE 4번 문제 (0) | 2019.10.14 |
Codeengn basic RCE 3번 문제 (0) | 2019.10.14 |
Codeengn Basic RCE 2번 문제 (0) | 2019.10.14 |