緩衝器溢位指南

2021-04-13 01:37:15 字數 2900 閱讀 9275

:       push   %ebp

0x8048441 :     mov    %esp,%ebp

0x8048443 :     mov    0xc(%ebp),%eax

0x8048446 :     add    $0x4,%eax

0x8048449 :     mov    (%eax),%edx

0x804844b :    push   %edx

0x804844c :    call   0x8048410

0x8048451 :    add    $0x4,%esp

0x8048454 :    mov    %ebp,%esp

0x8048456 :    pop    %ebp

0x8048457 :    ret

(這裡的一些nops。它們代表no operation...meaning nothing執行。)

匯程式設計序段結束。

一些總結

-----------------

正如我們所看到的,exploit在0x804845c給呼叫,而它自己的位址就在0x8048410。

回到gdb

-----------------

(gdb)分解exploit

匯程式設計序段的結尾。

(gdb)

0x8048410

:    push   %ebp

0x8048411 :  mov    %esp,%ebp

0x8048413 :  sub    $0x14,%esp

0x8048416 :  mov    0x8(%ebp),%eax

0x8048419 :  push   %eax

0x804841a : lea    0xffffffec(%ebp),%eax

0x804841d : push   %eax

0x804841e : call   0x8048340

0x8048423 : add    $0x8,%esp

0x8048426 : lea    0xffffffec(%ebp),%eax

0x8048429 : push   %eax

0x804842a : push   $0x80484bc

0x804842f : call   0x8048330

0x8048434 : add    $0x8,%esp

0x8048437 : mov    %ebp,%esp

0x8048439 : pop    %ebp

0x804843a : ret

(gdb) x/3bc 0x80484bc

0x80484bc <_io_stdin_used+4>:   37 '%'  115 's' 10 '/n'

(gdb)

(gdb) quit

$回到提示

另外乙個步驟的總結

------------------------

首先你大概會對x/3bc命令產生疑問。其實這個命令是讓我們監視記憶體的。

x/3bc

^^^|||--- 字元

|| --- 二進位制

|----- 定義3作為範圍

(要得到更多的資訊,在gdb的提示下輸入"help x/")

我做這一步的目的是因為我不清楚放了什麼進0x80484cc的棧,然而你會看到我們想要顯示出來的字串。

我們的目的

----------------------

我們的目的是試著將exploit再一次返回exploit,代替返回主程式。所以我們該怎麼做,又怎麼知    道我們是否有能力做到?首先,我們大概可以做一些事情去開發**,而這些**是用來分離當我們在使用大量字串時遇到的錯誤,很大的可能性不能做到。給自己加油!(建議嘗試20次)要做到這一點,我們要修改ret(返回位址),當你在gdb看到這樣一行時你就會想到:

0x804844c :  call  0x8048410

現在的問題是在這重要的一行中得到的兩個位址,到底要用哪乙個?其實很簡單,你要用的是0x804844c,因為它是我們剛才所提到的其中乙個呼叫,如果你用0x8048410的話,當我們指向以下行時根本不能得到任何東西:

0x8048410

:    push   %ebp

----------**從這開始---------------

/*為棧開發的exploit*/

#include

main()

------- **結束 --------

通過以上所做的,我們將給返回函式的0x0804844c重寫返回位址去再一次呼叫exploit。這樣的話,我們就進入乙個死迴圈。那為什麼還要用這個程式?因為這裡不會檢查我們所送去的字串的長度。這裡給你乙個建議,如果你要安全地得到一些東西的話,你就要總是使用檢查長度的函式,

如fgets(), strncpy() instead of gets(), strcpy()等等。

gdb的使用技巧

--------------------

想要看一下乙個exploit給vunerable程式帶來的影響,進入gdb並打入:

(gdb) exec exploit

(gdb) symbol-file vunerable_program

然而你就能看到exploit到底做了什麼,並且可以自己為其修改。

推薦閱讀

----------------------

- omega project by lamagra

- advanced buffer overflow exploit by taeho oh

- **ashing the stack for fun and profit by aleph one

這三篇文章帶給你所需大量的知識。它們都可以在可以在packetstorm找到。 

原文作者 : ghost_rider

ByteBuffer 緩衝器(一)

public static void main final string args bytebuffer bytebuffer bytebuffer.allocate 10 system.out.println 初始位置 bytebuffer.position system.out.println ...

鎖存器 緩衝器

鎖存器 latch 是一種對 脈衝電平敏感的 儲存單元 電路,它們可以在特定輸入脈衝電平作用下改變狀態。鎖存,就是把 訊號暫存以維持某種電平狀態。鎖存器的最主要作用是 快取,其次完成高速的控制器與慢速的外設的 不同步問題 再其次是 解決驅動的問題 最後是解決乙個 i o 口既能輸出也能輸入的問題。鎖...

通用高速緩衝器 CMSPAD Cache

php中的高速緩衝器,對高負載來的 來說是乙個非常需要的元件。其中最經典的使用案例就是使用者會話 session 的高速訪問 如果使用預設的基於檔案的會話控制代碼,負載量較大時會產生大量的io操作,導致系統執行效率降低 而使用基於資料庫的會話控制代碼,雖然效能會得以提高,但負載量大時,還是容易給資料...