iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 8
0
Security

資安隨意分享的30天系列 第 8

Day8 - Integer Overflow/Underflow

前言

一樣是科普文,應該不會很有技術在 XD

講講常見的 integer overflow

正文

先講個最基本的 c 語言,底下是常見的一個資料型態的範圍

Data Type Size Unsigned Range Signed Range
int 4 0 ~ 4294967296 -2147483648 ~ 2147483647
char 1 0 ~ 255 -128 ~ 127

integer overflow 指:

  • 如果 int 變數存 2147483647 ,則加一會變成 -2147483648

integer underflow 指:

  • 如果 int 變數存 -2147483648,則減一會變成 2147483647

這概念應該很好懂,而這問題其實一般比較難達到任意程式碼執行,

一般比較常見是可以繞過一些程式開發者寫的檢測,然後在觸發 stack/heap overflow

之後再做後續的攻擊利用

這邊舉個例子,簡單的 c code 如下:

void validate_passwd(char* passwd) {
	char buf[11];
	unsigned char passwd_len = strlen(passwd);  
	if(passwd_len >= 4 && passwd_len <= 8) { 
		strcpy(buf,passwd); 
	} else {
		printf("Invalid Password\n"); 
		exit(1);
}

我們可以輸入任意長度的 passwd ,然後程式會進去 validate_passwd() 中檢查

看看大小是否範圍在 4 ~ 8 之間,是的話就存到 buf[11] 上面

這乍看之下蠻合理的,可是因為 strlen() 是回傳 size_t(unsigned int)

然後這邊存到 unsigned char 變數中,而 unsigned char 存的範圍是 (0 - 255) ,

所以如果輸入密碼長度是 260 ,則會造成 integer overflow ,

這樣 passwd_len 實際存的長度是 4 ,所以就可以繞過長度限制

那這邊 buf[11] 塞了 260 長度的資料進去,就會造成 stack overflow

就可以有機會做後續的利用

結尾

是說好像之前區塊鏈那邊也發生不少 integer overflow 的事情,不過還沒時間研究 0.0


上一篇
Day7 - 無線電 1G - 4G 下的安全科普
下一篇
Day9 - Twenty Years of Attacks on the RSA Cryptosystem
系列文
資安隨意分享的30天30

尚未有邦友留言

立即登入留言