手写一个栈溢出程序(入门版)
2015-04-27 20:20
281 查看
逆向过程:
中文搜索,直接来到验证密码处,通过跳转可以判断比较上面函数的返回值来进行判断是否注册成功
上面看那个call,跟入:
看到给一个变量赋值为一,这个call的返回值同样是local1地址的内容,下面并没有对local1地址的写入操作,可知函数返回值永远为1.strcpy函数复制一个字符串到数组,可以在堆栈的内容看到
第一个变量,第二个数组,因为第二个数组定义的不够大,在第二个数组存满后,覆盖到第一个变量的值,根据命令lea ecx。。。可以看到数组的长度为32个字节,可以在key中任意输入32个字符,用最后的结束符/0覆盖掉第一个变量,程序注册成功
附件:http://pan.baidu.com/s/1gdxnw1X
程序代码
中文搜索,直接来到验证密码处,通过跳转可以判断比较上面函数的返回值来进行判断是否注册成功
上面看那个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; }
相关文章推荐
- 手写一个栈溢出程序(深入版)
- 一、SpringMVC基础入门,创建一个HelloWorld程序
- API入门系列之五 -一个正儿八经的SDK程序
- 《网络渗透技术》学习笔记(1)--Windows平台上一个最简单溢出程序的调试 zz
- 黑莓开发新手入门教学帖,如何制作一个能控制LED颜色的程序(二)
- MFC1-纯手写一个程序
- Revit二次开发入门--创建一个简单的程序
- opencv入门程序晒一个~~~
- iPhone开发入门4 - 创建一个UITable View程序,不使用Interface Builder
- 用MXnet入门实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别
- API入门系列之五 -一个正儿八经的SDK程序
- arm9板子上写了一个小程序:手写数字及英文大小写字符的识别
- SpringMVC基础入门,创建一个HelloWorld程序
- 微信小程序入门之构建一个简单TODOS应用
- SparkStreaming的一个入门例子程序
- 一个JNI的入门小程序
- 微信小程序入门之构建一个简单TODOS应用
- 写一个栈溢出的程序
- Arduino基础入门二:搭建一个完整的Arduino程序
- PERL语言入门:第四章:子程序(函数):习题1:写一个程序, 求所有参数的和