일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Old-14
- Old-17
- 코딩테스트 연습
- 네트워크
- boj
- 코드엔진
- 웹케이알
- JS
- openCV
- 리버싱
- webhacking.kr
- old-1
- 신규 아이디 추천
- 웹해킹
- 백준
- C언어
- 게임 프로그래밍
- c언어 게임
- 딥러닝
- c++
- 퍼셉트론
- 10809
- 프로그래머스
- 소프트맥스 함수
- 5585
- tcp
- 자바
- 계단함수
- 자바스크립트
- 크레인 인형뽑기
- Today
- Total
SteffenLee
[CodeEngn]basic 01 본문
코드엔진 basic 01번은 HDD를 CD-Rom으로 인식 시키기 위해서 GetDriveTypeA의 리턴 값을 알아내는게 이 문제의 핵심입니다.
그러면 올리디버거로 열어보겠습니다.
그러면 이런 화면이 뜹니다.
어셈블리 코드를 보겠습니다.
어셈블리 코드를 보시면 MessageBoxA와
GetDriveTypeA가 가장 눈에 띕니다.
MessageBoxA는 메세지 박스를 띄우는 함수이고,
GetDriveTypeA는 드라이브 타입을 알려주는 함수 같군요.
여기서 문제를 한번 다시 봅시다.아까 문제가 HDD를 CD-Rom으로 인식시키기 위해
GetDriveTypeA의 리턴 값을 알아내는게 문제였죠.
그럼 저희가 집중해야 할 것은 GetDriveTypeA를 실행한 후 나온 리턴 값이겠군요.
그리고 그 밑을 보면 에러가 났을 때 뜨는 문구도 있고, 성공 했을때 뜨는 문구도 있군요.
GetDriveTypeA 바로 밑 어셈코드에 BP를 걸고 F9를 눌러 실행 시켜보겠습니다.
실행하면 함수는 정상 작동되고 프로그램이 BP에서 멈추게 됩니다.함수의 리턴 값은 EAX 레지스터에 저장되게 됩니다.그럼 오른쪽에 여려 레지스터 값이 있는 곳을 보시면 EAX 값이 변경된 것을 볼 수 있습니다.
그렇다면
GetDriveTypeA 함수의 리턴 값은 3이 되겠군요.
GetDriveTypeA 함수 이후의 어셈코드를 봅시다.
이런 식으로 어셈코드가 있습니다
하나씩 보자면
INC ESI는 ESI 레지스터에 1을 더해줍니다.DEC EAX는 EAX 레지스터에 1을 빼줍니다.JMP SHORT Reverse_.00401021은 00401021로 점프합니다.
그럼 저 코드가 다 실행된다면, ESI는 3이 증가하고 EAX는 2가 감소하게 됩니다.
우리가 생각한 것이 맞는지 확인해봅시다.
CMP EAX, ESI까지 실행시키고 난후 레지스터값을 보면
EAX 값이 3에서 1로 감소하고, ESI 값이 00401000에서 00401003으로 증가한 것을 볼 수 있습니다.
그럼 이제 아까 실행을 멈췄던 부분을 봅시다
CMP EAX, ESI는 EAX 값과 ESI 값을 비교하게 됩니다.
그리고 그 밑에 코드인
JE SHORT Reverse_.0040103D는 ZF가 1이면 실행하게 됩니다.
CMP EAX, ESI 부분을 보면 위에서 말했듯이 값을 비교하게 됩니다.
값이 같으면 ZF(Zero Flag)라는 곳에 값이 1로 바뀌고 다르면 0이 됩니다.
그럼 현재 EAX와 ESI 값이 다르니 0이 되겠군요.
확인을 위해서 실행시켜봅시다.
Z로 돼 있는 부분이 ZF를 나타내는 부분입니다.
예상했던 대로 0입니다. 그렇게 되면 JE문이 실행이 안 되고, 실패하게 됩니다.
그럼 EAX와 ESI 값을 연산했을 때 EAX는 2 감소, ESI는 3이 증가하였습니다.
EAX 값이 2를 증가해야 연산했을 때 2를 감소해도 ESI와 값이 똑같아져서 JE문이 실행되게 될 것입니다.
EAX 값이 5가 되어야 2를 감소해도 3이 되어 ESI 값과 같아집니다.
그럼 한 번 바꿔보러 갑시다.
Ctrl + F2로 재시작 해주시고 아까 전 처럼 GetDriveTypeA 다음 부분까지 실행시켜주시고 오른쪽에 EAX 레지스터 값을 더블클릭해서
바꿔줍니다.
이런 식으로 바꿔주시면 됩니다.
저는 ESI 레지스터가 00401000으로 시작하기 때문에 EAX 레지스터값을 저렇게 바꿔준 거기에 여러분은 여러분대로 바꿔주시면 됩니다.
OK를 눌러주시면 레지스터 값이 바뀝니다.
이제 F9를 눌러주시면
성공입니다!
저희가 EAX와 ESI를 같게 하기 위해 GetDriveTypeA의 리턴되서 나온 EAX 값 3을 5로 바꾸어주었습니다.
그럼 이 문제의 답은 5입니다.
이 문제는 abex' crackme 1번이기에 다른 풀이도 올리겠습니다.
아주 간단한 방법으로 풀 수 있습니다.
방법 1.
아까 CMP로 EAX, 와 ESI를 비교했었습니다.
그럼 이 부분을 CMP EAX, EAX 나 CMP ESI, ESI로 변경하면 어떻게 될까요?
자기 자신과 비교하기에 ZF가 1이 되겠죠? 그럼 JE문이 실행되고 성공하게 됩니다.
방법2.
JE문은 jump if equl이어서 ZF가 1이어야만 실행되는 명령입니다.
그럼 저 문을 어느 조건이든 실행되게 바꾸면 실행이 되겠죠?
JMP라는 문이 있는데 이 구문은 그저 특정 지역으로 점프합니다.
JE를 JMP로만 바꿔준다면 ZF에 상관없이 성공 문구가 뜨는 주소로 점프를 하게 됩니다.
이런 풀이를 처음 올려봐서 많이 부족합니다. 문제점이 있다면 지적해주시면 감사하겠습니다.
감사합니다.
'Reversing > CodeEngn' 카테고리의 다른 글
[CodeEngn]basic 06 (0) | 2018.01.07 |
---|---|
[CodeEngn]basic 05 (0) | 2018.01.05 |
[CodeEngn]basic 04 (0) | 2018.01.03 |
[CodeEngn]basic 03 (0) | 2018.01.01 |
[CodeEngn]basic 02 (0) | 2017.12.29 |