1. 윈도우 API 사용 IsDebuggerPresent() PEB에서 IsDebugged 검사 CheckRemoteDebuggerPresent() PEB에서 IsDebugged 검사 & 자기 자신 or 로컬 컴퓨터의 다른 프로세스만 검사 가능 NtQueryInformationProcess() OutputDebugString() SetLastError()로 에러 설정 OutputDebugString()함수를 이용해 디버깅 중이면 이 함수는 성공, 디버깅 중이 아니라면 에러 코드를 설정하므로, 디버깅 여부 판단 가능 2. ProcessHeap 플래그 검사 힙 헤더의 플래그를 살핌으로서 디버깅 여부 판단 3. NTGlobalFlag 검사 PEB의 0x68부분이 0x70인지 확인 4. 레지스트리 & FindW..
디스 어셈블리 기법에는 2가지가 있다. 1. 선형 디스어셈블리 예외 없이 코드 블록을 반복하면서 디스어셈블한다. 그래서 switch 포인터를 담고 있는 배열 등 등 데이터도 명령어로 해석해버린다. 2. 흐름 중심 디스어셈블리 jmp, call과 같은 논리적 흐름에 따라 디스어셈블한다. jz 이런 조건 분기의 경우 거짓 또는 참을 가정하여 디스어셈블한다. 이런 요소를 이용해 안티 디스어셈블리 기법을 개발할 수 있다. 안티 디스어셈블리 1. jz, jnz를 이용하여 동일한 위치로 점프하는 명령어를 구상 & 0xe9(jmp) or 0xe8(call) 들을 적적히 배치한다. 조건 분기에서 거짓을 가정하고 디스어셈블하게 되면 call 또는 jmp를 먼저 디스어셈블하게 된다. 2. 2개 이상의 명령어가 한 메모리 ..
#define FASTBIN_CONSOLIDATION_THRESHOLD (65536UL) if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) { if (have_fastchunks(av)) malloc_consolidate(av); 이 부분은 fastbin 크기 이상의 청크를 free && 인접한 청크를 병합 한 뒤 실행 된다. 그래서 top chunk와 인접한 fastbin 크기 이상의 청크를 free하면 실행이 되게 된다. malloc_consolidate가 실행되면 fastbin에 있는 청크를 unsorted bin으로 옮기게 된다. 하지만 이 과정에서 인접한 청크가 free되어있으면 병합하기 때문에 조심해야한다. 이것을 통해 fastbin..