手写一个栈溢出程序(入门版)

逆向过程:
中文搜索,直接来到验证密码处,通过跳转可以判断比较上面函数的返回值来进行判断是否注册成功
关键代码处

上面看那个call,跟入:

看到给一个变量赋值为一,这个call的返回值同样是local1地址的内容,下面并没有对local1地址的写入操作,可知函数返回值永远为1.strcpy函数复制一个字符串到数组,可以在堆栈的内容看到
栈的状态

第一个变量,第二个数组,因为第二个数组定义的不够大,在第二个数组存满后,覆盖到第一个变量的值,根据命令lea ecx。。。可以看到数组的长度为32个字节,可以在key中任意输入32个字符,用最后的结束符/0覆盖掉第一个变量,程序注册成功
结果

附件:http://pan.baidu.com/s/1gdxnw1X
程序代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define s "this is not key!"
#pragma pack(1)
//int cmp(char *key);

int cmp(char *key)
{
    int g=1;
    int ssss=2;
    char buff[28];
    printf("%d\n",sizeof(buff));
    strcpy(buff,key);
    return g;
}
int main()
{
    int a,k;
    FILE *fp;
    char key[1024]={0};

    if((fp=fopen("key.txt","rb"))==NULL)
    {
        printf("cannot open file\n");
        return 0;
    }
    key[0]=fgetc(fp);
    for(int i=0;i<1024;i++)
    {
        if(key[i]==EOF)
            break;
        //putchar(key[i]);
        key[i+1]=fgetc(fp);
    }
    k=strlen(key);
    key[k-1]=0;
    //printf("%d",strlen(key));
    a=cmp(key);
    if(a)
    {
        printf("×¢²áʧ°ÜÁË\n");
    }
    else 
        printf("×¢²á³É¹¦ÁË\n");
    return 0;

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值