동사에 해당하는 명령어(Operation Code, Opcode)와 목적어에 해당하는 피연산자(Operand)로 구성됩니다.mov eax, 3opcode | operand1 | operand2피연산자에는 총 3가지 종류가 올 수 있습니다.상수 (Immediate Val
Quiz2 end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가? 풀이 첫번째 줄은 rsi+rcx에 있는 값을 dl에 대입합니다. 현재 r
셸코드(Shellcode)는 익스플로잇을 위해 제작된 어셈블리 코드 조각을 일컫습니다. 일반적으로 셸을 획득하기 위한 목적으로 셸코드를 사용해서, 특별히 "셸"이 접두사로 붙었습니다.셸코드는 어셈블리어로 구성되므로 공격을 수행할 대상 아키텍처와 운영체제에 때라, 그리고
flag의 위치가 /home/shell_basic/flag_name_is_loooooong이라는 정보가 주어졌습니다. 앞에서 배운 orw 셸코드를 작성하여 해결할 수 있을 것 같습니다.먼저 문제 파일인 shell_basic.c를 살펴 보겠습니다문제 파일의 main 함수
스택 버퍼 오버플로우는 스택의 버퍼에서 발생하는 오버플로우를 뜻합니다. 버퍼 버퍼(Buffer)는 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소입니다. 데이터의 처리속도가 다른 두 장치가 있을 때, 이 둘 사이에 오가는 데이터를 임시로 저장해 두는 것은 일종의

먼저 문제에서 제공한 rao.c 파일을 살펴보겠습니다.먼저 셸을 실행할 수 있는 함수인 get_shell()이 존재합니다. 따라서 execve 셸코드를 사용하지 않고 get_shell 함수를 실행하면 문제를 해결할 수 있어 보입니다. main함수를 보면 "Input:

문제에서 32비트 아키텍처임을 알 수 있습니다.문제에서 제공한 파일인 basic_exploitation_000.c부터 살펴보도록 하겠습니다.앞에서 푼 Return address Overwrite 문제와 다르게 get_shell 함수가 없어 execve 셸 코드를 사용해

32비트 아키텍처임을 알 수 있습니다.먼저 문제에서 제공한 파일인 basic_exploitation_001.c부터 살펴보겠습니다.read_flag 함수를 통해 플래그를 출력할 수 있어 보입니다. main 함수에서 gets를 사용하고 있으므로 return address를
스택 카나리(Stack Canary)는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법입니다. 스택 버퍼 오버플로우로 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로 카나리 값을
먼저 checksec r2s를 통해 적용된 보안 기법들을 살펴보겠습니다.이전 문제들과는 다르게 Canary가 적용된 것을 알 수 있습니다.이제 문제에서 제공해준 파일 r2s.c를 살펴보겠습니다.입력을 받는 부분이 read(0, buf, 0x100), gets(buf)로

이전에 풀던 문제들처럼 단순하게 배운 내용을 사용해보는 정도에서 조금 더 나아가 약간의 응용이 필요한 문제였습니다. 갑자기 확 어려워진 느낌을 받아서 약간 당황스러웠네요..적용된 보안 기법부터 살펴보겠습니다.32비트이며 canary가 적용되어 있습니다.다음으로 문제 파
No-eXecute(NX)는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법입니다. 어떤 메모리 영역에 대해 쓰기 권한과 실행 권한이 함께 있으면 시스템이 취약해지기 쉽습니다. NX가 적용된 바이너리는 실행될 때 각 메모리 영역에 필요한
먼저 적용된 보안 기법을 살펴보겠습니다.Canary와 NX가 적용되어있습니다. NX가 적용되어 있으므로 버퍼에 주입한 셸 코드를 실행할 수 없으므로 libc로 우회하여 공격하는 return to library 기법을 사용해야 합니다.문제 파일인 rtl.c를 살펴보겠습니

Canary와 NX가 적용되어 있습니다.문제 파일인 rop.c를 살펴보겠습니다.read에서 버퍼 오버플로우가 가능하므로 Leak canary에서 canary를 구한 후 rop(return oriented programming)를 활용하면 될 것 같습니다.스택 구조 파악

문제에 적용된 보안 기법들을 살펴보겠습니다.NX가 적용되어 있으므로 스택에서 셸을 바로 실행할 수는 없어보입니다.문제에서 제공한 basic_rop_x64.c도 살펴보겠습니다.buf에 비해 read에서 읽는 크기가 크므로 스택 오버플로우를 사용할 수 있어보입니다. 먼저

basic_rop_x64를 32비트 x86아키텍처에서 해결하는 문제입니다. 여기서는 아키텍처의 차이에 의한 차이점만 설명하도록 하겠습니다. basic_rop_x64를 해결하지 않으신 분들은 링크를 보고 오시길 바랍니다.64비트 아키텍처인 amd64는 앞의 문제에서 확인
리눅스에서 ELF는 실행 파일(Executable)과 공유 오브젝트(Shared Object)로 두 가지가 존재합니다. 실행 파일은 일반적인 실행 파일이 해당하고, 공유 오브젝트는 libc.so와 같은 라이브러리 파일이 해당합니다.공유 오브젝트는 기본적으로 재배치가 가

적용된 보호 기법을 살펴보겠습니다.Full RELRO, Canary, NX, PIE가 모두 적용되어 있습니다.fho.c도 살펴보겠습니다마지막에 free 함수가 존재하므로 \_\_free_hook이라는 훅 변수를 사용하여 Hook Overwrite를 할 수 있을 것 같습

NX와 PIE가 적용되어 있고 Partial RELRO가 적용되어 있으므로 GOT overwrite가 가능합니다.oneshot.c를 살펴보겠습니다.printf("stdout: %p\\n", stdout);으로 stdout의 메모리 주소를 알 수 있으므로 오프셋을 빼서

Full RELRO, Canary, NX가 적용되어 있습니다. Full RELRO가 적용중이므로 hook overwrite를 사용해야 할 것 같습니다.hook.c도 살펴보겠습니다.앞의 oneshot 문제와 마찬가지로 stdout의 메모리 주소를 제공해 줍니다. 따라서
배열은 연속된 메모리 공간을 점유하며, 배열이 점유하는 공간의 크기는 요소의 개수와 자료형의 크기를 곱한 값이 됩니다. 흔히, 배열이 포함하는 요소의 개수를 배열의 길이라고 부릅니다.OOB는 요소를 참조할 때, 인덱스 값이 음수이거나 배열의 길이를 벗어날 때 발생합니다

Canary와 NX가 적용되어 있습니다.system(commandidx)에서 idx를 받을 때 제한 조건이 없기 때문에 Out of bound를 사용해서 "/bin/sh"를 실행할 수 있을 것 같습니다.system(commandidx)에서 셸을 실행하기 위해서 name
포맷 스트링은 다음과 같이 구성됩니다. 이 중 Format String Bug를 공격하는 데 중요한 요소 4가지에 대해 살펴보겠습니다.%parameterwidthlength형식 지정자(specifier)는 인자를 어떻게 사용할지 지정합니다.최소 너비를 지정합니다. 치환

Full RELRO, NX, PIE가 적용되어 있습니다.get_string 함수를 통해 buf에 32바이트 입력을 받습니다. 그리고 사용자가 입력한 buf를 printf의 인자로 직접 사용하므로 포맷 스트링 버그 취약점이 발생합니다.풀이의 흐름은 다음과 같습니다.1\.

NX만 적용되어 있습니다.눈에 띄는 부분은 get_shell함수의 존재입니다. PIE가 적용되어 있지 않으므로 got overwrite로 어떤 함수의 got 주소를 get_shell로 덮어서 해결할 수 있을 것 같습니다.그리고 read로 입력받은 buf를 그대로 pri

NX만 적용되어 있습니다.basic_exploitation_002와 마찬가지로 get_shell 함수가 존재합니다. read에서 heap_buf를 받은 후 이를 그대로 sprintf의 인자로 사용하기 때문에 포맷 스트링 버그를 사용할 수 있을 것 같습니다.여기서 spr

ptmalloc2(pthread malloc 2)는 Memory Allocator로 리눅스에서 사용하고 있으며, GLibc에 구현되어 있습니다.ptmallc의 구현 목표는 메모리의 효율적인 관리입니다. 자세히 말하면 메모리 낭비 방지, 빠른 메모리 재사용, 메모리 단편
Dangling Pointer는 유효하지 않는 메모리 영역을 갖는 포인터를 말합니다. 메모리의 동적 할당에 사용되는 malloc 함수는 할당한 메모리의 주소를 반환합니다. 메모리를 해제할 때는 free 함수를 호출합니다. 하지만 free 함수는 청크를 ptmalloc

앞에서 배운 보안 기법들이 전부 적용되어 있습니다.Human과 Robot이라는 구조체가 존재하고, 할당하는 human_func와 robot_func 함수가 존재합니다.human_func 함수와 robot_func 함수를 보면, 구조체 변수를 위한 메모리 영역을 할당할
Double Free Bug(DFG)는 같은 청크를 두 번 해제할 수 있는 버그를 말합니다. ptmalloc2에서 발생하는 버그 중 하나이며, 공격자에게 임의 주소쓰기, 읽기, 임의 코드 실행 등의 수단으로 활용될 수 있습니다.Dangling Pointer는 Doubl

Full RELRO와 NX가 적용되어 있으므로 Hook Overwrite를 고려해 볼 수 있습니다.Allocate에서 원하는 크기의 청크를 할당할 수 있고, Edit에서 청크의 데이터를 수정할 수 있습니다. Free에서 청크를 해제하고 나서 chunk 포인터를 초기화하

Canary와 NX가 적용되어 있습니다. Partial RELRO가 적용되어 있으므로 여전히 GOT Overwrite는 유효해 보입니다.create로 원하는 크기의 청크를 할당할 수 있고, delete에서 청크를 해제할 때 포인터를 초기화하지 않으므로 Double Fr

Partial RELRO, Canary, NX가 적용되어 있으므로 GOT overwrite가 유효해 보입니다.create_heap을 통해 원하는 크기의 청크를 만들 수 있고, delete_heap을 통해 청크를 해제할 때 포인터를 초기화하지 않으므로 modify_hea

NX만 적용되어 있습니다.get_shell 함수가 존재하며 signal(SIGSEGV, get_shell) 함수는 Segmentation Fault 시그널을 받았을 때 get_shell 함수가 실행됩니다. read에서 크기를 size -1로 받고 read의 세 번째 인

Full RELRO, NX, PIE가 적용되어 있습니다.read(0, center_name, 100)에서 스택 오버플로우가 가능해 보입니다. system(cmd_ip)에서 /bin/sh를 실행해 셸을 얻을 수 있어 보입니다. cmd_ip의 첫 8 바이트는 ifconfi

Partial RELRO만 적용되어 있습니다.문제의 압축파일을 해제했는데 소스 파일이 없습니다. 이런 경우 IDA같은 툴을 사용해 디컴파일을 하여 문제를 해결할 수 있습니다.다음은 IDA로 validator_dist를 연 화면입니다.이제 f5를 눌러 디컴파일해서 mai