0day_0x01_jmp_esp

操作系统 Windows xp sp2
编译器 Visual C++6.0
编译选项 默认
build 版本 debug
调试工具 Ollydbg

再上一次代码注入的基础上,我们会发现,有时候栈中的位置会发生变化,不同的电脑会有所不同,我们如果想让我们的攻击变得更加通用的话,就要换一种方式来进行shellcode,我们已经知道,无论栈的地址怎样变化,有一点是不变的,就是esp总是再返回地址之后,二,返回地址也是不变的,如果我们再溢出的时候直接将shellcode放在esp的位置上,并且再返回地址上填写jmp esp或者call esp的指令的地址,那么就可以在任意电脑上执行我们的攻击脚本了,说干就干:

首先我们需要找到jmp esp的地址,我们可以通过一段代码来找到,也可以使用Ollydbg中的插件工具来找到。

#include <windows.h>
#include <stdio.h>
//#include "stdafx.h"
#define DLL_NAME "user32.dll"
main ()
{
	BYTE *ptr;
	int position,address;
	HINSTANCE handle;//句柄类型
	BOOL done_flag = FALSE;
	handle = LoadLibrary(DLL_NAME);//反汇user32.dll 库模块的句柄
	if(!handle)
	{
		printf("load dll err!\n");
		exit(0);
	}
	ptr = (BYTE*)handle;
	for(position = 0;!done_flag;position++)//0xffe4是jmp esp的机器码,根据机器码去查找地址
	{
		if(ptr[position] ==0xFF && ptr[position+1] == 0xE4)
		{				int address = (int)ptr +position;
			printf("OPCODE found at 0x%x\n",address);
		}
	}
}

这样我们就得到了许多地址,注意一定要用不会被当作阶段字符串的地址来使用

上次由于没有正常退出导致一个错误,这次我们去kernel32.dll库模块中调用Exitprocess函数来正常退出。

同样,使用depends

这样我们就知道ExitProcess函数的 地址为0x781caa2;

接下来构造shellcode

0x9052个字节 返回地址填写8c40d877

shellcode(包括调用Exitprocess)

看看执行结果:

 

可见点击确认后正常退出了;

 

posted @ 2024-03-07 15:10  robot__i  阅读(11)  评论(0)    收藏  举报