CS/LLVM
LLVM IR 비트코드 분석 - UAF
dangling_ptr.c #include int main(void) { int *ptr; ptr = (int *)malloc(sizeof(int)); *ptr = 1; printf("%d\n", *ptr); free(ptr); *ptr = 2; // 해제된 메모리 영역에 접근 } dangling_ptr.ll %1 = alloca i32*, align 8 %2 = call i8* @malloc(i64 4) %3 = bitcast i8* %2 to i32* store i32* %3, i32** %1, align 8 %4 = load i32*, i32** %1, align 8 store i32 1, i32* %4, align 4 %5 = load i32*, i32** %1, align 8 %6 = load ..
Use-After-Free (UAF)
Use-After-Free 란? 메모리 참조에 사용한 포인터를 메모리 해제 후에 적절히 초기화하지 않아서 (Dangling pointer), 또는 해제한 메모리를 초기화하지 않고 다음 청크에 재할당해주면서 발생하는 취약점이다. 즉, 해제된 메모리에 접근할 수 있을 때 발생하는 취약점이다. Dangling Pointer: 해제된 메모리를 가리키고 있는 포인터. UAF가 발생하는 원인이 될 수 있다. Use-After-Free (UAF): 해제된 메모리에 접근할 수 있을 때 발생하는 취약점 이 취약점은 현재까지도 브라우저 및 커널에서 자주 발견되고 있으며, 익스플로잇 성공률도 다른 취약점에 비해 높아 상당히 위험하다고 알려져 있다. 1. Dangling Pointer 유효하지 않은 메모리 영역을 가리키는 포..
LLVM IR 비트코드 분석 - malloc(말록)
malloc.c #include #include int main(){ int arr[4] = {4, 3, 2, 1}; int* ptrArr; // int 타입 사이즈*4 만큼의 메모리를 할당 ptrArr = (int *)malloc(sizeof(int) * 4); } malloc.ll ; Function Attrs: noinline nounwind optnone uwtable define dso_local i32 @main() #0 { entry: %arr = alloca [4 x i32], align 16 %ptrArr = alloca i32*, align 8 %0 = bitcast [4 x i32]* %arr to i8* call void @llvm.memcpy.p0i8.p0i8.i64(i8* ali..
LLVM IR 비트코드 분석 - Function(함수)
func.c #include unsigned add1(unsigned a, unsigned b) { int c; return a + b; } func.ll ; Function Attrs: noinline nounwind optnone uwtable define dso_local i32 @add1(i32 %a, i32 %b) #0 { entry: %a.addr = alloca i32, align 4 %b.addr = alloca i32, align 4 %c = alloca i32, align 4 store i32 %a, i32* %a.addr, align 4 store i32 %b, i32* %b.addr, align 4 %0 = load i32, i32* %a.addr, align 4 %1 = load ..
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를 작성하고 실행시켜보는 연습을 해보자. 1. 함수 이름을 출력하는 Pass 작성하기 for 문으로 함수의 이름을 모두 출력한다. test.c 파일은 다음과 같이 작성했다. 2. Instruction의 개수를 세는 Pass 작성하기 이중 for 문을 활용하여 Function, BasicBlock, Instuction을 확인하며, Instruction 하나당 count 변수를 1씩 증가시킨다. 이렇게 존재하는 모든 Instruction에 대해서 count를 증가시키면서 Instruction의 개수를 셀 수있다. 함수 이름과 instruction 개수를 함께 출력하여 쉽게 확인 가능하도록 한다. *인자로 Module&을 받아서 for문으로 Function을 얻는 것과 Function&을 인자..