三種方法打印 main函數的返回地址的值(old EIP)(用途,你懂得!)
阿新 • • 發佈:2017-05-21
popu tex 空間 ext 指向 多說 ret 運行 自己
這裏能夠簡單的改動隨意函數的返回地址。能夠做到自己定義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; }
還有以下的調試圖。一目了然:
三種方法打印 main函數的返回地址的值(old EIP)(用途,你懂得!)