일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- System
- reversing
- 시스템해킹
- XSS
- network
- 해킹
- Webhaking
- 소프트웨어보안
- 알고리즘
- bee-box
- dreamhack
- ftz
- 웹해킹
- WarGame
- 네트워크
- CodeEngn
- 비박스
- Web
- 드림핵
- webhacking
- 리버싱
- 순서도
- 네트워크보안
- 시스템
- 워게임
- 모의해킹
- hacking
- TCP
- 소프트웨어
- 웹
- Today
- Total
목록Pwnable/Dreamhack (10)
Without a Break
Lazy binding을 하는 바이너리는 실행 중에 GOT 테이블을 업데이트할 수 있어야 하므로 GOT에 쓰기 권한이 부여된다. 그런데 이는 바이너리를 취약하게 만드는 원인이 된다. 또한, ELF의 데이터 세그먼트에는 프로세스의 초기화 및 종료와 관련된 .init_array, .fini_array가 있다. 이 영역들은 프로세스의 시작과 종료에 실행할 함수들의 주소를 저장하고 있는데, 여기에 공격자가 임의로 값을 쓸 수 있다면, 프로세스의 실행 흐름이 조작될 수 있다. => RELocation Read-Only(RELRO) 개발 RELRO : 쓰기 권한이 불필요한 데이터 세그먼트에 쓰기 권한을 제거한다. Partial RELRO 권한 prelro를 실행해보면 0x601000부터 0x602000까지의 주소에..
라이브러리 : 컴퓨터 시스템에서 프로그램들이 함수나 변수를 공유해서 사용할 수 있게 한다. C언어를 비롯하여 많은 컴파일 언어들은 자주 사용되는 함수들의 정의를 묶어서 하나의 라이브러리 파일로 만들고, 이를 여러 프로그램이 공유해서 사용할 수 있도록 지원하고 있다. 라이브러리를 사용하면 같은 함수를 반복적으로 정의해야 하는 수고를 덜 수 있어서 코드 개발의 효율이 높아진다. 또한, 표준 라이브러리가 제작되어 있어서 개발자들은 쉽게 해당 함수들을 사용할 수 있다. 링크 : 프로그램에서 어떤 라이브러리의 함수를 사용한다면, 호출된 함수와 실제 라이브러리의 함수가 링크 과정에서 연결된다. 동적 링크 동적 링크된 바이너리를 실행하면 동적 라이브러리가 프로세스의 메모리에 매핑되고, 실행 중에 라이브러리의 함수를 ..
ASLR(Address Space Layout Randomization) : 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법 커널에서 지원하는 보호 기법 cat /proc/sys/kernel/randomize_va_space2 명령어로 확인 가능 리눅스에서 이 값은 0/1/2의 값을 가질 수 있음 ASLR이 적용되는 메모리 영역 No ASLR(0) : ASLR을 적용하지 않음 Conservative Randomization(1): 스택, 힙, 라이브러리, vdso 등 Conservative Randomization + brk(2): (1)의 영역과 brk로 할당한 영역 ASLR의 특징 코드 영역의 main 함수를 제외한 다른 영역의 주소들은 실행할 때마다 변경..
스택 카나리(Stack Canary) : 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법으로, 카나리 값의 변조가 확인되면 프로세스는 강제 종료된다. 카나리 생성 과정 : 카나리 값은 프로세스가 시작될 때, TLS에 전역 변수로 저장되고, 각 함수마다 프롤로그와 에필로그에서 이 값을 참조한다. 카나리 우회 1. 무차별 대입 무차별 대입으로 x64 아키텍처의 카나리 값을 알아내려면 최대 256^7번, x86 에서는 최대 256^3 번의 연산이 필요하다. => 즉, x64 아키텍처의 카나리는 무차별 대입으로 알아내는 것이 현실적으로 어렵고, x86 아키텍처는 구할 수 닝ㅆ지만 실제 서버를 대상으로 무차별 대입을 시도하는 것은 ..
버퍼 오버플로우 버퍼 버퍼는 일상에서 '완충 장치'라는 뜻으로 사용되며, 컴퓨터 과학에서는 '데이터가 목적지로 이동되기 전에 보관되는 임시 장소'의 의미로 쓰인다. 수신 측과 송신 측 사이에 버퍼라는 임시 저장소를 두고, 이를 통해 간접적으로 데이터를 전달하게 한다. 송신 측은 버퍼로 데이터를 전송하고, 수신 측은 버퍼에서 데이터를 꺼내 사용합니다. 이렇게 하면 버퍼가 가득 찰 때까지는 유실되는 데이터 없이 통신할 수 있다. 버퍼 오버플로우 일반적으로 버퍼가 넘치는 것을 말한다. 일반적으로 버퍼는 메모리상에 연속해서 할당되어 있으므로, 어떤 버퍼에서 오버플로우가 발생하면, 뒤에 있는 버퍼들의 값이 조작될 위험이 있다. 또한, 버퍼 오버플로우는 일반적으로 어떤 메모리 영역에서 발생해도 큰 보안 위협으로 이..

해킹 분야에서 상대 시스템을 공격하는 것을 익스플로잇(Exploit)이라고 부른다. 그 중, 쉘코드에 대해 알아보도록 하자. 셸코드(Shellcode) : 익스플로잇을 위해 제작된 어셈블리 코드 조작 orw 셸코드 : 파일을 열고 읽은 뒤 화면에 출력해주는 셸코드 syscall rax arg0 (rdi) arg1 (rsi) arg2 (rdx) read 0x00 unsigned int fd char *buf size_t count write 0x01 unsigned int fd const char *buf size_t count open 0x02 const char *filename int flags umode_t mode 1. int fd = open("/tmp/flag", O_RDONLY, NULL) ..

debugee.c 파일을 생성한 뒤 디버그 파일을 실행시킨다. 실행하면 다음과 같이 뜬다. start ELF : 리눅스의 실행 파일 형식 EP(Entry Point) : ELF의 헤더 중 진입점 필드 debugee 파일을 readelf로 확인해 본 결과, debugee의 진입점은 0x1060이라는 것을 알 수 있다. gdb debugee로 들어가 pwndbg에 start 명령을 입력하면 마찬가지로 진입점의 주소를 확인할 수 있다. Context context는 크게 registers, disasm, stack, backtrace의 4개의 영역으로 나눈다. registers 레지스터의 상태를 보여줍니다. disasm rip부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여줍니다. stack rsp부터 여러 줄에..
컴퓨터 구조와 명령어 집합 구조 컴퓨터 구조 : 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구상하는 방법 컴퓨터의 기능 구조에 대한 설계, 명령어, 집합구조, 마이크로 아키텍쳐, 하드웨어 및 컴퓨팅 방법에 대한 설계 등이 포함 컴퓨터의 기능 구조에 대한 설계 : 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야 명령어 집합구조(Instruction Set Architecture) : CPU의 명령에 대한 설계. CPU가 처리해야하는 명령어를 설계하는 분야 마이크로 아키텍쳐(Micro Architecture) : CPU의 하드웨어적 설계. 정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분..