전체 글

전체 글

    LLVM IR 비트코드 분석 - Array(배열)

    array.c #include int main() { int numArr[] = {1, 2, 3}; int numArr2[3] = {1, 2, 3}; int numArr3[3]; numArr3[0] = 1; numArr3[1] = 2; numArr3[2] = 3; } array.ll ; Function Attrs: noinline nounwind optnone uwtable define dso_local i32 @main() #0 { entry: %numArr = alloca [3 x i32], align 4 %numArr2 = alloca [3 x i32], align 4 %numArr3 = alloca [3 x i32], align 4 %0 = bitcast [3 x i32]* %numArr to i..

    LLVM IR 비트코드 분석 - add(덧셈 연산)

    add.c #include int main() { int a = 1; int b = 2; int sum = a + b; printf("%d", sum); } add.ll %a = alloca i32, align 4 %b = alloca i32, align 4 %sum = alloca i32, align 4 store i32 1, i32* %a, align 4 store i32 2, i32* %b, align 4 %0 = load i32, i32* %a, align 4 %1 = load i32, i32* %b, align 4 %add = add nsw i32 %0, %1 store i32 %add, i32* %sum, align 4 %2 = load i32, i32* %sum, align 4 %call =..

    LLVM IR 비트코드 분석 - Variable(변수)

    var.c #include int global_var = 12; int main(){ int local_var; local_var = 14; return global_var; } var.ll @global_var = dso_local global i32 12, align 4 ; Function Attrs: noinline nounwind optnone uwtable define dso_local i32 @main() #0 { entry: %retval = alloca i32, align 4 %local_var = alloca i32, align 4 store i32 0, i32* %retval, align 4 %0 = load i32, i32* @global_var, align 4 ret i32 %0 }..

    LLVM Pass Practice

    LLVM Pass Practice

    LLVM Pass를 작성하고 실행시켜보는 연습을 해보자. 1. 함수 이름을 출력하는 Pass 작성하기 for 문으로 함수의 이름을 모두 출력한다. test.c 파일은 다음과 같이 작성했다. 2. Instruction의 개수를 세는 Pass 작성하기 이중 for 문을 활용하여 Function, BasicBlock, Instuction을 확인하며, Instruction 하나당 count 변수를 1씩 증가시킨다. 이렇게 존재하는 모든 Instruction에 대해서 count를 증가시키면서 Instruction의 개수를 셀 수있다. 함수 이름과 instruction 개수를 함께 출력하여 쉽게 확인 가능하도록 한다. *인자로 Module&을 받아서 for문으로 Function을 얻는 것과 Function&을 인자..

    LLVM Skeleton Pass

    LLVM build와 install을 마쳤으니 LLVM Pass를 실행해보자. github에서 skeleton pass를 다운받아 실행시켜보려고 한다. 1. Clone LLVM Skeleton Pass git clone https://github.com/manggoguy/llvm-pass-skeleton.git cd llvm-pass-skeleton (clone한 path) mkdir build 소스코드의 구성을 살펴보자. 하나의 Pass당 .h와 .cpp가 하나씩 구성되어있다. ModulePass를 상속받는 클래스 생성한다. 실질적인 동작 수행은 runOnModule에서 이뤄진다. runOnModule 에서는 모듈의 모든 함수의 이름을 출력한다. 2. Source file 생성 vi test.c tar..

    Window에서 LLVM build & Install 하기

    Oracle VM Virtual Box로 llvm build를 계속 실패하다가 결국 window 환경에서 build하게 되었다. VM에서 실패한 이유는 메모리 부족이라고 추정하고는 있지만, 정확한 이유는 찾지 못했다. 나와 같은 문제로 VM Box로 llvm build를 실패한 사람들을 위해 window 에서 llvm build / install 하는 방법을 공유한다. 1. Download Source 먼저 LLVM Download Page에서 다운받으려는 버전을 확인하고, 해당 버전의 GitHub Release로 이동한다. https://releases.llvm.org/download.html LLVM Download Page If you'd like access to the "latest and gr..

    운영체제 개요

    1. 운영체제 서비스 프로그램의 실행을 제어하는 기능이 구현된 함수들로 구성된 소프트웨어 컴퓨터 하드웨어와 프로그램 사이의 인터페이스 1-1. 컴퓨터 하드웨어, 운영체제, 사용자와의 관계를 표현한 계층구조 아래 계층: 위 계층으로 서비스 제공 위 계층: 아래 계층이 제공하는 서비스를 이용 프로그램: 유틸리티(utility)라고 부르는 시스템 프로그램과 사용자가 일상 생활에서 사용하는 응용프로그램으로 구성 1-2. 운영체제가 제공하는 서비스 운영체제는 상위 계층에게 서비스를 제공한다. 사람이나 프로그램의 지시에 따라 새로운 프로그램을 실행시키는 일을 한다. 사람이나 프로그램 대신 컴퓨터 내부 자원(resource)을 접근해준다. 컴퓨터에서 발생할 수 있는 각종 오류나 예외상황을 감지하고 상위 계층에게 보고..

    Buffer Overflow

    Buffer Overflow

    BOF에 대한 내용을 정리하기에 앞서, 취약점(Vulnerability)과 관련된 용어에 대해 알아보자 Vulnerability 소프트웨어에서 로그인 없이 액세스를 활성화하거나 허가되지 않은 코드를 실행하거나 컴퓨터를 손상시키는 등 공격 시 예기치 않은 컴퓨터 동작을 발생시키는 Bug 이다. Exploit 프로그램에 존재하는 Bug를 악용하는 input이다. Exploitable: Bug를 이용해서 소프트웨어를 성공적으로 장악할 수 있다. (공격하는 데 사용할 수 없다면 'exploitable 하지 않다'고 한다.) Threat 컴퓨터 보안에서 Threat은 취약성을 악용하여 보안을 위반함으로써 피해를 입힐 가능성이 있는 위험이다. 취약점 공격의 종류는 그 구분 방법에 따라 여러 가지로 나눌 수 있으며,..