一樣是科普文,應該不會很有技術在 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 指:
integer underflow 指:
這概念應該很好懂,而這問題其實一般比較難達到任意程式碼執行,
一般比較常見是可以繞過一些程式開發者寫的檢測,然後在觸發 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