PDF Reader 퍼징 도전기(3) - Harness 작성

728x90

한글로 작성되어 있는 pdf파일을 hwp로 변환했을때, pdf2hwpA에서 멈춘다. 즉 변환할때 pdf2hwpA라는 함수를 사용하고, 이 함수를 잘 이용해서 harness를 작성해보면 될거같다.

 

Ghidra로 본 Decompile된 함수의 모습이다.

void __cdecl pdf2hwpA(char *param_1,char *param_2,int param_3,int *param_4)

  iVar3 = FUN_1006f7a0(param_1,&stack0xfffffdf0,param_3,param_4);
  if (iVar3 == 0) {
    cVar1 = FUN_1000b410((LPCSTR)(&uStack270 + 1));
    if (cVar1 != '\0') {
      FID_conflict:_wprintf("%s","success converted!");
      FUN_100a1cbe(local_8 ^ (uint)&stack0xfffffffc,extraout_EDX,uVar5);
      return;
    }
    pcVar4 = "hwp converting error!";
  }
  else {
    pcVar4 = "pdf parsing error!";
  }
  FID_conflict:_wprintf("%s",pcVar4);
  FUN_100a1cbe(local_8 ^ (uint)&stack0xfffffffc,extraout_EDX_00,uVar5);
  return;
}

위 코드에서 변환을 하였을때 완료되었다고 뜨는 아래 부분을 퍼징 대상 함수로 이용할 수 있을거 같다.

FUN_1000b410((LPCSTR)(&uStack270 + 1));

  if (iVar3 == 0) {
    cVar1 = FUN_1000b410((LPCSTR)(&uStack270 + 1));
    if (cVar1 != '\0') {
      FID_conflict:_wprintf("%s","success converted!");
      FUN_100a1cbe(local_8 ^ (uint)&stack0xfffffffc,extraout_EDX,uVar5);
      return;
    }

대상 함수 Offset = 0xb410

 

그래서 코드를 작성해보았다.

#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <libloaderapi.h>
#pragma warning(disable: 4996)
typedef int (*TARGET)(wchar_t* filename);
TARGET funcPtr;
// LPCSTR = long pointer constant string = const char *

extern "C" __declspec(dllexport) __declspec(noinline) int fuzzme(wchar_t* path) {
	int result = funcPtr(path);
	return result;
}

wchar_t* charToWChar(const char* text)
{
	size_t size = strlen(text) + 1;
	wchar_t* wa = (wchar_t*)malloc(sizeof(wchar_t) * size);
	mbstowcs(wa, text, size);
	return wa;
}
int main(int argc, char* argv[]) {
	HMODULE DLLHandle = LoadLibrary(L"C:\\Program Files (x86)\\Unidocs\\ezPDFEditor\\ezPDF2HWP.dll"); // dll base address?
	
	if (DLLHandle == NULL) {
		printf("Cannot load ezPDF2HWP.dll\n");
		return -1;
	}
	int func = (int)DLLHandle + 0xb410;//0x1000B640;
	funcPtr = (TARGET)func;

	
	int reusult = fuzzme(charToWChar(argv[1]));
	return 0;
}

작성 후, DYNAMORIO를 이용하여 컴파일을 시도해 보았다.

해당 에러를 뱉는다...ㅠㅠ

 

아마 64비트로 AFL을 설치했었는데 그 문제인거 같아 32비트로 다시 해봐야겠다..

+ 32비트로도 AFL을 설치하고 돌려봤는데 동일한 에러가 뜬다...

C:\Users\kwakjunbeom\Desktop\fuzzing\DynamoRIO\bin32>drrun.exe -c C:\\Users\\kwakjunbeom\\Desktop\\fuzzing\\winafl-master\\build32\\bin\Release\\winafl.dll -debug -target_module "C:\\Program Files (x86)\\Unidocs\\ezPDFEditor\\ezPDFEditor.exe" -coverage_module "C:\\Program Files (x86)\\Unidocs\\ezPDFEditor\\ezPDF2HWP.dll" -target_method fuzzme -fuzz_iterations 10 -nargs 1 -- "C:\\Users\\kwakjunbeom\\source\\repos\\pdfreader_fuzzing\\Debug\\pdfreader_fuzzing.exe" "C:\\Users\\kwakjunbeom\\source\\repos\\pdfreader_fuzzing\\pdfreader_fuzzing\\test.pdf"

아래는 오류 log

728x90