본문 바로가기
System/Windows

pydbg로 Fuzzer 만들기

by bbolmin 2014. 4. 27.



퍼저 동작원리









50byte의 buffer에 인자값으로 받은 파일의 첫 번째 바이트만큼 문자열을 읽어오는 취약한 프로그램이다.

아래 프로그램으로 간단하게 퍼징 테스트 수행 ~


test.exe




#include "stdio.h"
#include "stdlib.h"

void vuln(char *path)
{
	FILE *fd;
	int size=0;
	char buf[50];

	fd = fopen(path, "rb");
	fscanf(fd, "%c", &size);
	fgets(buf, size, fd);

	printf("size : %d \n", size);
	printf("data : %s \n", buf);
}

int main(int argc, char **argv)
{
	if(argc != 2){
		printf("%s (test file) \n", argv[0]);
		exit(0);
	}

	vuln(argv[1]);

	getchar();
}








[ 테스트 결과 ]



custom_fuzzer.py


- sample 디렉토리에 있는 파일 중 하나씩 랜덤하게 선택해서 퍼징 수행.

- 랜덤 데이터를 입력할 부분에 삽입 <- "(custom_data|[]|[]|y)"

- 첫 번째 리스트에는 생성할 문자열의 범위

ex) [0,1,[10,30]]  <- (\x00,\x01, \x0a~\x1e)중에서 생성

- 두번째 리스트에는 갯수

ex) [1,1000] <- 1에서 1000개의 데이터 생성

- 세번째 y/n는 생성할 데이터를 개별적으로 랜덤하게 할것인지(y) 아니면 한개의 문자로 할 것인지(n)



1) crash_log파일에 crash된 EIP 정보들 저장


[ 0 ] 0xEIP: 63636363 Unable to disassemble at 63636363

[ 2 ] 0xEIP: 63636363 Unable to disassemble at 63636363

[ 3 ] 0xEIP: 62626262 Unable to disassemble at 62626262

[ 4 ] 0xEIP: 61616161 Unable to disassemble at 61616161

[ 4 ] 0xEIP: 63636363 Unable to disassemble at 63636363

[ 6 ] 0xEIP: 61616161 Unable to disassemble at 61616161





2) FuzzFile 디렉토리에 퍼징을 수행한 샘플 파일들 저장




3) CrashFile 디렉토리에 crash관련 정보들 저장


- "crash-0.txt"을 열어본 결과


========================== Crash Info ==========================

0x63636363 Unable to disassemble at 63636363 from thread 720 caused access violation

when attempting to read from 0x63636363


CONTEXT DUMP

  EIP: 63636363 Unable to disassemble at 63636363

  EAX: 00000058 (        88) -> N/A

  EBX: 7ffdf000 (2147348480) -> N/A

  ECX: a01f226a (2686394986) -> N/A

  EDX: 10362ed0 ( 271986384) -> | |C:\Documents and Settings\Administrator\ \fuzzing\test.exe (MSVCR100D.dll.data)

  EDI: 017bed24 (  24898852) -> N/A

  ESI: 009e0000 (  10354688) -> N/A

  EBP: 63636363 (1667457891) -> N/A

  ESP: 0012ff18 (   1244952) -> ccccccccccc (stack)

  +00: 63636363 (1667457891) -> N/A

  +04: 63636363 (1667457891) -> N/A

  +08: 00636363 (   6513507) -> N/A

  +0c: 7ffdf000 (2147348480) -> N/A

  +10: 00151ee0 (   1384160) -> ./test.exe ./FuzzFile/fuzz-0.txt (heap)

  +14: 00000021 (        33) -> N/A


disasm around:

0x63636363 Unable to disassemble


SEH unwind:

0012ffe0 -> 0041104b: jmp 0x411f40

ffffffff -> 7c839ac0: push ebp




======================== mutation Info ==========================

[*] block_size : 1

[*] mutate chars : ['a', 'b', 'c']


[+] offset : 0x0

[+] original bytes : 10

[+] changed bytes : 50


=================================================================







'System > Windows' 카테고리의 다른 글

[CVE-2012-4792]  (0) 2014.08.15
Windows에서의 스택 할당  (0) 2013.12.28
FileFuzz, Peach Fuzzer 링크  (0) 2013.11.12
메모리 보호 기법 DEP/NX  (1) 2012.09.05
windows bof [basic stack overflow]  (2) 2012.04.08