[问题] struct缓冲区溢位问题

楼主: owasp (丑小人爱捧人懒趴)   2020-02-22 11:47:34
开发平台(Platform):Win10
编译器:GCC
额外使用到的函数库(Library Used):无
问题(Question):在“密码”处的缓冲区溢位,为什么要输入ddaa,而不是aadd
喂入的资料(Input):使用者输入帐号密码。
预期的正确结果(Expected Output):无
错误结果(Wrong Output):无
程式码(Code):
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
#define ADMINUID 0x61616464
struct user {
char name[24] ;
char password[8];
unsigned int uid ;
};
struct user cur_user;
long long read_choice(){
char buf[24];
long long choice ;
__read_chk(0,buf,23,24);
choice = atoll(buf);
return choice;
}
void read_input(char *buf,unsigned int size){
int ret ;
ret = __read_chk(0,buf,size,size);
if(ret <= 0){
puts("read error");
_exit(1);
}
if(buf[ret-1] == '\n')
buf[ret-1] = '\x00';
}
void login(){
char name_[24];
char pass_[12];
unsigned int uid_ ;
bool found ;
puts("欢迎使用【上下班打卡系统】\n请输入您的帐号:");
read_input(cur_user.name,23);
//假设这里有“读取档案系统中的帐号、密码、使用者ID对照表”的程式码...
if(!strcmp(cur_user.name, name_)){
found = true ;
printf("请输入您的密码:");
read_input(cur_user.password,8);
if(!strncmp(cur_user.password,pass_,8)){
cur_user.uid = uid_ ;
}else{
puts("认证失败!");
exit(-2);
}
}
if(!found){
cur_user.uid = rand();
printf("\n您是新使用者,对吧?\n 新朋友,欢迎您 :)\n\n我将帮您建立新帐号
,\n请输入您的密码:\n");
gets(cur_user.password);
}
}
//显示功能选单
void menu(){
puts("\n\n【上下班打卡系统】");
puts(" 1. 打上班卡");
puts(" 2. 打下班卡");
puts(" 3. 登出 ");
puts("===============");
if(cur_user.uid == ADMINUID)
puts("
作者: Lipraxde (Lipraxde)   2020-02-22 14:07:00
未看先猜 endian
作者: Schottky (顺风相送)   2020-02-22 14:26:00
你在讲啥......
作者: b0920075 (Void)   2020-02-22 18:05:00
little endian 吧
作者: jaid (jaid)   2020-02-24 08:32:00
直接猜Little Endian

Links booklink

Contact Us: admin [ a t ] ucptt.com