분류 전체보기

basic_exploitation_001 문제 풀이1. 코드 확인 (취약점)1. C 코드 확인파일의 보호기법은 아래와 같다Ubuntu 16.04Arch: i386-32-littleRELRO: No RELROStack: No canary foundNX: NX enabledPIE: No PIE (0x8048000) 파일을 실행하면 바로 입력을 받는 것을 알 수 있다. $ ./basic_exploitation_001 aaaaaaaaaaaaaaaaaaaaaaaa 이제 C 코드를 확인해보자#include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1);}void initiali..
basic_exploitation_000 문제풀이1. 코드 확인 (취약점)1. C 코드 확인파일을 실행하면 buf 의 주소를 출력하고 입력을 받는 것을 알 수 있다.$ ./basic_exploitation_000buf = (0xffffc3a8) checksec 명령어로 보호기법을 확인해보자.$ checksec basic_exploitation_000[*] '/workspaces/codespaces-blank/basic_exploitation_000/basic_exploitation_000' Arch: i386-32-little RELRO: No RELRO Stack: No canary found NX: NX unknown - GNU_STACK missin..
셸코드 (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..
· Coding/C
[코딩도장] Unit 71 1. 파일 포인터 활용하기 (fseek, ftell) 1. 파일 포인터 이동하기 (fseek) fseek 함수는 기준점에서 이동할 거리(크기)를 지정하여 파일 포인터를 이동시킨다 fseek(파일포인터, 이동할크기, 기준점) fseek(fp, 0, SEEK_END); // 파일 포인터를 파일의 끝으로 이동시킴 fseek 의 기준점은 SEEK_SET 파일의 처음부터 시작 SEEK_CUR 현재 위치부터 이동 시작 SEEK_END 파일의 끝부터 시작 SEEK_SET, SEEK_CUR, SEEK_END는 기준점을 기준으로 파일 포인터의 위치를 바꾼다 fseek(fp, 0, SEEK_SET); 이면 파일의 처음으로 간다 fssek(fp, 0, SEEK_END); 이면 파일의 끝으로 간다 ..
GunP4ng
'분류 전체보기' 카테고리의 글 목록 (3 Page)