목록System Hacking(OS)/Shellcode (5)
뉴비에욤
보호되어 있는 글입니다.
(대부분) 시스템의 명령어 쉘을 실행시키는 기계어 코드로 작성된 쉘코드를 만들기 위해, 먼저 시스템의 명령어 쉘을 실행시키는 간단한 C 언어 프로그램을 작성하고, 이를 어셈블리어 코드로 변환한 뒤, 끝으로 불필요한 부분을 제거하여 최적화된 기계어 코드를 얻는 과정을 거친다. 먼저 시스템의 명령어 쉘을 실행시키는 간단한 프로그램을 작성한다. 본 프로그램에서는 unistd.h 헤더 파일에 정의된 execve 함수를 사용하여 "/bin/sh"에 있는 명령어 쉘을 실해시킨다. execve 함수는 파일 이름이 가리키는 실행 가능한 바이너리 파일이나 스크립트 파일을 실행하는 함수로, 함수 프로토타입(함수 원형)은 다음과 같이 정의되어 있다. * 사진이 잘렸을 경우 사진 클릭시 원본 사이즈로 보여짐 각 인자는 con..
일반적으로 운영체제는 하나의 프로세스를 실행하게 되면 이 프로세스를 세그먼트(Segment) 단위로 메모리에 저장한다. 이 세그먼트는 다시 세 영역으로 구분되어, 컴파일러(Compiler)에 의해 기계어 코드로 변환된 명령어 집합이 저장되는 코드 세그먼트(Code Segment), 프로그램이 참조하는 데이터(주로 전역(global) 변수들)가 저장되는 스택 세그먼트(Stack Segment)로 나뉜다. 이 때 메모리에 저장되는 위치는 보통 실행 시간(Run Time, 실행되는 순간)에 정해지기 때문에, 컴파일 과정에서 각 명령어의 정확한 위치를 지정해 줄 수 없다. 따라서 각 세그먼트는 가상 주소인 논리적 주소(Logical Address)를 사용하여 상대적인 위치를 지정한 후, 실행 시간에 정해지는 자..
시스템 및 프로그래밍 기본 사항 쉘코드의 동작 원리에 대한 설명에 앞서, 앞으로 이를 이해하는 데 필요한 기본적인 시스템의 메모리 구조 및 어셈블리 명령어, 그리고 프로그램 세부 동작 과정을 차례로 살펴본다. 1. 인텔(Intel) x86 32비트 레지스터 인텔 x86 아키텍쳐에서 제공하는 32비트 레지스터는 크게 범용(General-Purpose) 레지스터, 세그먼트(Segment) 레지스터, 명령어 포인터(Instruction Pointer), 플래그(Flag) 레지스터로 나누어 볼 수 있다. 먼저 범용 레지스터는 일반적인 연산이나 데이터 저장 등의 용도로 사용되는 4개의 일반 레지스터와(EAX,EBX,ECX,EDX), 간접 주소 지정 및 문자열 비교에 사용되는 2개의 인덱스(Index) 레지스터(E..
쉘코드의 정의 쉘코드(Shellcode)는 시스템의 특정 명령을 실행하는 작은 사이즈의 프로그램을 뜻하여, 일반적으로 기계어 코드(Machine Code)로 작성되어 있다. 쉘코드란 단어는 공격 대상 시스템의 명령어 쉘(Command Shell-etc:bash)을 실행시킨다는 의미로부터 파생되었으며, 주로 소프트웨어 취약점을 통한 공격(Exploitation) 이후 실행될 작은 규모의 프로그램(Payload)으로 사용된다. 실제 쉘코드의 예는 아래와 같다. \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2..