티스토리

검색하기내 프로필

블로그 홈

미역줄기의 이모저모

구독자
8

구독하기 방명록
신고

인기글

  • [ Dreamhack ] Return to Shellcode공감수3댓글수2조회 3
  • [ Dreamhack ] Stack Canary공감수0댓글수1조회 1
  • [ Dreamhack ] Return to Library공감수0댓글수1조회 1

주요 글 목록

  • [DreamHack]off_by_one_001글 내용

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

    좋아요0
    댓글3작성시간2024. 5. 30.
    게시글 이미지
  • [ Dreamhack ] Format String Bug글 내용

    보호 기법 & 문제 코드 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--;..

    좋아요0
    댓글0작성시간2024. 3. 1.
    게시글 이미지
  • [ Dreamhack ] 포맷 스트링 버그(FSB)글 내용

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

    좋아요1
    댓글0작성시간2024. 2. 24.
    게시글 이미지
  • [ Dreamhack ] ssp_000글 내용

    문제 & 보호기법 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]..

    좋아요0
    댓글1작성시간2024. 2. 24.
    게시글 이미지
  • 기초 CS- Introduction글 내용

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

    좋아요0
    댓글0작성시간2024. 2. 23.
    게시글 이미지
  • [ Dreamhack ] out_of_bound글 내용

    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, ..

    좋아요0
    댓글0작성시간2024. 2. 20.
    게시글 이미지
  • [ Dreamhack ] Out of Bounds글 내용

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

    좋아요0
    댓글0작성시간2024. 2. 20.
    게시글 이미지
  • [ Dreamhack ] fho글 내용

    문제 코드 #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..

    좋아요0
    댓글0작성시간2024. 2. 17.
    게시글 이미지
  • [ Dreamhack ] Hook Overwrite글 내용

    후킹(hooking) 운영체제가 어떤 코드를 실행하려 할 때, 이를 낚아채어 다른 코드가 실행되게 하는 것이다. 이때 실행되는 코드를 훅(Hook)이라고 부른다. 후킹의 용도 함수에 훅을 심어서 함수의 호출을 모니터링한다. 함수에 기능을 추가한다. 아예 다른 코드를 심어서 실행 흐름을 변조시킨다. 훅 오버라이트 malloc()과 free() 를 호출할 때 함께 호출되는 훅이 함수 포인터 형태로 존재한다. 이 함수 포인터를 임의의 함수 주소로 오버라이트하여 악의 적인 코드를 실행하는 기법이다. Full RELRO를 우회하는 기법이다. 원가젯 단일 가젯만으로도 셸을 실행할 수 있는 매우 강력한 가젯이다. malloc, free, realloc, hook c언어에서 메모리의 동적 할당과 해제를 담당하는 함수 ..

    좋아요0
    댓글0작성시간2024. 2. 17.
  • [ Dreamhack ] basic_rop_x86글 내용

    문제설명 코드 분석 #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[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } char형 버퍼에 0x40 만큼 할당했다. read를 보면 버퍼..

    좋아요0
    댓글0작성시간2024. 2. 16.
    게시글 이미지
  • [ Dreamhack ] basic_rop_x64글 내용

    문제 설명 본격 적인 분석 전에 checksec으로 보호기법을 확인한다. x86-64 아키텍처. canary가 없다. NX가 적용되었다. PIE 없다. canary가 없다 == SFP, ret와 그 뒷 주소를 마음대로 변경해도 프로세스 종료가 안 된다! NX 걸려있다 == 셸코드 사용이 어렵다 == return oriented programming 기법을 사용하자!PIE가 적용되지 않았다 == 바이너리가 실행되는 메모리 주소가 랜덤화하지 않는다. 코드 분석 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0)..

    좋아요0
    댓글0작성시간2024. 2. 16.
    게시글 이미지
  • [ Dreamhack ] rop글 내용

    ROP(Return Oriented Programming) ASLR이 걸린 환경에서 system 함수를 사용하려면 프로세스에서 libc가 매핑된 주소를 찾고, 그 주소로부터 system 함수의 오프셋을 이용하여 함수의 주소를 계산해야한다. ROP는 리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는 기법이다. ROP 페이로드는 리턴 가젯으로 구성되는데, ret 단위로 여러 코드가 연쇄적으로 실행되는 모습에서 ROP chain이라고 불린다. 페이로드 작성 과정을 보면,, chain이라고 한 이유가 다 있다.... 문제 들어가기 전 복습 1. plt에는 got 엔트리의 주소가 적혀있고 got에는 해당 함수의 실제 주소가 적혀있다. 2. ASLR이 적용되면 실행할 때마다 스택, 힙, libc_base의 주소가 ..

    좋아요1
    댓글2작성시간2024. 2. 11.
    게시글 이미지
  • [ Dreamhack ] Return to Library글 내용

    프로세스에 실행 권한이 있는 메모리 영역은 일반적으로 바이너리의 코드 영역과 바이너리가 참조하는 라이브러리의 코드 영역이다. 공격자들을 libc의 함수들로 NX를 우회하고 셸을 획득하는 공격 기법을 개발하였다. 이를 Return To Libc 라고 한다. 문제 코드 #include #include #include const char* binsh = "/bin/sh"; int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Add system function to plt's entry system("echo 'system@plt'"); // Leak canary printf("[1] Leak Ca..

    좋아요0
    댓글1작성시간2024. 2. 9.
    게시글 이미지
  • [ Dreamhack ] link글 내용

    링크 링크는 컴파일의 마지막 단계로 알려져있다. 프로그램에서 어떤 라이브러리의 함수를 사용한다면, 호출된 함수와 실제 라이브러리의 함수가 링크 과정에서 연결된다. 리눅스에서 C 소스 코드는 전처리, 컴파일, 어셈블 과정을 거쳐 ELF형식을 갖춘 오브젝트 파일로 번역된다. 오브젝트 파일은 실행 가능한 형식을 갖추고 있지만, 라이브러리 함수들의 정의가 어디 있는지 알지 못하므로 실행은 불가능하다. 링크를 거치고 나면 프로그램에서 함수를 호출할 때, 함수의 정의가 있는 라이브러리에서 함수의 코드를 찾고 해당 코드를 실행하게 된다. 라이브러리와 링크의 종류 동적 라이브러리를 링크하는 동적 링크, 정적 라이브러리를 링크하는 정적 링크로 나뉜다. 동적 링크 프로그램을 사람, 라이브러리를 도서관이라고 비유했을 때, ..

    좋아요0
    댓글0작성시간2024. 2. 9.
    게시글 이미지
  • [ Dreamhack ] NX & ASLR글 내용

    NX nx는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호기법이다. 어떤 메모리 영역에 대해 쓰기 권한과 실행 권한이 함께 있으면 취약해지기 쉽다. CPU가 NX를 지원하면 컴파일러 옵션을 통해 바이너리에 NS를 적용할 수있다. 그럼 각 메모리 영역에 필요한 권한만을 부여받을 수 있다. checksec을 이용해서 NX를 확인할 수 있다. NX를 intel은 XD, AMD는 NX, 윈도우는 DEP, ARM에서는 XN이라고 칭한다. Return to Shellcode w/t NX r2s에 NX 보호기법을 적용한 후, 동일한 익스플로잇을 실행해본다. r2s.c를 -zexecstack 옵션을 제거해 컴파일하고, checksec으로 확인해보면 NX가 활성화되어 있다. $ checkse..

    좋아요0
    댓글0작성시간2024. 2. 8.
    게시글 이미지
  • [ Dreamhack ] ssp_01글 내용

    문제코드 #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"); } void print_box(unsigned char *box, int idx) { printf("Element of index %d is : %02x\n", idx, box[idx]); } void menu() { puts("[F]ill..

    좋아요0
    댓글0작성시간2024. 2. 8.
    게시글 이미지
  • [ Dreamhack ] Stack Canary글 내용

    스택 카나리는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법이다. 스택버퍼 오버플로우 공격을 한층 더 어렵게 만든다. 스택 버퍼 오버플로우로 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로 카나리 값을 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조하게 된다. 이 경우, 에필로그에서 변조가 확인되어 공격자는 실행 흐름을 획득하지 못한다. 그림은 저렇게 그렸지만!!! 사실은 sfp 앞에 있고 !! 정확히 buf 보다는 데이터 인자 라고 하는게 맞겠다!!!! 카나리의 작동 원리 // Name: canary.c #include int main() { char buf[8]; read(0, buf, 32); ret..

    좋아요0
    댓글1작성시간2024. 2. 8.
    게시글 이미지
  • [ Dreamhack ] Return to Shellcode글 내용

    문제코드 리뷰 #include #include int main() { char buf[0x50]; printf("Address of the buf: %p\n", buf); printf("Distance between buf and $rbp: %ld\n", (char*)__builtin_frame_address(0) - buf); printf("[1] Leak the canary\n"); printf("Input: "); fflush(stdout); read(0, buf, 0x100); printf("Your input is '%s'\n", buf); puts("[2] Overwrite the return address"); printf("Input: "); fflush(stdout); gets(buf);..

    좋아요3
    댓글2작성시간2024. 2. 8.
    게시글 이미지
  • [ Dreamhack ] shell_basic글 내용

    1, 문제 확인 참고 코드 $ cat write.asm section .text global _start _start: ;/* write(fd=1, buf='hello', n=48) */ ;/* push 'hello\x00' */ mov rax, 0x0a6f6c6c6568 push rax mov rsi, rsp push 1 pop rdi push 0x6 pop rdx ;/* call write() */ push 1 pop rax syscall $ nasm -f elf64 write.asm $ objcopy --dump-section .text=write.bin write.o $ xxd write.bin 00000000: 48b8 6865 6c6c 6f0a 0000 5048 89e6 6a01 H.hello..

    좋아요0
    댓글1작성시간2024. 2. 7.
    게시글 이미지
  • [ Dreamhack ] 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; } 지금부터는 내가 아는걸 토대로 분석하는 것이기 ..

    좋아요0
    댓글0작성시간2024. 2. 6.
    게시글 이미지
문의안내
  • 티스토리
  • 로그인
  • 고객센터
© Kakao Corp.