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
-ogotover
25 [bobo]$./
gotover
26 hi,iam
here
!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
程式中的區域性陣列溢位使用,就能改變棧,結果不可預料。列印出荒唐的資訊。
摘自:
直接修改棧的例項
1 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 ogoto...
直接使用HADOOP RPC的編碼例項
1 建立介面,該介面類在服務端和客戶端都必須有。publicinte ceserverifextendsversionedprotocol 2 在服務端實現介面類 publicclassserverimplimplementsserverif 3 服務端,使用實現的類啟動服務,需要定義監聽的 ip位...
堆和棧的區別(直接轉)
一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...