
동아리에서 '포너블을 위한 어셈블리 기초 및 디버깅'을 주제로, 포너블 스터디에서 발표했는데 블로그에도 소개하면 좋을 것 같은 내용을 들고 왔다. 이번 내용은 스택과 스택 프레임에 대한 내용으로, 스택에 데이터가 어떠한 방식으로 쌓이는지를 이해할 수 있을 것이다. 먼저, 스택의 역할을 소개한다. 스택은 함수 호출을 위한 주소 값을 저장하고, 함수를 호출할 때의 인자 및 지역 변수가 이 세그먼트에 저장된다. amd64 기준으로, 함수 인자는 RDI->RSI->RDX->RCX->R8->R9 순으로 레지스터를 사용한다. 만약, printf와 같이, 함수의 인자 개수가 제한이 없는 경우는 어떨까? // https://code.woboq.org/userspace/glibc/stdio-common/printf.c...

컴퓨터의 부팅 과정에 대해 이해해 보자. 부팅은 PC가 켜진 후에 OS가 실행되기 전까지 수행되는 일련의 작업 과정을 의미한다. 부팅 과정에 수행하는 작업에는 프로세서 초기화(멀티코어 관련 처리 포함), 메모리와 외부 디바이스 검사 및 초기화, 부트 로더를 메모리에 복사하고 OS를 시작하는 과정 등이 포함된다. 1. Power 누르기 컴퓨터의 전원을 누르면, 메인보드에 전력이 들어온다. 뒤이어 메인보드에 연결된 장치(CPU, Memory, Disk, etc.)에도 전력이 들어온다. 2. BIOS 동작 CPU가 ROM(Read-Only Memory)에 저장된 BIOS(Basic Input/Output System)을 실행한다. BIOS는 메인보드에 포함된 펌웨어(Firmware)의 일종으로, 이름 그대로 ..

vmlinux와 bzImage에 대해 이해해 보자. 1. vmlinux vmlinux는 압축되지 않은 커널 이미지를 ELF 형식으로 담고 있는 정적 링크된 실행 파일이라서, 사실상 커널 그 자체라고 할 수 있다. 이 파일은 심볼이나 재배치 정보가 살아 있어서, 커널 디버깅 시에 유용하게 사용할 수 있다고 한다. 그러나, 이 파일만으로는 컴퓨터를 부팅(운영체제를 메모리에 로딩)할 수 없다. 심볼을 제거하고, 압축도 해서 크기를 줄인 뒤에, 부팅에 관계된 코드까지 넣어야 부팅 가능한 이미지가 되는 것이다. 이 파일에서 심볼을 뽑아내면, System.map 파일이 되는 것이다. 이 파일은 커널을 컴파일할 때 생성되는 심볼 테이블 파일이고, 비슷한 것으로는 /proc/kallsyms가 있다. 전자는 파일 시스템..

1. pwntools process 포너블(바이너리)을 풀다 보면, 다음의 스켈레톤 코드를 자주 쓴다. from pwn import * p = process('./binary') p.interactive() 그런데, process의 인자 두 가지를 더 줄 수 있다! p = process('./binary', aslr=0, env={"LD_PRELOAD":"./libc.so"}) gdb로 프로그램을 실행시키면, 해당 프로세스에서만 ASLR이 작동하지 않는 것처럼 alsr=0 옵션을 주면, 해당 프로세스를 실행시킬 때, ASLR 작동을 못 하게 해서 디버깅을 더 쉽게 할 수 있다. 그런데 최근에 call-of-cake 문제를 풀면서, aslr=1과 aslr=0의 메모리 환경이 달라져서 이에 주의해야 한다. ..

3월 26일에 있었던 LINE CTF에 Security Factorial의 이름으로 참가하였고 18등을 하였다! 나는 call-of-fake 한 문제를 SDJ 형이랑 같이 풀었다. 문제 분석 이 문제는 C++로 짜였고, C++ 하면 객체지향이다. 그런데, 이 문제에서 쓰이는 클래스들을 모두 분석하기에는 그 양이 방대해서, 동적 분석을 진행하고 필요한 것만 가져다가 IDA에 반영하는 식으로 우회 조건을 파악하면서 문제를 해결하였다. 먼저, main 함수는 decompile 된 코드를 보면, 좀 어지러울 수 있지만, 코드 구성은 대충 다음과 같다. objectManager *om; guardManager *gm; int main() { char read_buf[64]; char buf[0x400]; setv..

전형적인 Use-After-Free(UAF) 문제이다. 그러나, UAF가 커널에서 발생한다. 문제 분석 #!/bin/bash qemu-system-x86_64 \ -initrd rootfs.cpio -kernel bzImage \ -append 'console=ttyS0 root=/dev/ram oops=panic panic=1' \ -enable-kvm -monitor /dev/null -m 64M \ --nographic -smp cores=1,threads=1 -cpu kvm64,+smep qemu 스크립트(boot.sh)를 통해 사용되는 보호 기법을 확인해 보자. KASLR(Kernel Address Space Layout Randomization)이 없다. 즉, 매 실행마다 고정된 주소를 가지고..

House of Lore malloc 함수의 smallbin에 해당하는 chunk의 재할당과 smallbin에 배치하는 과정을 이용한 공격 기법이다. [1] [2] [3] 제약 조건 1. Smallbin에 들어간 chunk의 bk를 조작할 수 있음 2. 다음과 같은 구성을 만들어야 함(= Heap leak이 선행됨) 소스 코드와 함께 파악하는 원리 glibc 2.23 / malloc.c [4] if ((victim = last (bin)) != bin) { if (victim == 0) /* initialization check */ malloc_consolidate (av); else { bck = victim->bk; if (__glibc_unlikely (bck->fd != victim)) { er..

V4bel님의 인프런 강의로 커널 해킹을 공부하고, 이 지식을 동아리에 퍼뜨리고 싶어서 커널 문제를 냈다. 문제 환경은 https://github.com/brwook/binary에서 다운로드할 수 있다. 문제 분석 Docker 환경을 구성한 뒤에, 해당 주소의 1800 포트로 접속하면, 위와 같은 출력이 나온다. 이는 xinetd를 통해서, 자동으로 실행되는 프로그램을 분석하면 되는데, 그것이 files/test.sh 파일이다. #!/bin/bash ... ROOTFS_NAME="$(mktemp -u XXXXXXXXXX)" /chall/download.py $ROOTFS_NAME if [ $? -ne 0 ] ; then exit; fi ... mktemp -u로 무작위 문자열을 받고, 이를 인자로 /ch..

데니스 유리체프가 저술한 "모두를 위한 리버싱 지침서 2/e"에 적힌 내용이다. 알아둬야 할 상식 같아서 포스팅하려고 한다. 1. 기본 4가지(cdecl, stdcall, fastcall, thiscall) cdecl은 스택을 통해 인자를 전달하되, 호출자가 스택을 정리하는 방식을 의미한다. 반대로, stdcall은 피호출자가 스택을 초기 상태로 복구하는 방식이다. 두 방식의 차이는 다음 예시에서 더 정확히 볼 수 있다. push arg3 push arg2 push arg1 call function add esp, 12 △ cdecl 방식 push arg3 push arg2 push arg1 call function functions: ... do something ... ret 12 △ stdcall ..

보호 기법이 약하게 걸려 있다. PIE가 안 걸려 있고, canary도 없다. partial RELRO 상태이기 때문에, GOT overwrite도 할 수는 있다. 위 바이너리는 https://github.com/brwook/binary에서 다운로드할 수 있다. 문제 분석 Dreamhack의 시스템 해킹 강의 중에서 Type Error 강의를 듣다가 만들어진 문제이다. malloc에는 size+1을 인자로 할당하고, read는 size만큼 입력을 할 수 있는 코드였는데, size의 자료형이 int였으면 아주 쉽게 -1을 입력하면, 버퍼 오버플로우가 발생할 것을 예측할 수 있었을 것이다. 그러나, size가 unsigned int였기 때문에, -1을 입력할 수 있을 거란 생각이 전혀 들지 않았다. 그리고,..

Security Factorial 동아리에서 진행한 내부 CTF 2022.2.5 00:00 ~ 2022.2.7 00:00 ( 48h ) 가능한 모든 문제를 도전하다 보니까, 문제를 되는대로 푼 것이 꽤 많은 것 같다. 출제자 입장에서는, "어? 이 XX, 이거 왜 이렇게 풀었지?" 하는 게 있을 수 있는데, intended write up을 짧게라도 작성해서 올려주면 큰 도움이 될 것 같다..~ Pwn - Happy new year! 0x20 크기의 버퍼에 0x200을 총 3번 쓸 수 있는 문제이다. 또한, gift라는 좋은 함수도 존재했기 때문에, 왜 이런 문제를 내나 싶었는데... 보호 기법을 확인해보니, Canary에 PIE까지 걸려 있었다. 즉, 첫 번째의 read 함수에서 canary를 leak..