簡體   English   中英

memcpy溢出邊界漏洞利用? (粉碎堆棧)

[英]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,則會溢出hwaddraddr字段。

是。

例如,如果該行以"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM