전체 글

전체 글

    LLVM Sanitizer 작성하는 법

    전체 컴파일 파이프라인핵심은 컴파일러 드라이버가 모든것을 연결한다는 점이다. 1. 프론트엔드 호출 (소스 → AST → IR)2. 패스 스케줄링 (어떤 패스를 어떤 순서로 실행할지)3. 런타임 라이브러리 링킹 (compiler-rt 연결) Clang Frontend: 소스코드 → AST → LLVM IR 생성LLVM: IR에 패스 적용 후 백엔드에서 기계어 생성Compiler-rt: 런타임 라이브러리 링킹Sanitizer pass는 항상 마지막에 실행다른 최적화 패스가 sanitizer가 삽입한 코드를 변경하거나 제거할 수 있기 때문 CodeGen 타입 변환int x = 42;C/C++ 타입이 LLVM 타입으로 어떻게 변환되는지 C 타입LLVM 타입크기inti3232비트chari88비트booli88비트..

    sanitizer interceptor의 구현 원리

    c/c++ 개발자들은 버퍼 오버플로우, 댕글링 포인터 등의 메모리 오류, data race, dead lock 등의 멀티 스레드 오류를 자주 접하게 된다. 이런 버그들은 바로 크래시가 나지 않고 나중에 엉뚱한 곳에서 터지기 때문에 찾기가 매우 어려워 이런 문제를 빠르게 찾아내는 것은 항상 골칫거리였다. google이 opensource로 공개한 sanitizer 동적 분석 도구는 c/c++ 개발자들이 효율적으로 문제를 찾아내어 개발 효율성을 높이는 데 도움을 준다. Sanitizer란sanitizer는 google이 오픈소스로 공개한 동적 코드 분석 도구로 Clang 3.1과 GCC 4.8 부터 Clang과 GCC에 통합되었다. 프로그래머가 런타임에 프로그램의 메모리 오류와 멀티스레드 오류를 빠르고 정확..

    Bochs v2.2.1 소스 코드 분석 #2 Bochs 구조와 동작방식

    Bochs는 C++로 작성된 IA-32 아키텍쳐 PC 에뮬레이터이다. 쉽게 말해 소프트웨어로 PC 하드웨어 전체를 흉내내는 프로그램이다. Intel x86 CPU, 일반적인 IO 장치 및 BIOS를 에뮬레이션한다. 현재 Bochs는 386, 486, Pentium, Pentium Pro, AMD64 CPU를 에뮬레이트할 수 있으며 MMX, SSESSE, 3DNow! 명령어 세트를 포함한다.Bochs가 실행할 수 있는 운영체제에는LinuxDOSWindows가 포함된다. 다양한 모드의 컴파일을 사용할 수 있으며 일부는 아직 개발 중이다. 전형적인 응용은 완전한 x86 PC 에뮬레이터를 제공하는 것으로 x86 CPU, hw 장치 및 저장장치를 포함한다. http://bochs.sourceforge.net/ 에..

    LLVM Compiler Under the hood #1 컴파일 흐름 이해

    Compiler 구현 사고방식: 계산기계산기는 수식을 인식할 수 있으므로 이를 기능이 단순한 컴파일러로 볼 수 있다. 계산기 구현을 통해 컴파일러의 구현 사고 방식을 분석해볼 수 있다. 설계할 목표 계산기의 주요 기능 파라미터는 다음과 같다. 피연산자: 정수와 소수 지원연산자: 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙연산 및 지수 연산 지원괄호: 소괄호 지원위의 계산기를 구현하려면 일반적으로 다음의 기본 단계를 거쳐야한다. 어휘 분석: 수식 내의 피연산자, 연산자 및 괄호를 스캔하여 토큰 스트림 생성구문 분석: 연산자의 우선순위, 결합 법칙 등의 규칙에 따라 토큰을 조직하여 구문 분석 트리 구축해석 실행: 구문 분석 트리에 따라 연산 결과 계산 어휘 분석: 피연산자와 연산자 식별수석 123+456 을 예로 ..

    Linux KCOV(Kernel Coverage)

    KCOV란커널 코드에 컴파일 시점에 계측(instrumentation)을 삽입해서, 테스트 케이스가 어떤 코드 경로를 실행했는지 알려주는 도구이다.Syzkaller 같은 커버리지 기반 퍼저가 "흥미로운" 테스트 케이스(새로운 코드 경로를 발견한 케이스)를 판별하는 데 주로 사용된다. 1. 컴파일 시점 계측KCOV는 컴파일러가 자동으로 커널 코드에 추적 함수를 삽입하는 방식이다. 개발자가 직접 코드를 수정할 필요가 없다. GCC/Clang의 -fsanitize-coverage=trace-pc 플래그를 사용하면 컴파일러가 각 기본 블록(basic block) 시작점에 __sanitizer_cov_trace_pc() 함수 호출을 삽입한다.이 함수가 호출되면 해당 위치의 주소(PC)를 공유 메모리에 기록한다. ..

    Compiler 개발 #1 컴파일러 동작 원리

    컴파일러란컴파일러: 소스 언어 → 타겟 언어로 번역하는 프로그램┌──────────────┐ ┌──────────────┐ ┌──────────────┐│ Source Code │ ──▶ │ Compiler │ ──▶ │ Target Code ││ (C, Java) │ │ │ │ (기계어/어셈블리)│└──────────────┘ └──────────────┘ └──────────────┘ 인터프리터와의 차이구분컴파일러인터프리터동작전체 번역 후 실행한 줄씩 즉시 실행속도실행 빠름 ✅실행 느림디버깅에러 위치 파악 어려움에러 진단 쉬움 ✅예시C, C++, GoPython, Ruby 컴파일러 구조두 부분으로 나뉨Analysis (..

    linux vm stack 개발 노트 #1 kvm 내부 구조

    Referenceshttps://zserge.com/posts/kvm/https://www.kernel.org/doc/Documentation/virtual/kvm/api.txthttps://zserge.com/posts/containers/https://github.com/spotify/linux/blob/master/Documentation/kvm/api.txthttps://iovec.net/2024-01-29https://lwn.net/Articles/658511/https://david942j.blogspot.com/2018/10/note-learning-kvm-implement-your-own.html

    CVE-2019-13288 - Infinite Recursion 취약점

    취약점 개요CVE-2019-13288 은 xpdf 3.02 버전에서 Parser::getObj()함수 (Parser.cc) 에서 발생하는 무한 재귀 취약점으로조작된 PDF 파일이 Parser::getObj() 함수의 무한 재귀를 유발하여 스택 메모리 고갈 → 프로그램 크래시 (DoS) 를 일으키는 취약점이다. 환경 구성먼저 퍼징 타겟인 xpdf를 빌드한다.wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gztar -xvzf xpdf-3.02.tar.gzcd xpdf-3.02make clean# 디버그 + 최적화 비활성화CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$(pwd)/install/"makemake in..

    syzbot, qemu, gdb를 사용하여 linux kernel의 버그 수정

    공개된 Syzbot 버그를 통해 보고서부터 시작하여 제공된 환경을 사용하여 원래 충돌을 확인하고 영향을 받는 커널 버전을 로컬에서 다시 빌드한 다음, 상위 버전 수정 사항을 적용한 후 문제가 해결되었는지 확인하는 절차를 알아보자.목표는 근본 원인을 추적하거나 패치하는 것이 아니다. 버그를 로컬 환경에서 실행하여 수정 전후의 상태를 확인하는 것이다. Linux Kernel 공개 버그리눅스 커널에서 공개된 버그를 찾는 방법은 여러가지 이다.BugZillaSyzbotSyzkaller-bugsChangelogsGit log BugZillaBugZilla는 리눅스 커널의 버그를 보고하는 표준적인 방법이다. subsystem 별로 정리된 흥미로운 취약점(예: IPv4 및 IPv6 네트워킹, ext* 파일 시스템 등..