반응형

보안/시스템 해킹 19

[ 시스템 해킹 ] DreamHack WarGame : ssp_001

1. 문제 이 문제의 환경은 이렇다. Ubuntu 16.04 Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000) 주의 깊에 본 것은 32비트 리틀엔디안인 것과 카나리가 있는것이다. 2. 코드분석 코드는 아래와 같다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler..

[ 시스템 해킹 ] Exploit Tech: Shellcode ( execve )

셸(Shell)이란 운영체제에 명령을 내리기 위해 사용되는 사용자의 인터페이스이다. 셸을 획득하면 시스템을 제어할 수 있게 되므로 통상적으로 셸 획득을 시스템 해킹의 성공으로 여깁니다. execve 셸코드는 임의의 프로그램을 실행하는 셸코드인데, 이를 이용하면 서버의 셸을 획득할 수 있다. 다른 언급없이 셸코드라고 하면 이를 의미하는 경우가 많다. 1. execve(“/bin/sh”, null, null) execve 셸코드는 execve 시스템 콜만으로 구성된다. 첫번째 인자에는 파일 이름, 두번째 인자에는 실행파일, 세번째 인자에는 환경변수가 들어간다. 우리는 sh만 실행하면 되므로 다른 값들은 전부 null로 설정해줘도 된다. execve 의 rax에는 59(0x3b)가 들어간다. ;Name: ex..

[ 시스템 해킹 ] Exploit Tech: Shellcode ( orw )

해킹 분야에서 상대 시스템을 공격하는 것을 익스플로잇(Exploit)이라고 부른다. 익스플로잇은 ‘부당하게 이용하다’라는 뜻이 있는데, 상대 시스템에 침투하여 시스템을 악용하는 해킹과 어울린다. 1. 셸코드 ( Shellcode ) 셸코드(Shellcode)는 익스플로잇을 위해 제작된 어셈블리 코드 조각을 일컫는다. 일반적으로 셸을 획득하기 위한 목적으로 셸코드를 사용한다. 만약 해커가 rip를 자신이 작성한 셸코드로 옮길 수 있으면 해커는 원하는 어셈블리 코드가 실행되게 할 수 있습니다. 어셈블리어는 기계어와 거의 일대일 대응되므로 사실상 원하는 모든 명령을 CPU에 내릴 수 있게 된다. 셸코드는 어셈블리어로 구성되므로 공격을 수행할 대상 아키텍처와 운영체제에 따라, 그리고 셸코드의 목적에 따라 다르게..

[ 시스템해킹 ] 파이썬 모듈 : pwntools 설치 및 함수소개

익스플로릿을 하는 방법은 여러가지가 있다. 파이프를 통해 프로그램에 전달 할 수도 있고, 펄, 파이썬, C언어등으로 익스플로잇 스크립트, 또는 바이너리를 제작하여 사용할 수도 있다. 하지만 파이썬으로 여러 개의 익스플로잇 스크립트를 작성하다 보면, 자주 사용하게 되는 함수들이 있고 이런 함수들을 반복적으로 구현하는 것은 비효율적이다. 그래서 pwntools라는 파이썬 모듈을 제작되었다. pwntools덕분에 익스플로잇 제작은 전과 비교할 수 없을 정도로 간단하고, 쉬워졌다. # pwntools 설치방법 $ apt-get update $ apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential $ pyt..

[ 시스템 해킹 ] gdb : pwndbg

gdb란 리눅스의 대표적인 디버거이다. 그 중 pwndbg 라는 플러그인을 설치하고 사용할 것이다 # pwndbg 플러그인 설치 방법 git clone https://github.com/pwndbg/pwndbg cd pwndbg ./setup.sh gdb의 여러가지 명령어를 알아보겠다 gdb filename #filename 디버깅 시작 start #프로그램 시작 b *funName #funName에 break 걸기 r # 실행하기 disassembly #디 어셈블해서 보여줌 ni # navigate 서브루틴의 내부로 들어가지 않음 si # step into 함수 안으로 들어감 finish # 함수안에서 함수를 끝까지 실행 tele # 메모리가 참조하고 있는 주소를 재귀적으로 탐색하여 보여줌 vmmap ..

[ 시스템 해킹 ] Computer Science : Assembly

1, 어셈블리 컴퓨터 언어인 기계어는 0과 1로만 구성되어있어 굉장히 이해하기 힘들다. 이에 컴퓨터 과학자 David Wheeler는 EDSAC을 개발하면서 어셈블리 언어와 어셈블러라는 것을 고안하였다. 어셈블러는 개발자들이 어셈블리어로 코드를 작성하면 컴퓨터가 이해할 수 있는 기계어로 코드를 치환해주었다. 역어셈블리어는 역으로 기계어를 어셈블리어 언어로 번역해주어 소프트웨어를 역분석 하기 쉽게 해주었다. 2. x64 어셈블리어 어셈블리어도 종류가 다양하다. x64의 세계에는 x64의 어셈블리어가 있고, ARM의 세계에는 ARM의 어셈블리어가 있다. 우리는 가장 많이 쓰는 x64 어셈블리어를 공부할 것이다. 2.1 기본 구조 어셈블리어의 문장은 명령어와 피연산자로 구성 되어있다. 피 연산자에는 3가지 종..

[ 시스템 해킹 ] Computer Science: 리눅스 메모리 구조

CPU는 실행할 명령어와 명령어 처리에 필요한 데이터를 메모리에서 읽고, 명령어 집합 구조(ISA)에 따라 이를 처리합니다. 그리고 연산의 결과를 다시 메모리에 적재한다. 만약 공격자가 메모리를 악의적으로 조작할 수 있다면 이에 의해 CPU도 잘못된 동작을 할 수 있다. 이를 메모리가 오염됐다고 표현하며, 이를 유발하는 취약점을 메모리 오염 취약점이라고 부른다. 이를 이해하기 위한 배경 지식으로 리눅스 메모리 구조(Memory Layout)에 대해 알아보고 프로세스 가상메모리의 각 구역이 어떤 정보를 담고 있는지 이해할 수 있다. 1. 세그먼트(Segment) 리눅스에서는 프로세스의 메모리를 크게 5가지의 세그먼트로 구분한다. 세그먼트란 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것인데, 크게 코드..

[ 시스템 해킹 ] Computer Science : 컴퓨터구조

1. 컴퓨터 구조(Computer Architecture) 컴퓨터 구조란 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어와 소프트웨어의 기능을 고안하고, 구성하는 방법을 의미한다. - ‘컴퓨터의 기능 구조에 대한 설계’란 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야이다. 대표적으로 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조가 있다. - CPU의 명령어에 대한 설계는 명령어 집합구라고 불리며, CPU가 처리해야하는 명령어를 설계하는 분야이다. 대표적으로 ARM, MIPS, AVR, 인텔의 x86 및 x86-64 등이 있다. - CPU의 하드웨어적 설계는 마이크로 아키텍처라고 불리며 정의된 명령어 집합을 효율적으로 처리할 수..

[ 시스템 해킹 ] C/ Python 복습 , WSL2 세팅

시스템 해킹 공부는 DreamHack의 시스템 해킹 강의를 보며 하였다. 1. 사전 지식 이 강의를 수강하기 위해서는 C언어와 python의 기본 지식이 필요하다. 기본지식을 테스트 하기 위해 아래의 두 코드를 읽고 "Welcome Hackers :) "가 출력되는 입력값을 찾아보면 된다. #include #include #include int main() { int sz = 0x30; // 48 저장 char *buf = (char *)malloc(sizeof(char) * sz); // 동적할당으로 48바이트만큼 할당 puts("Hello World!"); printf("Education + Hack = ?\\n"); fgets(buf, sz, stdin); // 48만큼 buf에 입력받기 if (!..

반응형