1. 실습에 사용할 간단한 코드 준비 1.1 간단한 코드 작성 cat > basic.c #include int main() { int sum = 0; int val1 = 1; int val2 = 2; sum = val1 + val2; printf("1 + 2 = %d\n", sum); } 1.2 컴파일 gcc -o basic basic.c -no-pie 2. gdb 사용법 기본적으로 해당 글에서는 pwngdb가 설치 되어 있다는 가정 하에 진행하도록 하겠습니다. 만약에 pwngdb가 설치되어 있지 않으신 분들은 제 글에서 시스템 105를 검색하셔서 elf, pe, pwngdb 설치 방법 등을 숙지 하시고 오시길 바랍니다. 또한 리눅스에서 gdb를 사용하는 법에 대한 글이라 elf 파일을 다룰 것 입니다...
1. 실행 파일의 종류 1.1 PE파일 ( Window ) 내용 PE(Portable Executable) 파일은 윈도우 운영체제에서 실행 가능한 파일 포맷입니다. 이 파일 포맷은 코드, 데이터, 리소스 및 메타데이터를 담고 있으며, 실행 파일 및 DLL(Dynamic Link Library)에서 사용됩니다. 분석 PE 파일은 다음과 같은 구조를 가지고 있습니다. DOS 헤더: MS-DOS 기반 시스템에서 실행할 수 있도록 하는 헤더 PE 헤더: PE 파일의 세부 정보를 포함하는 헤더 섹션 테이블: 파일의 각 섹션에 대한 정보를 포함하는 테이블 섹션 데이터: 코드, 데이터 및 리소스와 같은 파일의 실제 내용 PE 파일은 Windows API를 사용하여 로드 및 실행됩니다. 실행 파일의 경우, 윈도우 운영..
0. 시스템콜? 여러 OS들은 자신의 체계를 보호하고 효율적인 자원 관리를 위하여 시스템을 유저모드와 커널 모드로 권한을 나눕니다. 1) 유저모드 운영체제가 사용자에게 부여하는 권한입니다. 텍스트에 글을 쓰거나, 동영상을 시청하거나, 무언가를 다운받을때 유저 모드로 작동되게 됩니다. 2) 커널모드 커널모드는 운영체제가 시스템 제어를 위하여 시스템 소프트웨어에 부여하는 권한입니다. 메모리관리, 통신, 파일시스템, 파일을 읽고 명령을 내리는 하드웨어와 밀접한 작업을 할때는 커널 모드에서 진행됩니다. 커널 모드에서는 말 그대로 시스템 전체를 통제할 수 있기때문에 커널이 익스플로잇이 된다면 거의 모든 행동을 할 수 있습니다. 그렇다면 시스템콜은 무엇일까요? syscall이라고 불리기도 하는 시스템콜은 유저 모드..
0. 어샘블리와 디스 어셈블러 1. 어샘블리 컴퓨터는 0과 1로 이루어져 있는 기계어만 알아들을 수 있습니다. 초기에 컴퓨터 공학자들은 0과 1로 코드를 짜다가 현타가 왔는지 어샘블리 언어와 어샘블러를 만들었습니다. 어샘블러는 어샘블리 언어로 코드를 작성하면 기계어로 변환해주는 초기의 코드라고 보시면 됩니다. 2. 디스어샘블리 이제 소프트웨어를 분석해야하는 사람들은 주어진 소프트웨어가 기계어로 이루어져 있으니 그걸 어샘블리 언어로 변환하는 디스어샘블러를 개발했습니다. ( 기계어로 이루어진 프로그램 → 어샘블리 언어 ) 1. 어샘블리 명령어 1. 명령어의 종류 설명 코드 값(데이터) 이동 mov, lea 산술연산 inc, dec, add, sub 논리연산 and, or ,xor, not 비교 cmp, te..
[들어가기 전 참고] #CPU의 구성 1. ALU (Arithmetic Logic Unit) + CU(Control Unit) 2. Register 3. Cashe #ISA(명령어 집합 구조) IA-32 ( 인텔의 32Bit Cpu 아키텍쳐) x86-64 (인텔의 64Bit Cpu 아키텍쳐) 32bit vs 64bit 32bit는 2**32 = 4기가 바이트, 64bit는 2**64 = 엄청 큰수 를 프로그램을 실행할때 제공할 수 있습니다. 가령 자신의 PC에 메모리가 커도 32bit 운영체제로 컴파일 할 경우 최대 4GB의 RAM을 사용 가능한것이죠. 그럼 왜 32Bit 아키텍쳐로 컴파일 하는 경우가 존재하는 것일까요? 임베디드 장비같이 가용 메모리 자원이 극한으로 적은 경우 64Bit 아키텍쳐를 사용..
0. 프로세스 메모리란? 우리가 c언어와 같은 컴파일러로 바이너리 파일을 만들고 해당 프로그램을 실행하게 되면 해당 바이너리 파일은 cpu의 연산과정을 거쳐 실행이 되게 됩니다. 이때 cpu가 성능이 매우 빠르고 좋아도 한번에 모든 프로세스를 처리 할 수 없기 때문에 메모리를 사용하여 cpu가 처리하는 과정을 잘게 쪼개 여러 프로세스에 배분하는 방식으로 작동합니다 . 1. 리눅스에서의 프로세스 메모리 리눅스에서는 프로세스의 메모리를 5가지로 나눕니다. 이 나눈 부분을 "세그먼트" 라고 칭하며 코드 세그먼트, 데이터 세그먼트 bss세그먼트, 스택 세그먼트, 힙세그먼트로 나눌 수 있습니다. 이때 운영체제는 세그먼트 별로 읽기, 쓰기, 실행 권한을 부여하여 각 용도에 맞게 적절한 권한을 부여합니다. 1. 코드..