1. 程式人生 > >三種方法列印 main函式的返回地址的值(old EIP)(用途,你懂得!)

三種方法列印 main函式的返回地址的值(old EIP)(用途,你懂得!)

這裡可以簡單的修改任意函式的返回地址,可以做到自定義EIP的指向,即可執行當前程序空間的任意指令,這裡只是讓大家更清楚棧幀結構,沒有涉及跨程序的inline HOOK 等,後面會陸續講下讀取任意程序記憶體,修改任意程序函式執行流程等方法。

        廢話不多說了,直接上菜:     

#include <stdio.h>
#include <windows.h>

/* 

列印 main函式的返回地址的值(用途,你懂得!) 

所需知識:函式棧幀結構

  C呼叫約定,自右向左壓棧

  push argv
  push argc
  call main ; jmp main


main:
  push ebp
  mov ebp, esp
  sub esp, 0x4 ; 0x4 == sum (sizeof(type) * count)


棧中:
  argv
  argc ; new ebp + 8
  eip  ; main ret 地址 == new ebp + 4
  ebp  ; old ebp value, new ebp postation
  i    ; i 區域性變數 == new ebp - 4


 */
int main(int argc, char* argv[])
{
	int i = 0; // ebp - 4

	__asm {

		mov eax, [ebp + 4]
		mov i, eax

	}

	printf("%08x\n",i);

	printf("%p\n", *(DWORD*)(((DWORD)&argc) - 4));

	printf("%p\n", *(DWORD*)(((DWORD)&i) + 8));
	
	return 0;
}

還有下面的除錯圖,一目瞭然: