作者owasp ()
看板C_and_CPP
標題[問題] struct緩衝區溢位問題
時間Sat Feb 22 11:47:34 2020
開發平台(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(" --> 1337. 【管理者功能】查看打卡記錄 ");
printf("請輸入您的選擇(數字):\n");
}
//主函數
void main(){
login();
while(1){
menu();
switch(read_choice()){
case 1:
puts("\n 歡迎來上班,請努力工作!");
break;
case 2:
puts("\n 下班了啊?掰掰!");
break;
case 3:
exit(-1);
break;
case 1337:
if(cur_user.uid != ADMINUID){
puts("\n 您沒有權限可以使用這一項只有管理者才能用的「查看打卡記錄」功
能喔,\n 我不會告訴你查看打卡記錄裡面有什麼貓膩的。");
break;
}
puts("\n 《歡迎進入後台管理介面》\n\n\n [請幻想一下這裡寫滿了全公司員
工的打卡記錄....]");
break;
default :
puts("\n 可以請您不要亂選嗎?");
break;
}
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.165.20 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1582343257.A.E8E.html
※ 編輯: owasp (223.136.165.20 臺灣), 02/22/2020 11:48:24
→ Lipraxde: 未看先猜 endian 02/22 14:07
→ Schottky: 你在講啥...... 02/22 14:26
推 b0920075: little endian 吧 02/22 18:05
→ jaid: 直接猜Little Endian 02/24 08:32