시스템 해킹/DreamHack으로 해커를 꿈꾸며 10

[DreamHack] Return To Library

NX로 공격자가 직접 쉘 코드를 실행하는 것은 어려워졌지만, 스택 버퍼 오버플로우 취약점으로 반환주소를 덮는건 가능했다. // Name: rtl.c // Compile: gcc -o rtl rtl.c -fno-PIE -no-pie #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 Canary\n"); printf("Buf: "); rea..

NX & ASLR 이란?

Address Space Layout Ramdomization(ASLR) 공격자가 메모리에서 임의 버퍼의 주소를 알기 어렵게 한다. ASLR은 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리등을 임의의 주소에 할당하는 보호 기법입니다. ASLR은 커널에서 지원하는 보호기법이며, 다음의 명령어로 확인 가능 cat /proc/sys/kernel/randomize_va-space 리눅스에서 이 값은 0, 1, 2의 값을 가질 수 있다. No ASLR(0) : ASLR을 적용하지 않는다. Conservative Randomization(1) : 스택, 힙, 라이브러리 , vdso 등 Conservative Randomization(2) + brk(2) : (1)의 영역과 brk로 할달한 영역 ASLR 예제..

컴퓨터 시스템 라이브러리란(Library - Static Link vs. Dynamic Link)

라이브러리 - 라이브러리는 컴퓨터 시스템에서, 프로그램들이 함수나, 변수를 공유해서 사용할 수 있게함 - 다수의 프로그램들은 서로 공통으로 사용하는 함수들이 많다. C언어를 비롯하여 많은 컴파일 언어들은 자주 사용되는 함수들의 정의를 묶어서 하나의 라이브러리 파일로 만들고 여러 프로그램 파일이 공유해서 사용할 수 있도록 재원. 링크 링크는 많은 프로그래밍 언어에서 컴파일 마지막 단계, 프로그램에서 어떤 라이브러리 함수를 사용한다면, 호출된 함수와 실제 함수의 링크 과정에서 연결된다. 리눅스에서 C 소스 코드는 전처리, 컴파일, 어셈블 과정을 거쳐서 ELF형식을 갖춘 오브젝트 파일로 번역된다. 오브젝트 파일은 실행 가능한 형식은 갖추고 있지만 라이브러리 함수들의 정의가 어디 있는지 알지 못하므로 실행은 불..

[DreamHack] basic_exploitation_000 (Stack Buffer Overflow)

먼저 C 코드를 보자 1, scanf 범위가 너무 커서 BOF가 가능 2. print 함수로 buf의 주소가 출력된다?? 이거다!! buf함수로 바로 점프해서 쉘코드를 실행시킨다. 쉘코드 작성시 주의 scanf 함수의 경우 \x09, \x0a, \x0b, \x0c, \x0d, \x20 를 읽지 못함(전 까지만 입력 받는다.) 블로그 주인장은 shellcode.asm을 이렇게 작성했고 0b가 들어있네 Ah...(대충 매우 심한 욕) mov $0xb, %al 에서 문제가 생겼으니 수정한다. 이번에는 0a가 들어갔네 ㅋ 다시한다. 감격,,,드디어 성공 이제 프로그램 익스플로잇 흐름을 잡으면 main() 함수가 ret을 호출할 때 eip가 buf 위치로 이동하면서 쉘 코드를 실행할 것이다. from pwn im..

[DreamHack] Return Address Overwrite

1번 문제 입니다ㅏㅏㅏ 처음에 엄청 헤멨던 기억이... 문제 이름에서 추측이 가능하듯이 리턴 주소에 get_shell의 주소를 덮어주면 되는 문제이다. c코드에서 추측해보길 scanf에 BOF 가능성이 있으므로 buf에 return address 전까지 더미 문자열을 넣는다. 하지만 문자열의 길이는 얼만큼 넣어야 할까? buf의 사이즈인 0x28 만큼?? 이건 gdb를 돌려서 확인해본다. 에 rsp를 0x30만큼 빼는걸 확인하면 스택이 0x30만큼 빠지니까 0x30 + rbp 만큼 dummy 문자열을 만든다. 그다음 바로 get_shell 함수 주소를 return 주소에 넣어서 쉘을 획득한다. get_shell 함수의 주소는 disas or print 둘 중에 더 편한걸로 알아내면 된다. 이제 explo..

[DreamHack] 함수 호출 규약 (Caller, Callee, cdecl, SYSV)

함수의 호출 규약은 함수의 호출 및 반환에 대한 약속이다. 한 함수에서 다른 함수를 호출할 때, 프로그램의 실행 흐름은 다른 함수로 이동한다. 그리고 호출한 함수가 반환하면, 다시 원래의 함수로 돌아와서 기존의 흐름을 이어나갑니다. 여기서 질문! 어떻게 다시 원래의 함수로 돌아올까요?? 오늘은 이거에 대한 해답을 정리해볼까 합니다. 함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장해야 합니다. 또한 호출자는 피호출자(Callee)가 요구하는 인자를 전달해 줘야하며 실행이 종료될 때는 반환 값을 전달 받아야 합니다. 함수의 호출 규약을 적용하는 것은 일반적으로 컴파일러의 몫입니다. 프로그래머가 고수준 언어로 코드를 ..

[DreamHack] objdump, nasm 사용법 및 shellcode 추출

어제 너무 과음을 해서 오늘의 첫 블로그 글은 조금 늦게 시작한다. objdump는 GNU 바이너리 유틸리티의 일부로서 라이브러리, 컴파일된 오브젝트 모듈, 오브젝트 파일, 독입 실행파일등의 바이너리 파일들의 정보를 보여주는 프로그램이다. 쉽게 말해서 내가 작성한 Shellcode를 byte code 형태로 추출해주는 녀석이다. - 사용법 - 실습 사용법 objdump [-a|--archive-headers] [-b bfdname|--target=bfdname] [-C|--demangle[=style] ] [-d|--disassemble[=symbol]] [-D|--disassemble-all] [-z|--disassemble-zeroes] [-EB|-EL|--endian={big | little }] ..

[DreamHack] Exploit Tech: Shellcode (ORW, EXECVE)

Shellcode(shellcode)는 익스플로잇을 위해 제작된 어셈블리 코드 조각 주로 일반적으로 셸을 획득하기 위해서는 exec 셸 코드를 사용한다. 만약 해커가 rip를 자신이 작성한 셸코드로 옮길 수 있다면 무시무시하겠져?? 셸코드는 어셈블리어로 구성되므로 공격을 수행할 대상 아키텍쳐와 운영체제에 따라, 그리고 셸코드의 목적에 따라 다르게 작성된다. 파일 읽고 쓰기(open-read-write, orw), 셸 획득(execve)과 관련된 셸코드를 작성해본다! ORW SYSCALL syscall rax arg0 (rdi) arg1 (rsi) arg2 (rdx) read 0x00 unsigned int fd char *buf size_t count write 0x01 unsigned int fd co..

[DreamHack] System Hacking introduction (solve_me)

https://dreamhack.io/lecture/courses/35 Welcome Hackers👨‍💻 시스템 해킹에 입문하려는 분들을 위한 강의 dreamhack.io 기본적인 시스템 공부를 시작하려면 C언어와 파이썬에 대한 기초 지식이 필요하다ㅏㅏ!! 지금 밑에 있는 코드를 보고 "Welcome Hackers :)"가 출력 되는 입력값은 찾는다면 당신은 컴퓨터의 깊고 깊은 심연을 들여다 볼 준비가 되었다는 뜻이다! ㅎㅎ (과연!?!?) 관문은 총 2개로 준비되어 있다!! #include #include #include int main() { int sz = 0x30; char *buf = (char *)malloc(sizeof(char) * sz); puts("Hello World!"); print..