- Today
- Total
Phantom
Crackme – 1 본문
리버싱의 처음을 대표한다고 해도 모자라지 않을 abex crackme 1 이다
이것을 나도 처음 리버싱을 배울 때 풀어 본 적이 있다.
그리고 아주 잠깐 어떤 스터디를 들었는데 거의 리버싱 스터디였다.
난 견디지 못하고 나왔다.
그 때 당시 이제 레지스터를 익히는 중 이고 함수 프롤로그 에필로그 등등 메모리의 기초를 익힐 때라 정말 힘들었다.
그러다 어쩌다 줏어 들었던 EAX값이 5여야 원하는 방향으로 분기가 된다는 것을 들은 것이 전부이다.
JMP 방식도 알긴 하는데 다 적어볼까 한다
우선 프로그램을 실행 해보자
음…하드를 CD-Rom으로 인식하게 하라고 하며
CD-Rom이 아니라며 시무룩해한다.
디버깅 툴로 자세히 살펴보려 한다 ida를 사용 했다.
여태 gdb만 사용하다가 이것을 사용하니 처음엔 조금 어려웠다
우선 기존의 디버깅 툴과는 다르다는 것이 첫 번째.
헥스레이가 되는지 안되는지 몰라서 이것저것 깔아본 것이 두 번째
그리고 그래프 뷰어로 보이는 큰 틀을 보고 내부로 어찌 들어가야 할 지, BP등등 여러 단축키를 익히는 것이 세 번째
표현 방식이 조금 달라 힘들어 한 것이 네 번째 이다.
이제 디버깅을 해보자.
이 것이 큰 틀이다.
자세히는 모르겠다 GetDriveTypeA 함수를 실행 한 후에 ESI, EAX의 증감이 일어난 다음 점프를 한다.
그리고 또 다시 ESI, EAX의 증감이 일어난 후 EAX와 ESI를 비교하고 분기를 한다.
한쪽은 실패, 남은 한쪽은 성공이다.
그리고 프로그램은 종료된다.
어…그래 일단 Text View로 직접 들여다 보자.
MessageBoxA는 별게 없으니 GetDriveTypeA함수에 BP를 걸고 F9를 눌러 디버깅을 한다.
이 함수의 내부를 들여다 보아 어떤 원리로 되는지 보려 했는데 전혀…모르겠더라.
그래서 일단 F8로 넘겼다.
EAX가 3으로 바뀌었다.
그리고 그 아래의 연산을 하고 비교연산을 한 후 ZF가 1이면 점프를 한다.
값이 다르므로 점프를 하지 않고 아래 명령어들을 실행하는데 무엇인가 하니
실패했다. 뭐..아직 아무런 변조를 하지 않았으니 당연한 결과이기도 하다. 마지막 JMP문은 EXIT_PROCESS이다.
한가지 의문점이 있는데 EAX와 ESI를 비교하는데 왜이리 값이 많이 차이가 나는 것인지 의문이다.
아까 전에 GetDriveTypeA함수 내부로 들어갔는데 EAX와 ESI의 차이가 너무 많이 난다.
뭐…이건 그냥 그냥인 의문이다.
아무튼 EAX와 ESI를 비교할 때, 비교 값을 같게 하거나, JZ명령어를 JMP로 바꾸거나, EAX를 변조하면 원하는 방향으로 분기가 가능하다.
그리고 우선 왜 EAX값이 3이 나와야 하는지부터 아는 것이 먼저이다
그래서 저번에 강의 들은 대로 msdn에 API를 검색하려 구글링을 했는데 자바 API처럼 검색페이지 자체가 있는 것은 아닌 것 같더라
함수 이름과 msdn을 치니 GetDriveType 함수가 나오더라
그리고 검색한 흔적도 있더라. 이것이다 생각하고 들어갔다.
GetDriveTypeA는 뭐지…뭐 아무튼 설명을 보니 리턴 값이 설명되어있더라.
음…지금 필요한 것은 HDD를 CD-Rom으로 바꾸는 것인데 return 값이 3이었다.
그럼 DRIVE_FIXED라는건데 뜻이… 하드 아니면 플래시가 들어갔다는 소린데..
하드로 인식한 것이다. 그렇다면..방법은 JZ를 JMP로 바꾸는 것이나, 비교연산 전에 값을 서로 맞추는 것, 아니면 함수 내부에서 반환 값을 조작하는 것인데.. 마지막 방법은 모르겠다.
GetDriveTypeA안의 GetDriveTypeW에서 3으로 리턴 해 주는데 자세히는 모르겠다.
그럼 아는 것 두 가지를 설명하겠다.
우선 JZ를 JMP를 바꾸는 것이다. 별거 없다 진짜 JZ를 JMP로 바꾸는 것이다.
문제가 생겼다. 원래 이뮤니티나 다른 디버거라면 더블클릭 해서 바꿀 수 있는데
아이다에서는 되지 않는 것 같다 바꿔도 JZ의기능을 한다.
아무튼 그 기능은 되지 않으니 이뮤니티로 하겠다.
이번엔 비교 값 수정이다.
리턴 값이 5로 만드는 것은 아직 어려운 것 같다.
아, 그리고 하나 의문점이 있는데
GCC로 짠 Hello world 프로그램을 PEID에 넣고 돌렸는데 무엇으로 짠지 모른다고 하더라.
VS2010으로도 마찬가지고.. 음..의문이다.
'Pwnable > Crackme 처음 풀 때' 카테고리의 다른 글
Crackme – 6 (0) | 2016.03.01 |
---|---|
Crackme – 5 (0) | 2016.03.01 |
Crackme – 4 (0) | 2016.03.01 |
Crackme – 3 (0) | 2016.03.01 |
Crackme – 2 (0) | 2016.03.01 |