资源下载
【免费】突破密码认证程序(修改函数返回地址)资源-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.c
author : failwest
date : 2006.9.30
description : demo show to redirect program execute flow via over run return address
in stack. specify the exactly fake return address in password.txt file
to bypass the authentication
Noticed : should be complied with VC6.0 and build into debug version
version : 1.0
E-mail : failwest@gmail.com
Only 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来处理
这里直接输入地址不合适(转化可能会有问题),但是我们能直接修改文件的专挑地址
注意这里的地址
直接修改转跳就可以
反弹shell可以看看
vulnhub靶机Brainpan_vulnhub-brainpan-CSDN博客
异曲同工之妙