# 环境(一般情况下不会变动)
Ubuntu22.10
glibc:2.36-0ubuntu4
# 1. 程序源代码
#include<stdio.h> | |
#include<string.h> | |
void validate_passwd(char *passwd) | |
{ | |
char passwd_buf[11]; | |
unsigned char passwd_len =strlen(passwd); | |
if(passwd_len>=4&&passwd_len<=8) | |
{ | |
printf("goot!\n"); | |
strcpy(passwd_buf,passwd); | |
}else{ | |
printf("bad!\n"); | |
} | |
} | |
int main(int argc,char *argv[]){ | |
validate_passwd(argv[1]); | |
} |
# 2. 分析
strlen
返回值为 size_t
类型(无符号整数),而却保存到 unsigned char
类型中,这样会导致截断
当我们输入字符长度为 0000 0001 0000 0101
(261) 时,转为 unsigned char
类型会变成 0000 0101
(5),也就意味着通过这种方式能绕过后续的判断
然后,我们输入的字符串长度比较长可以导致栈溢出
# 3. 编译加调试
编译