공부

    8장 abex' crackme #2 (abexcm2) - 나의 풀이

    이번 abex 2nd crackme 는 조금 어렵다 ㅎㅎ 아직 처음이라 그런지 많이 어려웠다. 그래두 어떻게 어떻게 해서 해결 방법을 스스로 알아냈다. VB로 개발된 프로그램이고, Windows Form으로 만들어져 있다. 기분이 매우 나쁘게 디자인되었다. 1999년도에 개발된 것 같다........ Name -> a , Serial -> a 로 Check해보겠다. Name -> aaaa, Serial -> aaaa도 안된다. 올리디버거로 분석해보자. 40123D 주소에서 F8을 눌렀는데, 자동으로 실행되어 버렸다. 저 주소에서 F7을 통해 들어가보자. 스택프레임을 형성하는 코드가 보였다. 아직 Form이 로드되지는 않았으니 F8을 통해 계속 가보자. 733735FB 주소에서 프로그램이 하나 실행된것이 ..

    7장 스택 프레임 (궁금한 것 있었으니 다시 읽어볼 것.)

    스택 프레임 (Stack Frame)은 프로그램에서 선언되는 로컬 변수와 함수 호출에 사용된다. 이를 이해하고 나면 스택에 저장된 함수 파라미터와 함수 로컬 변수 등이 쉽게 파악된다고 하니 열심히 공부해보자. 스택 프레임 스택 프레임은 ESP(스택 포인터)가 아닌 EBP(베이스 포인터) 레지스터를 사용해 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법이다. 복습 겸, ESP는 스택 포이터 역할을 하고, ebp는 베이스 포인터 역할을 한다. ESP는 프로그램 안에서 수시로 변경되기 때문에 스택에 저장된 변수, 파라미터에 접근하고자 할 때 ESP를 기준으로 하면 프로그램을 만들기 어렵고, 위치를 찾기 힘들 것이다. 그러므로 나온 개념이 ESP를 임시로 EBP에 저장해주고 이를 함수 내에서 유지해..

    6장 abex' crackme #1 - 책의 풀이

    책은 어떻게 풀었을지 매우 궁금하다. 자려고 하였지만 읽고 자야겠다. 내가 푼 방법이랑 다른 방법만 알아보도록 하자. 책은 JE를 JMP로 바꾸어 풀기만 했다.... l0rq2.tistory.com/38 6장 abex' crackme #1 - 나의 풀이 드디어 CrackMe를 풀어본다. 간단한 crackme라고 한다. 그러므로 먼저 나 스스로 풀어보고 책을 봐야겠당 문제에서는 HD라고 했지만, 아마 HDD를 의미하는 것 같다. 이 프로그램이 내 HDD를 CD-Rom으로 인 l0rq2.tistory.com 윗 글 참고해서 다시한번 읽어보자 하지만, 책에서 중요시하는 점은 바로 스택이다. MessageBox()함수를 호출하기 전에 PUSH를 하고 있는 것이 보인다. 위의 방식으로 PUSH를 하게 되면 Sty..

    6장 abex' crackme #1 - 나의 풀이

    드디어 CrackMe를 풀어본다. 간단한 crackme라고 한다. 그러므로 먼저 나 스스로 풀어보고 책을 봐야겠당 문제에서는 HD라고 했지만, 아마 HDD를 의미하는 것 같다. 이 프로그램이 내 HDD를 CD-Rom으로 인식하도록 만들어야 할 것 같다. 확인을 눌러보면 틀렸다고 뜬다. 단순히 CD-ROM으로 인식했을 때의 메시지 Text가 뭔지 보는게 아니라, 메시지박스를 띄워야 하는 것 같다. GetDriveType API를 통해 C:\ Type을 알아내는 것 같다. vlindersec.tistory.com/24 [WINAPI] GetDriveType 함수 GetDriveType 함수의 원형 UINT WINAPI GetDriveType( _In_opt_ LPCTSTR lpRootPathName ); 인..

    5장 스택

    로컬 변수 저장, 함수 파라미터 전달, 복귀 주소 저장등의 다양한 용도로 사용된다. 디버깅할 때 스택 메모리를 확인하는 일이 매우 많다고 한다. 스택의 원리를 잘 알아보자. 먼저, 프로세스에서 스택 메모리의 역할을 알아보자 1. 함수 내의 로컬 변수 임시 저장 2. 함수 호출 시 파라미터 전달 3. 복귀 주소(return address) 저장 이런 역할을 수행하기 위해서는 First in Last Out 구조가 매우 유용하다. 프로세스에서 ESP(스택 포인터)의 초기 값은 StakBottom이다. PUSH 명령으로 스택에 값을 추가해 나가고, 스택 포인터는 Top을 향해 갈 것이다. POP명령으로 스택이 값을 빼나가면, 스택 포인터는 bottom을 향해 갈 것이다. 위의 그림을 보면 알 수 있듯이 스택에..

    4장 IA-32 Register

    내가 제일 어려워하는 부분이다. 진짜 어렵다. 많이 어렵다. 매번 리버스 엔지니어링을 공부하면 이 부분에서 포기하였다. 끝까지 해보자!@!~@!@ 레지스터? 레지스터가 무엇일까? 레지스터는 CPU 내부에 있는 다목적 저장 공간이다. CPU가 RAM의 정보를 읽기 위해서는 물리적으로 시간이 좀 걸리지만, CPU 내부의 레지스터는 한 몸이라 고속으로 데이터를 처리할 수 있다. IA-32 레지스터 안에는 기능도 무척 많고 그에 따른 종류도 많다. 그런 많은 종류들 중에서 Basic program execution register에 대하여 알아보자. Basic program execution register 이 레지스터는 4개의 그룹으로 나눌 수 있다. General Purpose Registers (32비트 ..