목록전체 글 (33)
미역줄기의 이모저모

오랜만입니다. 개강했다고 정신줄 놓고 있다가 이대로면 해킹은 개뿔 똥멍청이가 될 것 같아서 다시 정신차리고 돌아왔습니다. 간만에 푸는 워게임이기 때문에 아주 쉬운 문제로다가 풀었습니다. 시스템 해킹을 시작하고 거의 처음으로 온전히 제 힘으로 flag를 찾은 문제입니다 ㅎㅎ.. 근데 정말 EZ함문제 설명문제 코드#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); al..

보호 기법 & 문제 코드 amd64 아키텍처 -> sfp는 8바이트겠군 canary 없음 -> sfp랑 ret 아무렇게나 덮어써도 괜찮다. NX 적용됨 -> 셸코드 사용 어렵 PIE -> 바이너리가 실행되는 메모리 주소가 랜덤화 // Name: fsb_overwrite.c // Compile: gcc -o fsb_overwrite fsb_overwrite.c #include #include #include void get_string(char *buf, size_t size) { ssize_t i = read(0, buf, size); if (i == -1) { perror("read"); exit(1); } if (i 0 && buf[i - 1] == '\n') i--;..

포맷 스트링 버그(FSB) c 언어에는 printf 외에도 포맷 스트링을 인자로 사용하는 함수들이 많다. scanf, fprintf, fscanf, sprintf, sscanf 가 있다. 이 함수들은 포맷 스트링을 채울 값들을 레지스터나 스택에서 가져온다. 하지만 이들 내부에 포맷 스트링이 필요로 하는 인자의 개수와 함수에 전달된 인자의 개수를 비교하는 기능이 없기때문에 공격자가 포맷 스트링을 입력할 수 있다면 악의적으로 다수의 인자를 요청하여 레지스터나 스택의 값을 읽어낼 수 있다. 더 나아가 다양한 형식 지정자를 활용하여 원하는 위치의 스택 값을 읽거나, 스택에 임의 값을 쓰는 것도 가능하다. 💡 여기서 알아두면 좋은 생각의 흐름 💡 읽기 -> leak 할 수 있다 쓰기 -> exploit 할 수 있..

문제 & 보호기법 amd64 아키텍처 -> 카나리가 8바이트 NX enabled -> 셸 코드 사용 못함 문제 코드 #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 get_shell() { system("/bin/sh"); } int main(int argc, char *argv[]) { long addr; long value; char buf[0x40]..

드림핵 강의랑 많이 겹치지만.. 이건 정말 공부하고 쓰는 글이라 다듬어지지 않은 날 것의(?) 글이다. 1.1 x86 Memory layout 위의 그림은 x86 환경에서 하나의 프로세스가 가상 메모리에 로드되어 실행될 때의 메모리 구조이다. 최상위에 있는 커널 영역은 접근 못한다 (아님말고) 그 밑으로는 유저 영역의 코드 영역, 데이터 영역, bss 영역, 힙 영역, 스택 영역이다. 코드 영역 읽기 권한 실제 프로그램을 실행하는 기계어 명령들이 위치한다. 데이터 영역 전역 변수와 정적 변수가 위치 BSS 영역 초기화 되지 않은 전역변수와 정적 변수들이 위치한다 힙 영역 동적으로 할당되는 변수의 데이터가 위치 스택 영역 프로그램에서 사용되는 각종 정보(환경변수, 파라미터, 리턴 값 등) 함수 내부에서 선..

oob 문제이다 보호 기법 i386 아키텍쳐 , 32비트 -> canary는 4바이트 canary 있다 -> SFP, RET 마음대로 변경 불가 NX enabled 적용 -> 셸코드불가, rop 이용 No PIE -> 바이너리가 실행되는 메모리 주소가 랜덤화하지 않다. 데이터 영역의 변수들은 항상 정해진 주소에 할당된다. 코드 분석 #include #include #include #include #include char name[16]; char *command[10] = { "cat", "ls", "id", "ps", "file ./oob" }; void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, ..

배열의 속성 배열이 점유하는 공간의 크기는 요소의 개수와 요소 자료형의 크기를 곱한 값이다. 배열이 포함하는 요소의 개수를 배열의 길이라고도 한다. Out of Bounds OOB는 요소를 참조할 때, 인덱스 값이 음수이거나 배열의 길이를 벗어날 때 발생한다. 사용자가 배열 참조에 사용되는 인덱스를 임의 값으로 설정할 수 있다면, 배열의 주소로부터 특정 오프셋에 있는 메모리의 값을 참조할 수 있다. 이를 Out of Bounds 라고 한다. 임의 주소 읽기 OOB로 임의 주소 값을 읽으려면, 읽으려는 변수와 배열의 오프셋을 알아야 한다. 배열과 변수가 같은 세그먼트에 할당되어 있다면, 둘 사이의 오프셋을 항상 일정하므로 디버깅을 통해 쉽게 알아낼 수 있다. 같은 세그먼트가 아니라면, 다른 취약점을 통해 ..

문제 코드 #include #include #include int main() { char buf[0x30]; unsigned long long *addr; unsigned long long value; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); puts("[1] Stack buffer overflow"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf); puts("[2] Arbitrary-Address-Write"); printf("To write: "); scanf("%llu", &addr); printf("With: "); scanf("%llu", &value); pr..