直接修改棧的例項

2021-05-21 23:27:26 字數 1821 閱讀 3627

[bobo]$

catgotover.c

2  #include

<

stdio.h

>

3  #include

<

string.h

>

4  5 

int

evil_code(char*s)

6  10 

11 

int

main(int

argc,

char

*argv)

12 

23 

24 

[bobo]$

gccgotover.c

-ogotover

25 

[bobo]$./

gotover

26 

hi,i

amhere

!27 

len=

[0]

看了這篇帖子,理解了上面這段程式,直接修改棧內容。

詳細內容可以參考 , 還有一篇alert7寫的動態庫符號解析過程

大概是這樣的:

對於32位的x86,呼叫動態庫中的函式,比如 printf(); 呼叫的其實是plt中的一小段**,這一小段**如:

address + 0: jmp *0*********

address + 6 : push 乙個常數

jmp 0xyyyyyyyy

第一次呼叫printf時位址0*********中的值就是address + 6, 也就是第一次jmp會跳到 address + 6的地方,然後下乙個jmp進行如號解析,然後在0*********中寫入真實的printf函式的位址,之後再呼叫printf時就會直接跳到printf函式去了。

我前面那個**就是在0*********中放入evil_code()函式的位址,address + 0: jmp *0********* 這條指令占用6個位元組,前面兩個是操作碼,後面就是位址,所以有**中"  + 2"

跑了帖子中更能清晰理解棧結構的例子,結果如下:

[s@fedora-1 test]$ cat test1.c

#include

int gi = 1;

f(char *fmt, int *p, int v)

printf("p = %p v = %d/n", p, v);

return;

for(i = 0; i < 256; i++)

} main()

[s@fedora-1 test]$ ./a.out

0 0xbf8daf24 (nil)

1 0xbf8daf28 0xbf8daf48

2 0xbf8daf2c 0x8048469

3 0xbf8daf30 0x804855d

4 0xbf8daf34 0x80496d4

5 0xbf8daf38 0x1

6 0xbf8daf3c 0x80484a9

7 0xbf8daf40 0xa7add0

p = 0x80496d4 v = 1

程式中的區域性陣列溢位使用,就能改變棧,結果不可預料。列印出荒唐的資訊。

摘自:http://bbs.chinaunix.net/viewthread.php?tid=1652842&extra=page%3d1%26amp;filter%3ddigest&page=6

直接修改棧的例項

1 bobo catgotover.c 2 include stdio.h 3 include string.h 4 5 int evil code char s 6 10 11int main int argc,char argv 12 23 24 bobo gccgotover.c ogotov...

直接使用HADOOP RPC的編碼例項

1 建立介面,該介面類在服務端和客戶端都必須有。publicinte ceserverifextendsversionedprotocol 2 在服務端實現介面類 publicclassserverimplimplementsserverif 3 服務端,使用實現的類啟動服務,需要定義監聽的 ip位...

堆和棧的區別(直接轉)

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...