함수 호출 과정(Runtime Resolve)1. Dynamic Link 시 함수 호출 과정1. PLT, GOT이전 글에서 짧게 설명하고 넘어갔던 Runtime Resolve 에 대해 자세히 알아보자 // Name : got.c//Compile : gcc -o got got.c -no-pie -fno-stack-protector -m32#include int main() { puts("Resolving address of 'puts'."); puts("Get address from GOT");}got.c 파일을 만들고 컴파일 한다. Dump of assembler code for function main: 0x08049176 : lea ecx,[esp+0x4] 0x0804917a ..
Hacking
공유 라이브러리( PLT, GOT)1. 라이브러리란?1. 라이브러리(Library)프로그램은 공통으로 사용하는 함수들이 있다printf, scanf, strlen, memcpy, malloc 등 많은 함수들이 있다이러한 함수들의 정의를 묶어 만든 파일(오브젝트 파일)을 라이브러리라고 한다 C의 표준 라이브러리인 libc 는 우분투에 기본으로 탑재된 라이브러리다 2. Lazy Binding & Now BindingELF(Executable and Linkable Format)리눅스 기반 시스템의 기본 바이너리 형식 Lazy BindingDynamic Linking 방식으로 컴파일 된 바이너리에서함수를 처음 호출할 때 해당 함수의 주소를 공유 라이브러리에서 가져오는 것 Now Binding프로그램이 실행될..
카카오 미러서버 변경sudo sed -i 's/kr.archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list python3 & pwntools 설치apt-get updateapt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essentialpython3 -m pip install --upgrade pippython3 -m pip install --upgrade pwntools pwndbg & peda & gef 설치cd ~ && git clone https://github.com/apogiatzis/gdb-peda-pwndbg-gef.gitcd ~/gdb-peda..
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 ..