분류 전체보기
syzkaller를 이용한 커널 퍼징 #2 Syzkaller의 동작 구조
커널 퍼징Linux에는 약 450개의 시스템 호출이 있는데 언뜻 보기에 퍼징할 공격 표면이 많지 않아 보일 수 있다. 하지만 실제 공격 표면은 매우 넓은데 이러한 시스템 콜이 수많은 커널 하위 시스템과의 통신 채널을 제공하기 때문이다. 가장 간단한 시스템 콜 open() 조차도 파일 시스템 드라이버(ext4, btrfs) 마다 /dev 하위의 노드 (/dev/null, /dev/sda...) 마다 각각 다른 구현을 가지고 있다. 또 네트워크 패킷 처리, 파일시스템 마운트 (USB 등 외부 미디어), 하드웨어 장치와 직접 통신까지 생각하면 커널은 훨씬 많은 공격 표면을 가지고 있다.따라서 syzlang 정의가 아무리 많아도 모든 케이스를 커버하기 어려워 여전히 모든 공격 표면을 완전히 커버하지는 못한다. ..
syzkaller를 이용한 커널 퍼징 #1 Fuzzing 이란
Fuzzing이란퍼징은 프로그램에 무작위 입력을 넣어서 크래시나 버그를 자동으로 찾아내는 소프트웨어 테스팅 기법으로 1980년대부터 있었지만, 최근 보안 연구에서 다시 각광받고 있다.핵심 구성 요소는 다음과 같다.1. 입력 생성 (Input Generation)모델 기반: 입력 형식(문법)을 알고 유효한 테스트 케이스 생성뮤테이션 기반: 기존 시드 입력을 무작위로 변형 → AFL, honggfuzz 같은 도구가 사용2. 실행 엔진 (Execution Engine)생성된 입력으로 프로그램을 실행하고 크래시 감지Sanitizer(ASan, UBSan 등)를 사용해 메모리 오류나 정의되지 않은 동작을 더 잘 탐지Fork 서버, 퍼시스턴트 퍼징 등으로 실행 속도 최적화 실제 예시 - pdf reader 퍼징P..
LLVM tutorial - Clang SanitizerCoverage 분석
#include void handle_positive(void) { printf("Positive!\n");}void handle_negative(void) { printf("Negative!\n");}void cleanup(void) { printf("Cleanup!\n");}void process(int x) { if (x > 0) { handle_positive(); } else { handle_negative(); } cleanup();}int main() { process(5); process(-3); return 0;} SanitizerCoverage로 컴파일하여 어셈블리 확인clang -S -O1 -fsanitiz..
GO runtime 해부 #0 Monkey Patching
Go 프로그램 부트스트랩go 프로그램 시작 과정은 다음과 같다._rt0 (Entry Point) ↓_main ↓runtime.rt0_go (스케줄러 및 첫 고루틴 설정) ↓runtime.main ├→ runtime.init ├→ main.init └→ main.main (우리가 작성한 코드) ↓exit(0) 핵심 개념은 다음과 같다. 우리가 작성하는 main.main()은 진짜 시작점이 아님Go 런타임이 먼저 초기화 작업 수행:스케줄러 설정메모리 할당자 초기화GC 설정고루틴 스택 준비 진입점이 main 위에서 시작한다는 점이 중요하다. 진짜 시작점은 _rt0 이다. main()은 런타임 초기화의 끝 에 해당한다.이게 왜 중요할까 panic과 defer의 내부 구조panic은 함수가 아니다g..
SIMD #0 SIMD의 기본 개념과 병렬 처리 원리
SIMD란 Single Instruction, Multiple Data의 약자하나의 명령어로 여러 데이터를 동시에 처리하는 병렬 처리 기법 기본 원리일반 스칼라 연산:a[0] + b[0] = c[0] // 1번 실행a[1] + b[1] = c[1] // 2번 실행a[2] + b[2] = c[2] // 3번 실행a[3] + b[3] = c[3] // 4번 실행SIMD 벡터 연산:[a0, a1, a2, a3] + [b0, b1, b2, b3] = [c0, c1, c2, c3] // 1번에 실행! CPU 아키텍처와 벡터 연산의 관계레지스터 크기와 처리 능력128비트 레지스터 (SSE): 4개의 32비트 float 동시 처리256비트 레지스터 (AVX/AVX2): 8개의 32비트 float 동시 처리..
LLVM tutorial #0 Architecture
전통적인 컴파일러는 소스 언어와 타겟 아키텍쳐가 강하게 결합되어있어 새로운 언어나 새로운 하드웨어를 지원하기 위해선 컴파일러 전체를 다시 작성해야했다.이 구조의 문제점은 당연히 N개의 언어와 M개의 타겟을 지원하려면 N × M개의 컴파일러가 필요하다는 것이다. LLVM 3단계 설계LLVM을 활용하면 N + M개만 필요하다.전통적 방식:C 컴파일러 → x86 코드C 컴파일러 → ARM 코드Rust 컴파일러 → x86 코드Rust 컴파일러 → ARM 코드(4개 필요)LLVM 방식:C → LLVM IR ┐Rust → LLVM IR ┼→ LLVM IR → x86 ┼→ LLVM IR → ARM(2개 프론트엔드 + 2개 백엔드 = 4개) 각 단계를 간단히 설명하자면 1단계 Frontend역할..
x86 Instruction Set, SIMD, Image Processing Algorithms, DSP Routines, MMX, SSE, AVX #0 Simple Assembly Program
1. Project 생성Visual Studio에서 파일 -> 새로 만들기 -> 프로젝트 -> Windows Console Application 선택하여 프로젝트를 생성한다. 2. Source Files 작성cpp 파일을 삭제 후 Windows MASM 32비트 어셈블리 코드 를 작성한다.// main.asm.386.model flat.codestart PROC mov eax,213 add eax,432 retstart endpend start 3. masm 빌드 설정- project 우클릭 -> Build Dependencies -> Build Customizations... -> masm 선택- assmebly 파일 우클릭 -> Properites(속성..
vmware와 hyper v 동시에 쓰기
VMware와 Hyper-V는 동시에 사용하기 어렵습니다. 둘 다 설치 할 경우 아래와 같은 에러를 볼 수 있습니다. VMware Workstation and Hyper-V are not compatible. Remove the Hyper-V role from the system before running VMware Workstation. VMware를 선택하실 분들은 명령프롬프트를관리자 권한으로 실행해서 아래 작업을 수행하십시오. bcdedit /set hypervisorlaunchtype off 재부팅 제어판\모든 제어판 항목\네트워크 연결에서네트워크 어댑터 중에서 vEthernet (기본 스위치) 를 사용 안함 상태로 바꿈 Hyper-V를 선택하실 분들은 명령프롬프트를관리자 권한으로 실행해..
CUDA #0 환경 구성
1. Labnvidia-smi Sun Sep 7 20:37:56 2025 +-----------------------------------------------------------------------------------------+| NVIDIA-SMI 560.94 Driver Version: 560.94 CUDA Version: 12.6 ||-----------------------------------------+------------------------+----------------------+| GPU Name Driver-Model | Bus-Id Disp.A | Volat..