Fuzzing
PDF Reader 퍼징 도전기(3) - Harness 작성
Rasser
2021. 12. 2. 17:31

한글로 작성되어 있는 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
