首页 > 代码库 > 第一个Shellcode(Xp sp3)

第一个Shellcode(Xp sp3)

研究挖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系统上使用了。

研究中………………