전체 글 (49) 썸네일형 리스트형 스택이란? 스택(stack) 스택은 로컬 변수 저장, 함수 파라미터 전달, 복귀 주소 저장 등의 다양한 용도로 사용된다. 디버깅 할 때 스택 메모리를 확인하는 일이 맹무 많기 띠ㅐ문에 스택의 동작 원리에 대해 잘 알아두면 디버깅에 큰 도움이 된다. 스택의 역할 1. 함수 내의 로컬변수 임시 저장2. 함수 호출 시 파라미터 전달3. 복귀 주소(Return Address) 저장 스택의 특징 일반적으로 스택 메모리는 PUSH를 통해 메모리에 추가되면 스택 포인터는 위로 올라가고 POP 명령을 통해서 스택에서 제거되면 아래쪽으로 움직인다. 말그대로 쌓는다고 생각하면 생각하면 편하다. 스택은 스택 포인터가 초기값은 스택 메모리 아래쪽에 있다는 것을 알아두자 IA-32 Register 기본 설명 애플리케이션 디버깅의 디버깅을 위해기본적으로알아야 할 IA-32(Intel Architecture 32비트)의 레지스터에 대하여 알아보도록 하자. CPU 레지스터란? 레지스터(Register)란 CPU 내부에 존재하는 다목적 저장 공간이다. 우리가 일반적인 메모리라고 하는 RAM과는 성격이 다른데 RAM은 메모리를 물리적으로 멀리 돌아가야 때문에 떄문에 시간이 오래 걸리지만 레지스터는 CPU 내부에 있기 때문에 고속으로 데이터를 처리할 수 있다. 레지스터에 대해서 알아야 하는 이유 리버싱 초급 단계에서 애플리케이션 디버깅을 잘 하려면 디버거가 해석해주는 어셈블리 명령어를 공부해야 한다. IA-32에 제공하는 어셈블리 명령어는 매우 방대한 양이라서 한번에 공부하기는 쉽지 않다. 어셈블리명령어는 대부분은 레.. 리틀 엔디언 표기법 컴퓨터에서 메모리에 데이터를 저장하는 방식을 의미하는 바이터 오더링(Byte Ordering)의 리틀 엔디언 표기법과 빅 엔디언 표기법이 있다. 바이트 오더링은 데이터를 저장하는 방식을 말하는 것이라고 생각하면 되는데 이는 애플리케이션 디버깅을 할 때 알아두어야 하는 기본 개념중 하나이다. 밑의 예제를 참고해보자. Type Name Size 빅 엔디언 리틀 엔디언 BYTE b 1 [12] [12] WORD w 2 [12][34] [34][12] DWORD dw 4 [12][34][56][78] [78][56][34][12] char[] str 6 [61][62][63][64][65][00] [61][62][63][64][65][00] Byte 타입의 b 변수를 저장할 때는 두 방식의 차이가 없지만 2바이.. Hello World 문자열 패치 여태까지는 올리 디버거의 사용법만을 다뤄서 지루했다면 이번에 할것은 직접 내용을 바꾸기 때문에 리버싱의 묘미를 맛볼수 있다. 패치는 기존 응용 프로그램의 버그를 수정하거나 또는 새로운 기능을 추가시킬수도 있는 기술입니다. 패치 대상은 파일 혹은 메모리가 될 수 있으며 프로그램의 코드와 데이터도 모두 패치가 가능하다. 이번에는 Hello World! 라는 문자를 패치해보자 일단은 지난번에 main()함수까지 BP를 설정했다. 그 위치로 가보자. 문자열 패치 방법은 두가지가 있는데 첫번째는 문자열 버퍼를 직접 수정하는 방법. 두번째는 불러오는 메모리 주소를 수정해서 새로운 문자열을 전달하는 방법인데 하나씩 살펴봅시다. 1) 문자열 버퍼를 직접 수정말그대로 전달되는 문자열 자체를 수정하는 방법이다. 코멘트에 .. Ollydbg BP 설치 방법 앞에 봤던 내용은 F7과 F8을 이용해서 일일히 Main()을 찾아갔다. 이제는 조금더 편하게 찾기 위해 몇가지를 배워보자. 베이스 캠프디버거를 재 실행할때마다 처음 EP에서 시작하기 때문에 불편한 점이 있는데 중간에 중요 포인트를 지정하고 그 포인트로 빠르게 갈 수 있게 해주는 역할을 해주는 것이 베이스캠프이다. 파일을 분석할 때 베이스캠프를 잘 설치하면 아주 편리하게 디버깅을 할 수 있기에 잘 알아두자. 베이스캠프를 설치하는 방법. 1. Ctrl +G와 F4를 이용하는 방법. 일단 처음 시작했을 화면에서 004010E6으로 이동한다고 할때 Goto 명령인 Ctrl +G키를 눌러보자. 다음과 같은 창이 나오는데 여기에 메모리 주소를 입력하자. 그렇다면 입력한 메모리 주소로 이동하는데 여기서 F4버튼을 .. ollydebug를 사용해서 디버깅 입문해보자 올리 디버거를 설치를 했다면 한번 구동을 해보자. 일단 구동 환경을 간단히 써보면 Windows 10 64bit + Ollydbg 2.00 버전 올리 디버거를 시작하면 다음과 같은 화면이 나오게 된다. 4개의 창으로 구성되었는데 설명하면 1. Code Window(좌상단) 기본적으로 Disassembly code를 표시하여 각종 Comment, lable을 보여주며 코드를 분석하여 loop, jump 위치 등의 정보를 표시한다. 2. Register Window(우상단)CPU register 값을 실시간으로 표시하며 특정 register들은 수정이 가능하다 3. Dump Window(좌하단)프로세스에서 원하는 memory 주소 위치를 Hex와 ASCII/유니 코드 값으로 표시하고 수정이 가능하다 4. S.. 리버스 엔지니어링 환경 구축 1. 기본적으로 C++ 개발을 위해서 visual studio express 설치. https://www.visualstudio.com/ko/vs/visual-studio-express/ 2. 디버깅을 위한 OllyDbg 설치 http://www.ollydbg.de/ 왼쪽에 Odbg200.zip을 클릭하면 압축파일이 하나 설치되는데 압축만 헤제하면 사용이 가능하다. 시작했을때 기본화면 이것은 hello.exe를 디버깅 했을때 모습이다. 리버스 엔지니어링이란 리버스 엔지니어링(Reverse Engineering RE:역공학)의 일반적인 의미는 물건이나 기계 장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업. 소프트웨어 분야의 리버스 엔지니어링은 리버스 코드 엔지니어링(Reverse Code Engineering, RCE)라고 하는데 대체로 소프트웨어를 리버싱 관점에서 상세하게 분석한다는 뜻. 리버싱(분석)방법에는 크게 두 가지 방법이 있다. 정적분석과 동적 분석이다. 1) 정적분석 파일 겉모습을 관찰하여 분석하는 방법. 정적 분석 단계에서는 파일을 실행하지 않는다. 파일의 종류(EXE,DLL,DOC 등), 크기 해더(PE)정보, Import/Export API, 내부 문자열, .. 이전 1 2 3 4 5 6 7 다음