728x90
4개의 인자를 가지고, 특정 메모리 영역의 실행 권한을 변경해주는 함수이다.
BOOL WINAPI VirtualProtect (
_In_ LPVOID lpaddress, # 권한을 변경할 메모리 영역의 시작 주소
_In _SIZE_T dwSize, # 변경할 크기
_In_ flNewProtect, # 변경할 속성 값
_Out_ PDWORD lpflOldProtect, # 이전 값 저장 (쓰기 가능한 영역)
);
간단한 예제 코드
#include <Windows.h>
#include <stdio.h>
int main() {
DWORD old;
unsigned char code[] = { 1, 2, 3, 4 };
VirtualProtect(code, sizeof(code), PAGE_EXECUTE_READWRITE, &old);
printf("실행 완료!\n");
return 0;
}
PAGE_EXECUTE_READWRITE -> 읽기, 쓰기, 실행 모두 가능하게 하는 설정이다.
Windbg로 확인해보면 다음과 같다.
Mapping file section regions...
Mapping module regions...
Mapping PEB regions...
Mapping TEB and stack regions...
Mapping heap regions...
Mapping page heap regions...
Mapping other regions...
Mapping stack trace database regions...
Mapping activation context regions...
Usage: Stack
Base Address: 0092d000
End Address: 00930000
Region Size: 00003000 ( 12.000 kB)
State: 00001000 MEM_COMMIT
Protect: 00000004 PAGE_READWRITE
Type: 00020000 MEM_PRIVATE
Allocation Base: 00830000
Allocation Protect: 00000004 PAGE_READWRITE
More info: ~0k
READWRITE 권한만 있었다가 해당 함수가 실행이 된 후 다시 살펴보면
Mapping file section regions...
Mapping module regions...
Mapping PEB regions...
Mapping TEB and stack regions...
Mapping heap regions...
Mapping page heap regions...
Mapping other regions...
Mapping stack trace database regions...
Mapping activation context regions...
Usage: Stack
Base Address: 0092f000
End Address: 00930000
Region Size: 00001000 ( 4.000 kB)
State: 00001000 MEM_COMMIT
Protect: 00000040 PAGE_EXECUTE_READWRITE
Type: 00020000 MEM_PRIVATE
Allocation Base: 00830000
Allocation Protect: 00000004 PAGE_READWRITE
More info: ~0k
EXECUTE권한이 있다. 쉘코드 실행이 가능하다는 것..
아래처럼 인자값 하고 rop 체인 구성하면 되겠다.
728x90