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을 작성합니다.
'System Hacking' 카테고리의 다른 글
Function Pointer Overwrite 분석 (0) | 2018.12.03 |
---|