Heap Overflow Exploit 공격 기법중 하나인 VTable Overwrite 기법입니다.

BOF 공부를 시작하면서 가장 어렵게 생각했던 VTable Overwrite 분석입니다.

사용된 디버거: x64dbg(다운로드)



00403430은 VTable을 가르키는 포인터가 됩니다.


VTable을 확인해보면 Class에서 선언한 순서대로 함수를 가르키고 있습니다.

리틀엔디언 형태를 빅엔디언으로 바꾸어 읽어보면 00401150(setName), 004011A0(printName), 004011C0(getName)이 됩니다.


call bookmanager.401150

VTable에서 확인한 결과 401150은 setName() 함수임을 알 수 있습니다. setName() 함수로 진입합니다.


setName() 함수의 역할은 건너뛰고 setName() 함수안에서 printName()과 getName()을 호출하는 장면부터 분석해보도록 하겠습니다.


mov eax, dword ptr ss:[ebp-8]     (사진에서 첫줄이 잘렸습니다. 이 부분부터 분석이 진행됩니다.)

ebp-8은 stack 영역으로, mybook의 VTable을 eax로 복사합니다. (eax: 00403430)

mov edx, dword ptr ds:[eax]         

eax가 가르키는 값인 00402190을 edx로 복사합니다. (edx: 00402190)

mov ecx, dword ptr ss:[ebp-8]         

ebp-8은 stack 영역으로, mybook의 VTable을 ecx로 복사합니다. (ecx: 00403430)

mov eax, dword ptr ds:[edx+4]

edx+4(00402194)가 가르키는 값인 004011A0은 두번째 함수인 printName(), eax로 복사합니다.

call eax                 

call eax(004011A0)

mov ecx, dword ptr ss:[ebp-8]         

printName()을 호출하여 ecx가 변경되었으므로 다시 ecx에 mybook의 VTable을 복사합니다. (ecx: 004034300)

mov edx, dword ptr ds:[ecx]         

ecx가 가르키는 값인 00402190을 edx로 복사합니다. (edx: 00402190)

mov ecx, dword ptr ss:[ebp-8]

mov eax, dword ptr ds:[edx+8]

edx+8(00402198)이 가르키는 값인 004011C0은 세번째 함수인 getName(), eax로 복사합니다.

call eax                 

call eax(004011C0)


취약점이 존재하는 부분은 contents[1000] 입니다.

fgets를 통해 1500byte까지 내용을 가져오지만 buffer의 크기는 1000byte입니다.

contents의 내용을 1000byte를 초과하여 1004byte까지 작성한다면 mybook의 VTable을 변조시킬 수 있습니다.

contents의 내용을 VFUNC1 + VFUNC2 + NOP + SHELLCODE + DUMMY로 1000byte를 채운 후 나머지 4byte를 contents의 시작주소로 채워 Exploit을 작성합니다.

Exploit을 작성 후 변조된 &VTable과 VFUNC입니다.


프로그램 및 Exploit 출처 : https://cafe.naver.com/secuholic


'System Hacking' 카테고리의 다른 글

Function Pointer Overwrite 분석  (0) 2018.12.03

+ Recent posts