# 环境(一般情况下不会变动)

Ubuntu22.10

glibc:2.36-0ubuntu4

# 1. 程序源代码

c
#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. 编译加调试

编译