[0Day]栈溢出原理—— 注入自己的代码

这个小部分实验还是花了一点时间的。开始想知道就可以了,先不玩了。后来还是静下心来,把这个玩出来了。跳出msgbox还是很兴奋的,尽管里面啥都木有。

上有漏洞的代码:

 /*
 note:
	//MessageBox(0,"test","helloworld!",MB_OK);
 */
#include <string.h>
#include <stdio.h>
#include <windows.h>
#define PASSWORD "123456"

int authen(char *password)
{
	int aut;
	char buffer[44];//add to be overflowed!!
	aut = strcmp(PASSWORD,password);
	strcpy(buffer, password);//overflow!
	return aut;
}

int main()
{
	LoadLibrary("user32.dll");//prepare for msg
	//MessageBox(0,"This is call overflow by desword!","attention!! I can redirect to any address!",MB_OK);
	char password[1024];
	FILE* fp;
	if(!(fp=fopen("password2.txt","rw+")))//get the pass by read file
		return 0;
	fscanf(fp, "%s", password);
	if( authen(password) )//modify the return address to call msgbox!
	{
		printf("no!  you should try again!\n");
	}
	else
	{
		printf("Yes! you did it! \n");
	}
	fclose(fp);
	getchar();
	getchar();
	return 0;
}

这次的文件中,直接先载入好了windows.h文件,还有user32的文件,方便后面直接调用msgbox的函数。

开始我这样想的,注入代码的话,要获得机器码。那怎么获得勒,可以直接抄书上的。但是我不想,我想,自己写一个msgbox的调用函数,OD直接看。

结果我得到这样的代码:

0040140B   .  C74424 0C 00000000   mov     dword ptr [esp+C], 0                    ; |
00401413   .  C74424 08 78A04100   mov     dword ptr [esp+8], 0041A078             ; |attention!! I can redirect to 

any address!
0040141B   .  C74424 04 A4A04100   mov     dword ptr [esp+4], 0041A0A4             ; |This is call overflow by 

desword!
00401423   .  C70424 00000000      mov     dword ptr [esp], 0                      ; |
0040142A   .  E8 DD170100          call    <jmp.&USER32.MessageBoxA>               ; \MessageBoxA

感觉怪怪的。都是mov,没有push的操作的。= =。 后面我发现了一个致命的问题。机器码中有00的,这个00会被strcpy认为是字符串的终止符,直接停止拷贝的。

就是这个问题,让我后面试了好几次的。不过还是直接改正过来了。想着, 可以自己写汇编代码然后看机器码,不过这里还是偷懒了。直接看书上的,自己改改了。

【这里我总想到,对于一个领域的研究,比如这个漏洞挖掘,或者机器学习算法。  起初应该找自己最能理解的一个角度去实验,这样才会激起兴趣,激起信心,才有可能继续学习下去。现在学习机器算法也是的。我认为,就是应该先抛开那个公式,找一个可以运行的代码,走一遍算法,分一遍类, 看看结果是什么, 再看代码细节,再是数学公式】

最终自己参照着写的代码是这样的。

33DB		xor ebx,ebx
53		push ebx  
8BC4		mov eax,esp
53		push ebx
50		push eax
50		push eax
53		push ebx
b81efdf274	mov eax, 74F2FD1E 
ffd0		call eax
至于megbox的库函数地址,74F2FD1E (直接写一个msg函数,看od汇编得到地址)。 

就是地址与操作系统什么的有关系的。后面会有更加通用的方法来操作的。


函数跳回的位置,应当是自己buffer的位置。


最终构造的漏洞利用文件时这样:


这样,就成功注入了自己的代码,跳出了啥都没有的msgbox了。


今天猛然发现每次重开系统,msgbox的载入位置还会不一样的。= =

7691FD1E USER32.>  8BFF            mov     edi, edi  

于是,将msg的位置改成了7691FD1E 。再次成功。发现依旧需要通用的方法的。


期待后面更加精彩的内容吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值