전체 글 172

쉘코딩 (shellcoding) - (3)

쉘코딩 하는 여러 방법 소개 시리즈 (3) 쉘코드 작성 후 바이너리로 만들고 실행할 때 /flag 읽는 쉘코드 // shellcode.S #include .intel_syntax noprefix .global _start .text _start: /* open(file='/flag', oflag=0, mode=0) */ /* push '/flag\x00' */ push 0x67 push 0x616c662f mov ebx, esp xor ecx, ecx xor edx, edx /* call open() */ push SYS_open /* 5 */ pop eax int 0x80 /* read(fd='eax', buf='esp', nbytes=32) */ mov ebx, eax mov ecx, esp push..

pwnable/Shellcoding 2022.06.08

쉘코딩 (shellcoding) - (2)

쉘코딩 하는 여러 방법 소개 시리즈 (2) 어셈 코딩하고 opcode만 뽑내는 법 아래 예시는 execve("/bin/sh", ["/bin/sh", 0], 0) 일단 쉘코딩 // gcc -m32 -c -o shellcode.o shellcode.S #include #define STRING "/bin/sh" #define STRLEN 7 #define ARGV0 (STRLEN+1) #define ENVP (ARGV0+4) .intel_syntax noprefix .text .globl main .type main, @function main: jmp calladdr popladdr: pop esi /* esi points to STRING */ mov [ARGV0+esi],esi /* set up arg..

pwnable/Shellcoding 2022.03.25

쉘코딩 (shellcoding) - (1)

쉘코딩 하는 여러 방법 소개 시리즈 (1) 어셈 코딩하고 해당 코드를 실행하는 방법 소개 아래 예시는 argv[1] 문자열을 뒤집는 쉘코드 # main.s # gcc -nostdlib main.s -m32 .intel_syntax noprefix .global _start .text _start: push ebp mov ebp, esp # if (argc < 2) exit; cmp DWORD PTR [ebp+4], 2 jl exit # length of argv[1] : esi mov esi, 0x0 # i = 0 loop: mov eax, DWORD PTR [ebp+0xc] add eax, esi add esi, 1 cmp BYTE PTR[eax], 0 jne loop sub esi, 1 # while..

pwnable/Shellcoding 2022.03.25

AFL++ LTO mode

AFL++에서 고오급 기능인 LTO 모드를 지원한다. 공식 문서에 따르면 LTO 모드를 사용하면 더 빠른 속도와 높은 커버리지를 가진다고 한다. LTO 모드를 사용하기 위해서는 llvm 11 버전 이상을 사용해야 한다. LTO 모드를 사용할 수 없으면 LLVM 모드를 사용하고, 이것도 불가능하면 GCC_PLUGIN 모드를 사용하고... 이런 식으로 점차 내려가게 된다. (https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/fuzzing_in_depth.md) stable 버전인 13버전을 설치하고 LTO 모드를 사용해보자. LLVM Install 다음 내용을 /etc/apt/sources.list.d에 적당히 추가해준다. 20.04(focal), 2..

pwnable/Fuzzing 2022.01.29

AFL++

https://twitter.com/aflplusplus/status/1486278871318159364 AFL++ 4.00c 버전이 나왔다. 기존 AFL 2.52b, 2.57b 버전보다 훨훨훨씬 좋다. 무엇보다도 속도가 매우 빠르다. Install git clone https://github.com/AFLplusplus/AFLplusplus cd AFLplusplus make afl-gcc,afl-g++, afl-clang, afl-clang-fast, afl-clang-fast++ 등등.... 전부 afl-cc를 가리키고 있다. CC랑 CXX 설정시 전부 이걸로 하면 된다. Build CC=[AFLplusplus_DIR]/afl-cc CXX=[AFLplusplus_DIR]/afl-cc ./config..

pwnable 2022.01.27

AFL Parallel fuzzing

AFL은 단일 코어로 돌기 때문에, 멀티 코어로 퍼징하려면 각 코어마다 노드를 실행시켜야 한다. 한 개의 main 노드와 여러 개의 secondary 노드로 구성하면 된다. 각 노드는 주기적으로 싱크 디렉토리를 스캔하며, 재밌어 보이는 테스트 케이스를 자기 퍼저로 가져와 퍼징한다. 퍼포먼스 이유로 main 노드만이 큐를 싱크 시키며, secondary 노드들은 main 노드로 부터 싱크를 받아온다. 한번의 main 노드가 도는 동안 secondary 노드는 여려번의 cycle을 수행한다. * 큐에 있는 모든 input이 퍼징될 때까지 반복하는 것이 하나의 cycle이다. Main node -M 옵션으로 main 노드 실행 afl-fuzz -i input -o output -M Main_fuzzer -- ..

pwnable/Fuzzing 2022.01.24