您的位置:首页 > 其它

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

2015-04-27 20:20 281 查看
逆向过程:

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



上面看那个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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  栈溢出