资源下载
【免费】突破密码认证程序(修改函数返回地址)资源-CSDN文库
资源内容
源码
/*****************************************************************************To be the apostrophe which changed "Impossible" into "I'm possible"!POC code of chapter 2.3 in book "Vulnerability Exploit and Analysis Technique"file name : stack_overflow_ret.cauthor : failwest date : 2006.9.30description : demo show to redirect program execute flow via over run return addressin stack. specify the exactly fake return address in password.txt fileto bypass the authentication Noticed : should be complied with VC6.0 and build into debug version version : 1.0E-mail : failwest@gmail.comOnly for educational purposes enjoy the fun from exploiting :)******************************************************************************/#include <stdio.h>#define PASSWORD "1234567"int verify_password (char *password){int authenticated;char buffer[8];authenticated=strcmp(password,PASSWORD);strcpy(buffer,password);//over flowed here! return authenticated;}main(){int valid_flag=0;char password[1024];FILE * fp;if(!(fp=fopen("password.txt","rw+"))){exit(0);}fscanf(fp,"%s",password);valid_flag = verify_password(password);if(valid_flag){printf("incorrect password!\n");}else{printf("Congratulation! You have passed the verification!\n");}fclose(fp);}
流程
这个方法会比昨天写的方法更具有通用性
书接上回,我是用的是多个a进行一处操作。
如果怎加更多的字符的话将buffer[8]的字符会将authenticated、前栈帧和返回地址覆盖
此时NULL结束符authenticated和EBP一共19字符(9-11是authenticated,13-16是EBP,17-19是返回地址)。
当我输入19个a的时候
局部变量名 | 内存地址 | 偏移3的值 | 偏移2的值 | 偏移1的值 | 偏移0的值 |
buffer[0-3] | 0x0019FB30 | 0x71(’q’) | 0x71(’q’) | 0x71(’q’) | 0x71(’q’) |
buffer[4-7] | 0x0019fb34 | NULL | 0x71(’q’) | 0x71(’q’) | 0x71(’q’) |
authenticated覆盖前 | 0x0019FF30 | 0x00 | 0x00 0x00 0x01 | ||
authenticated覆盖后 | 0x0019FF30 | 0x00 | 0x00 | 0x00 | 0x00 |
前栈帧EBP(覆盖前) | 0x0019FAD8 | 0x00 0x12 0xFF | |||
前栈帧EBP(覆盖后) | 0x0019FAD8 | 0x61 | 0x61 | 0x61 | 0x61 |
返回地址(覆盖前) | 0x0019FADC | 0x00 0x40 0x10 0xE | |||
返回地址(覆盖后) | 0x0019FADC | 0x00 | 0x61 | 0x61 | 0x61 |
返回地址是当前函数返回时重定向程序的代码。在函数返回的“retn”指令执行的时时候,栈顶元素正好是这个返回地址。“retn”指令会把这个弹入EIP寄存器,之后就会转跳执行。
这个地址本来是0x004010EB改成了0x00616161
那么我们可以把转跳转跳到登入成功的代码段,或者利用加入反弹shell来处理
这里直接输入地址不合适(转化可能会有问题)
具体的可以看看
vulnhub靶机Brainpan_vulnhub-brainpan-CSDN博客
异曲同工之妙