三种方法打印 main函数的返回地址的值(old EIP)(用途,你懂得!)

Posted wzzkaifa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三种方法打印 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;
}


还有以下的调试图。一目了然:


技术分享







以上是关于三种方法打印 main函数的返回地址的值(old EIP)(用途,你懂得!)的主要内容,如果未能解决你的问题,请参考以下文章

C语言中 main 是啥意思?

python函数的返回值?

c#的main怎么调用

Laravel 4 如何使用 input::old() 方法在下拉菜单中显示选定的值?

Dart基础7-异步

如何返回一个 char 数组并在 main 中打印它?