본문 바로가기

리버싱

[어셈블리어] 리눅스에서 ARM, MIPS 버전으로 gdb 구동 arm-linux-gnueabi-gcc -o file file.c -g -static qemu-arm-static -L /usr/arm-linux-gnueabi ./file gdb-multiarch file ./file disas main EX) 12345678#include void main(){ int a = 0, i; for(i=10; i>0; i--) a+=2;}cs mips-linux-gnu-gcc -o file file.c -g -static qemu-mips-static -L /usr/mips-linux-gnu ./file gdb-multiarch file ./file disas main EX) 12345678#include void main(){ int a = 0, i; for(i=10; .. 더보기
[리버싱] 메모리 구조, 스택프레임, 함수 규약과 프롤로그&에필로그 프로세스 프로그램이 실행되는 동안을 프로세스라 하며 프로세스는 운영체제에 의해 메모리 영역을 할당 받아 실행된다. 프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다. 메모리 구조 1. 코드 세그먼트 (Code Segment) 메모리의 코드 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다. 상수도 이곳에 포함된다. 2. 데이터 세그먼트 (Data Segment) 메모리의 데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. 3. 힙 세그먼트 (Heap Segment) 메모리의 힙 영.. 더보기
[리버싱] CALL, JMP, RET (RETN) 명령어 CALL (Call a Procedure) 함수 호출 시 사용된다. JMP 명령어와 같이 프로그램의 실행 흐름이 변경되지만 JMP 명령어와 다른 점은 되돌아올 리턴 어드레스 (CALL 다음 명령) 를 스택에 저장한다는 것이다. 되돌아올 주소를 저장하기 때문에 함수 호출 후 원래 위치로 실행 흐름을 되돌릴 수 있다. EIP에는 서브루틴의 주소가 들어가서 CALL 호출을 하면 EIP에 저장된 서브루틴으로 가서 실행 후 RET 명령을 통해 스택에 저장된 리턴 어드레스를 EIP에 넣고 EIP에 있는 주소로 돌아간다. JMP (Jump Unconditionally to Label) 오퍼랜드가 가리키는 곳으로 이동시키는 명령으로 실행 흐름이 변경된다. 되돌아올 리턴 어드레스 값을 저장하지 않기 때문에 EIP에는 오.. 더보기
[리버싱] 브레이크포인트란 브레이크포인트 (breakpoint) 브레이크포인트는 디버깅을 목적으로 실행중인 디버깅 대상 프로세스를 의도적으로 멈추게 하는 장소를 가리킨다. 프로세스가 멈추면 멈춘 시점의 변수나 스택 파라미터, 혹은 특정 메모리 지점의 값 등을 조사할 수 있다. 브레이크포인트는 구현되는 방법에 따라 소프트 브레이크포인트, 하드웨어 브레이크포인트, 메모리 브레이크포인트로 구분된다. 소프트 브레이크포인트 (Soft Breakpoint) 명령을 실행하는 CPU를 일시 중지하는 데 사용되며 디버깅할 때 가장 흔하게 사용되는 형태의 브레이크포인트다. 종류 - 일회성 브레이크포인트 한 번 브레이크포인트 이벤트가 발생하면 디버거의 내부 브레이크포인트 리스트에서 해당 브레이크포인트 정보가 제거되는 것이다. 한 번만 브레이크포인트를.. 더보기
[리버싱] 인터럽트란 인터럽트 (Interrupt) 인터럽트란 '끼어들다, 중단시키다, 방해하다' 라는 뜻으로 마이크로컨트롤러는 여러가지 일을 처리해야만 하고 동시에 처리할 수 없는 일들을 순서적으로 하나씩 처리해야 한다. 그러나 지금 하고 있는 일보다 긴급한 일 (또는 중요한 일) 이 발생하면 그 일을 먼저 처리해주고 나서 하던 일을 계속하게 되는 것이다. 이러한 긴급한 일을 '인터럽트' 라고 한다. 마이크로프로세서는 인터럽트를 감지하면 지금 실행중인 기계어 코드를 중단하고 자신의 상태를 기억시켜둔 후 해당 인터럽트를 위한 처리 프로그램으로 점프하여 해당 일을 수행한다. 루틴이란 어떤 프로그램이 실행될 때 불려지거나 반복해서 사용되도록 만들어진 일련의 코드들을 지칭한다. 인터럽트 처리를 위한 루틴을 인터럽트 서비스 루틴 (.. 더보기
[리버싱] API 란 API (Application Programming Interface) API는 응용 프로그램에서 사용할 수 있도록 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 즉 프로그램과 운영체제 사이의 중간매체이다. 운영체제가 응용프로그램을 위해 제공하는 함수의 집합이다. Windows API 파일 열기 (Open): 파일을 생성하거나 열 때 16bit : CreateFile 32bit : CreateFIleA wide : CreateFileW 파일 입출력 (Road&Write): 파일 입출력할 때 ReadFile : 읽기 WriteFile : 쓰기 파일 접근 (Access) SetFilePointer : 포인터 조정 시스템 디렉토리에서 얻어오는 함수 16bit : Ge.. 더보기
[리버싱] 레지스터란 레지스터 CPU의 내부에 존재하는 고속 메모리로 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 공간이다. CPU 처리를 위해 데이터를 레지스터라는 기억 공간에 저장해두었다가 CPU에서 처리를 하고 해당 결과값 역시 레지스터에 저장하게 된다. 레지스터는 공간은 작지만 CPU와 직접 연결되어 연산 속도가 메모리보다 훨씬 빠르다. 레지스터의 종류 레지스터의 종류는 범용 레지스터, 인덱스 레지스터, 포인터 레지스터, 세그먼트 레지스터, 플래그 레지스터로 구분할 수 있다. 32bit의 환경에서는 레지스터명의 첫글자가 E(Extended)로 시작하고 64bit의 경우 R(Register)로 시작하여 32비트의 레지스터를 포함한다. 1. 범용 레지스터 (General Purpose Register) 범용 레.. 더보기
과제 보호되어 있는 글입니다. 더보기