Hacking/Pwnable

NX-bit, ASLR1. NX-bit (No-eXecute-bit)1. NX-bit 란?Nx-bit (No-eXecute-bit) 는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법이다.메모리 영역에 쓰기 권한과 실행 권한이 함께 있으면 시스템이 취약해지기 쉽다. 코드 영역에 쓰기 권한이 있다면 공격자는 코드를 수정하여 원하는 코드를 실행할 수 있게 되고,스택 영역에 실행 권한이 있다면 Return to Shellcode 같은 공격을 시도할 수 있다. 즉, NX-bit 는 code 영역을 제외한 나머지 영역에 실행 권한을 넣지 않는 보호기법이다. 2. NX-bit 적용gcc 는 기본적으로 NX-bit 보호기법을 적용해서 컴파일한다.-z execstack따라서 Nx-bit..
스택 카나리 (Stack Canary)1. 스택 카나리1. 스택 카나리 (Stack Canary) 란?BOF 공격으로부터 반환 주소를 보호하기 위해 스택 카나리 (Stack Canary) 보호기법이 생겼다. 스택 카나리는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법이다.카나리 값의 변조가 확인되면 프로세스는 강제로 종료 된다. BOF 공격에서 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로카나리를 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조하게 된다.  2. 카나리 정적 분석1. 스택 카나리 비활성화// Name: canary.c#include int main() { char buf[8]; rea..
셸코드 (Shellcode)1. 셸코드1. Shell ?셸(Shell)이란 운영체제에 명령을 내리기 위해 사용되는 사용자의 인터페이스이다.운영체제의 핵심 기능을 하는 프로그램인 커널(Kernel)과 대비된다. 셸을 획득하면 시스템을 제어할 수 있게 되므로 통상적으로 셸 획득을 시스템 해킹의 성공으로 여긴다. 이러한 셸을 얻을 수 있는 코드를 셸코드라고 한다. 2. Shellcode 란?해킹 분야에서 상대 시스템을 공격하는 것을 익스플로잇(Exploit)이라 한다. Shellcode 는 익스플로잇을 위해 제작된 어셈블리 코드 조각이다.일반적으로 셸을 획득하기 위한 목적으로 셸코드를 사용해서 "셸"이 접두사로 붙었다. execve 셸코드는 임의의 프로그램을 실행하는 셸코드이다.이를 이용하면 서버의 셸을 획득..
스택 버퍼 오버플로우1. 스택 버퍼 오버플로우1. 버퍼 (Buffer)버퍼는 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소의 의미로 쓰인다. 버퍼는 데이터의 처리 속도가 다른 두 장치가 있을 때, 이 둘 사이에 오가는 데이터를 임시로 저장해 완충 작용을 한다.즉 수신측과 송신 측 사이에 버퍼라는 임시 저장소를 두고, 이를 통해 간접적으로 데이터를 전달하게 한다.이렇게 하면 버퍼가 가득 찰 때까지는 유실되는 데이터 없이 통신할 수 있다.빠른 속도로 이동하던 데이터가 안정적으로 목적지에 도달할 수 있도록 완충 작용을 하는 것이 버퍼의 역할이다. 현대에는 이런 완충의 의미가 많이 희석되어 데이터가 저장될 수 있는 모든 단위를 버퍼라고 부르기도 한다. 스택에 있는 지역변수는 스택 버퍼, 힙에 할당된 메모..
함수 호출 규약 1. 함수 호출 규약 1. 함수 호출 규약이란? 함수 호출 규약은 함수의 호출 및 반환에 대한 약속이다. 함수를 호출할 때 파라미터를 어떤 식으로 전달하는지에 대한 규칙을 정의한다. caller (호출자) : 함수를 호출한 곳 callee (피호출자) : 호출 당하는 함수 함수 호출 규약을 적용하는 것은 일반적으로 컴파일러의 몫이다. 프로그래머가 코드에 명시하지 않는다면, 컴파일러는 CPU 의 아키텍처에 적합한 함수 호출 규약을 적용한다. 2. 함수 호출 규약 종류 컴파일러는 지원하는 호출 규약 중, CPU 아키텍처에 적합한 것을 선택한다. x86 (32bit) 아키텍처는 레지스터의 수가 적으므로, 스택으로 인자를 전달하는 규약을 사용한다. 반대로 x86-64 (64bit) 아키텍처는 레..
스택 프레임 1. 스택 프레임 1. 스택프레임이란? 스택은 함수가 사용하는 지역변수, 파라미터 등이 저장되는 공간이다. 하지만 이런 스택 영역을 아무런 구분 없이 사용하게 된다면, 서로 다른 함수가 같은 메모리 영역을 사용할 수 있게 된다. 따라서 함수별로 사용하는 스택의 영역을 명확히 구분하기 위해 스택 프레임(Stack Frame)이 사용된다. 대부분의 프로세스에서는 함수가 자신이 호출될 때 스택 프레임을 만들고, 반환할 때 이를 정리한다. 2. 함수 호출 단계 함수 호출 함수가 사용할 매개변수를 스택에 넣고 함수 시작 지점으로 점프한다. 함수 프롤로그 함수 내에서 사용할 스택 프레임을 설정한다. 함수의 본체 함수의 내용을 수행한다. 함수 에필로그 함수가 끝나면 처음 호출한 지점으로 돌아가기 위해 스..
어셈블리어 정리 1. 어셈블리어 1. 어셈블리어란? 어셈블리어는 기계어와 1대1로 대응되는 명령어 체계를 가진 컴퓨터 프로그래밍 언어이다. intel 문법과 AT&T 문법이 존재하고, 서로 호환이 되지 않는다 Opcode : 명령어 Operand : 피연산자 Intel Operand 의 경우 Operand2 가 Source 가 되고 Operand1 이 Destination 이 된다. 위의 경우에는 EBX 의 값을 EAX 에 더한다 라는 뜻이 된다. AT&T의 경우는 반대가 되어 EAX 의 값을 EBX 로 더한다 라는 뜻이 된다. Intel 문법은 숫자 그대로 사용한다. 1, 2, 3, 4, 5 AT&T 문법은 숫자 앞에 $ 를 붙인다. $1, $2, $3, $4, $5 앞으로 나올 어셈블리는 Intel ..
x86-64 아키텍처: 레지스터 (Register) 1. 레지스터 1. 레지스터란? 레지스터는 CPU 가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치이다. CPU 가 재빨리 읽고 쓰기를 해야하는 데이터들이므로 CPU 내부에 존재하는 메모리를 사용한다. 연산 제어, 디버깅 등의 목적으로 사용한다. 연산을 위한 데이터를 레지스터에 저장하고, 그 결과값도 레지스터에 저장한다. 레지스터 > 메모리 > 하드디스크 순으로 속도가 빠르다 32bit / 64bit 시스템에서 말하는 비트 수는 명령을 한 번에 처리할 수 있는 레지스터의 비트 수이다. 32bit 시스템이 인식 가능한 메모리가 4GB 인 이유는 32bit 로 한 번에 표현할 수 있는 주소가 4GB 이기 때문이다. 최초의 16비트 시스템에서..
x86 메모리 구조 (8086 Memory Architecture) 1. 메모리 구조 1. 8086 시스템 메모리 구조 인텔 32비트 시스템, 8086 시스템의 메모리 구조는 위와 같다 커널 (Kernal) 영역 : OS의 시스템 코드가 로드 되는 부분이다. 건드릴 수 없는 영역이다 Off-Limit 영역 : 사용자가 커널 영역에 접근하지 못하도록 할당해둔 공간이다 유저 영역 : 유저가 실제 사용하는 영역이다. 코드, 스택, 힙 등이 포함된다 Null Pointer 할당 영역 : 모두 0이고 변경 불가능하다. 시스템 보호 차원에서 만들어둔 영역이다. 위의 메모리 구조는 윈도우 기준으로, 리눅스는 커널 (Kernal) 영역이 1GB 이다. 운영체제는 하나의 프로세스를 실행시키면 이 프로세스를 세그먼트 (s..
GunP4ng
'Hacking/Pwnable' 카테고리의 글 목록 (2 Page)