[英]memcpy overflow boundary exploit? (smashing the stack)
我想弄清楚這是否會以某種方式溢出:
void print_address(char *p)
{
arp_ hw;
int i;
hw.length = (size) *(p + _OFFSET1); //189 + 4 = 193
memcpy(hw.addr, packet + _OFFSET2, hw.length);
return;
}
packet是從.txt文件讀取的輸入?
是的,它可能溢出; 如果數據包中偏移量4處的值大於128,則會溢出hwaddr
的addr
字段。
是。
例如,如果該行以"nnnn\\xff"
開頭,則會粉碎堆棧。
絕對。 你甚至不會檢查輸入緩沖區是否足夠大。
跳出來的主要是這個:
#define _LENGTH 128
...
typedef struct{
char addr[_LENGTH];
...
然后是:
hwaddr.len = (shsize_t) *(packet + _OFFSET1); //189 + 4 = 193
memcpy(hwaddr.addr, packet + _OFFSET2, hwaddr.len);
這似乎很危險。 您只為addr分配了128個字節,並且未檢查以驗證復制的信息長度是否為<= _LENGTH。
當您知道進入的數據長度(如果可能)時,您可能想要動態分配它,或者檢查以確保您沒有將額外數據復制到addr char數組中:
if (hwaddr.len <= _LENGTH) {
memcpy(...);
}
讓我們看看......你把一個數據包作為一個字符數組,其中第四個字符是數據包的大小。 字符是8位,因此當用作無符號數字時,覆蓋值0-255。 您的緩沖區長度設置為128.這將溢出,您需要對_LENGTH進行某種檢查。
hwaddr.len
是一個unsigned char,其范圍為0到255.因此攻擊者可以向您發送一個聲明長度為255的數據包。由於hwaddr.addr
被聲明為128字節緩沖區,因此攻擊者可以提供127字節的有效負載。 夠了嗎?
通常的x86調用約定是推送返回地址,推送參數,然后跳轉,此時被調用者將按聲明的順序分配每個變量。 因此,從hwaddr
開始計數, hwaddr.len
將在堆棧指針上方128字節, packet
將在129字節以上,返回地址將為129 + sizeof(char *)
,即使在最多137字節一個64位系統。 所以,是的,攻擊者可以覆蓋你的返回地址並另外提供118字節的shell代碼。
編輯我剛剛弄清楚了OP的困惑。 當你編碼長度為unsigned char
,這並不意味着你使用ASCII來表示長度。 也就是說,你沒有讀取這個字節,在它上面調用atoi()
,並獲得一個從0到9的單位數字。你只需使用8位,就像一個非常窄的int
類型,其中每個位代表一個二進制數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.