전체 글 80

DreamHack System- Stack Canary

#include int main() { char buf[8]; read(0, buf, 32); return 0;}canary.c 파일 코드 gcc -o no_canary canary.c -fno-stack-protector 명령어로 컴파일하면,no_canary 실행 파일이 생성되며 이 과정에서 스택 보호 기능이 비활성화됨이후 프로그램을 실행하고 긴 입력값을 넣으면,코드 특성상 스택 버퍼 오버플로우가 발생하게 됨 $ ./no_canaryAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASegmentation fault (core dumped)$ ./canaryAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA*** stack smashing detected *..

카테고리 없음 2024.10.06

DreamHack System- ssp_001

ssp 방어 기법을 우회해 flag 파일을 읽어 정답을 획득해야한다.문제를 풀기 전에 스택 카나리에 대해 알아야한다.    스택 버퍼 오버플로우로부터 반환 주소를 보호하는 보호기법  스택 카나리는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고,함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법카나리 값의 변조가 확인되면 프로세스는 강제로 종료됨  #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1);}void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); ..

카테고리 없음 2024.10.06

DreamHack System- basic_exploitation_001

코드의 취약점을 찾아 익스플로잇 코드를 짜고 flag를 얻는 문제이다. #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); alarm(30);}void read_flag() { // flag 파일을 읽어주는 함수 system("cat /flag");}int main(int argc, char *argv[]) { char buf[0x80]; // buf..

카테고리 없음 2024.09.29

DreamHack System- basic_exploitation_000

우선 문제를 읽어보면 취약점을 찾아 셀을 획득해 flag파일을 읽는 것이다.일단 코드부터 살펴보겠다.   ⚡ root  ~/Downloads  cat basic_exploitation_000.c#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); alarm(30);}int main(int argc, char *argv[]) { char buf[0x80];..

카테고리 없음 2024.09.29

System War Game- Return Address Overwrite

문제를 읽어보고 다운 받아 리눅스에서 실행시켜 본다.  // Name: rao.c// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie#include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0);}void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL);}int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf); return 0;} 문제를 다운 받았을 때 제공되는 파일의 코..

카테고리 없음 2024.09.22

Quiz: x86 Assembly 3Question.1

코드 분석 push rbp와 mov rbp, rsp: 스택 프레임을 설정하는 기본적인 코드임mov esi, 0xf: esi 레지스터에 0xf(15)를 저장. 이는 출력할 바이트 수와 관련이 있을 수 있음mov rdi, 0x400500: rdi 레지스터에 0x400500 값을 저장. 이는 메모리 주소를 가리킴call 0x400497 : write_n 함수를 호출함mov eax, 0x0와 pop rbp, ret: 함수 종료 후 리턴함  write_n 함수 스택 프레임 설정 (push rbp, mov rbp, rsp)mov QWORD PTR [rbp-0x8], rdi: rdi의 값을 스택에 저장. 이 값은 0x400500mov DWORD PTR [rbp-0xc], esi: esi 값을 스택에 저장. 이 값은 ..

카테고리 없음 2024.09.15

Quiz: x86 Assembly 2Question.1

코드 분석 mov dL, BYTE PTR[rsi+rcx]: rsi는 0x400000으로 주어졌으므로, 이 명령어는 rcx 레지스터 값을 기준으로 메모리 주소 0x400000 + rcx에 있는 바이트를 dL에 저장함xor dL, 0x30: dL에 저장된 값을 0x30(48)과 XOR 연산하여 변환함mov BYTE PTR[rsi+rcx], dL: 변환된 값을 다시 같은 메모리 위치로 저장함inc rcx: rcx 값을 1 증가시킴cmp rcx, 0x19: rcx 값을 0x19(25)와 비교하여, rcx가 25일 때 종료됨루프를 통해 0x400000부터 0x400019까지의 메모리를 처리함  0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x100x400008 | 0x44 0..

카테고리 없음 2024.09.15

System Hacking- Dreamhack 개념 정리

컴퓨터 구조란?컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법을 말함 컴퓨터 구조의 세부 분야  x86-64 아키텍처: 레지스터- 범용 레지스터(General Register)- 세그먼트 레지스터(Segment Register)- 명령어 포인터 레지스터(Instruction Pointer Register, IP)- 플래그 레지스터(Flag Register) 범용 레지스터 플래그 레지스터  5가지의 세그먼트가 존재 - 코드 세그먼트- 데이터 세그먼트- BSS 세그먼트- 힙 세그먼트- 스택 세그먼트 각 세그먼트 별 요약 x86-64 어셈블리어 문법 구조 데이터 이동 명령어

카테고리 없음 2024.09.15