어셈블리어를 보고 c코드를 유추해서 만들어내는 것이다. 어셈블리는 위와 같다. 우선 canary 보호기법와 pie 보호기법을 해제해 줘야 한다. 핸드레이 결과는 아래와 같다. #include #include int get_int(){ char a[4]; scanf("%3s", a); return atoi(a); } int loop = 1; int main(){ char buf1[0x13] = "Simple handray ex!"; char *buf2 = "Hello, World"; int num; while(loop){ num = get_int(); switch(num) { case 1: puts(buf1); break; case 2: puts(buf2); break; case 3: loop = 0; d..
스택 프레임이란 함수 호출시 생성되는 지역 변수, 매개 변수, 복귀 주소 등의 정보를 저장하는 스택의 구조이다. ESP와 EBP를 이용하여 관리한다. 함수가 호출되면 call [함수] 가 실행되면 우선 PUSH EIP 를 한다. 이는 복귀하였을때 기존 실행될 명령어를 저장해 두는 것이다. 이 부분을 ret이라 한다. 프롤로그 PUSH EBP MOV EBP, ESP SUB ESP, x (이건 없을수도 있음) PUSH EBP : 함수가 종료되고 다시 이전 스택 프레임으로 복귀할 주소를 스택에 저장한다. 이 부분은 SFP라고 한다. MOV EBP, ESP : EBP에 ESP값을 넣어서 EBP를 현재 스택프레임의 EBP로 바꾼다. SUB ESP, x : ESP에서 x를 뺀다. 즉 스택 프레임의 데이터 저장 공간..
함수호출규약이란? 함수 호출 및 반환을 일관되고 효율적으로 처리하기 위해 정의한 규칙으로 인수를 전달하고 반환 값을 받는 방식, 레지스터 사용 규칙, 스택의 구성 등을 명시한다. 함수호출규약이 없다면? 프로세스가 종료되면 ESP는 함수 호출 전으로 돌아가고 스택 안에 남은 매개변수들은 지워지지 않고 이후 사용할 때 덮어씌워진다. 그러면 이후 계속 함수를 호출하면 결국 ESP가 스택의 끝에 위치하게 되고 그러면 더 이상 스택을 사용할 수 없으므로 ESP를 정리해야 한다. 환경 이름 매개변수 레지스터 스택정리 32bit cdecl 스택사용 Caller stdcall 스택사용 Callee fastcall ecx, edx Callee 64bit System V AMD64 ABI RDI, RSI, RDX, RCX..
메모리 공간은 일반적으로 Code, Data, Stack, Heap 등의 4가지의 세그먼트로 분류된다. 세그먼트 방식은 메모리의 물리적인 주소를 논리적인 주소를 사용하여 분할한다. 그래서 세그먼트의 크기가 서로 다를 수 있다.특징장점크기가 다를 수 있기 때문에 메모리를 미리 분할 하지 않음 메모리가 나누어지기 때문에 메모리 보호에 좋음, 즉 메모리가 나누어지기 때문에 다른 세그먼트에 접근이 제한됨.단점주소 매핑과 메모리 관리가 복잡함, 필요한 만큼 공간이 쓰이니 내부 단편화는 발생하지 않지만 쓰고 버리고를 하다보면 서로다른 빈 공간이 생길 수 있어서 외부 단편화는 발생이 가능하다.Code/text절대 변경되지 않는 것들이 저장실행 가능한 명령어가 포함된 오브젝트 파일 또는 메모리 공간을 할당받은 프로그램..
$ sudo apt update $ sudo apt install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools 우선 패키지들을 설치한다. 여기서 중요한것은 llvm 설치이다. 여기서 llvm은 주로 다양한 컴파일러 기능을 위해 사용한다. $ sudo apt install -y lld-11 llvm-11 llvm-11-dev clang-11 그 밖의 필요한 것들을 설치해준다. $ sudo apt install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\\..*//')-plugin-dev libstdc++-$(gc..
AFL란? American Fuzzy Lop의 약자로, mutational 방식의 coverage guided fuzzer이다. 브르투포스로 입력을 받고 coverage를 넓혀가며 프로그램 제어 흐름에 대한 변경사항을 기록하고,이를 로깅하여 유니크한 crash를 발경해 낼 수 있다. AFL의 특징 coverage 기반 fuzzer이기 때문에 매우 효율적인 fuzzing이 가능하다. code coverage 측을 위한 코드를 컴파일 타임에 삽입한다. QEMU를 이용해서 컴파일 타임이 아닌, 런타임시에 코드삽입도 가능하다. 여기서 말하는 코드는 코드가 어디가 실행됬고, 어디가 실행 안됬는지를 측정해주는 코드를 뜻한다. Coverage Guided Feedback : AFL의 커버리지 피드백 기법은 하이브리드..
PreProcess 초기 준비 단계이다. 아래와 같은 작업을 한다. 1. PUT에 대한 instrumentation 적용 2. 쓸모없는 configureation 제거 3. seed trimming 4. dirver app 생성 PUT 코드 사이사이에 instrumentation 코드를 삽입해 새로 컴파일한다. code coverage를 높이기 위한 작업으로 instrumentation이라고 한다. gray-box와 white-box는 PUT에 instrumentation을 적용해 execution feedback을 수집하고 그에 맞춰 더 정교한 퍼징을 수행한다. Program instrumentation을 static과 dynamic으로 나뉜다. Static 방식은 PUT 실행전 Preprocess 단..
Fuzzing이란? fuzzing이란 fuzz input을 사용해 PUT(Program Under Test)를 실행하는 것이고, fuzz input 이란 PUT가 예상하지 못할 input을 뜻한다. PUT이 잘못 처리하는 input 혹은 개발 의도와는 다른 행동을 보이는 input을 넣어 PUT을 실행하는 것이라고 볼 수 있다. 즉 fuzzing이란, 자동화 테스트로 기형/반기형적 데이터를 주입하여 소프트웨어 버그를 찾는 블랙박스 테스팅 기술이다. PUT은 테스트 실행중인 프로그램이라고 해석하자 Fuzzing을 왜 쓰나? 결론적으로는 fuzzing을 통해 버그를 자동으로 찾을 수 있다는 것이다. 일반적인 정적분석으로도 버그를 찾을 수 있지만 많은 시간과 노력이 들며 자신의 실력에 따라 버그를 찾을 수도,..