日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux2.6 gcc,在Linux内核 2.6.38.7 上,gcc堆栈粉碎代码不工作 请帮助_gcc_开发99编程知识库...

發布時間:2025/3/15 linux 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux2.6 gcc,在Linux内核 2.6.38.7 上,gcc堆栈粉碎代码不工作 请帮助_gcc_开发99编程知识库... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

若要禁用堆棧smash檢測,請在編譯時使用 -fno-stack-protector 。 你可能還希望在通過"。Shellcoders手冊"處理時使用-ggdb和-mpreferred-stack-boundary=4來啟用GDB符號並規範堆棧。

編輯:當我編譯你提供的代碼時( gcc -fno-stack-protector -ggdb -mpreferred-stack-boundary=4 -o sc in.c ) 編譯器重新排列了 function 中局部變數的順序。 我通過使用GDB找到了這個:willi@ubuntu:~/testing$ gdb sc

(gdb) set disassembly-flavor intel

(gdb) disassemble function

Dump of assembler code for function function:

0x080483c4 : push ebp

0x080483c5 : mov ebp,esp

0x080483c7 : sub esp,0x20

0x080483ca : lea eax,[ebp-0xc]

0x080483cd : add eax,0x6

0x080483d0 : mov DWORD PTR [ebp-0x4],eax

0x080483d3 : mov eax,DWORD PTR [ebp-0x4]

0x080483d6 : mov eax,DWORD PTR [eax]

0x080483d8 : lea edx,[eax+0x8]

0x080483db : mov eax,DWORD PTR [ebp-0x4]

0x080483de : mov DWORD PTR [eax],edx

0x080483e0 : leave

0x080483e1 : ret

End of assembler dump.

0x080483ca告訴我 ebp - 0xC 是 buffer1,0 x080483d0告訴我 ebp - 0x4 是正確的。 因此,這些變數不存在於堆棧中,因為它們存在於我們的C 代碼中。 假設 ret 是我們最主要的局部變數,我們可以直接使用它。 讓我們使用你的代碼,儘管。

要修改返回指針,需要更改存儲在保存的ebp下面的地址,所以 ebp + 0x4 。 因此,要從變數buffer1返回返回指針,我們必須添加 0xC ( 到 ebp ),然後再添加 0 ( 返回指針在 ebp 下為 0 x4 ) 。 現在我們可以進行修改。

我接受你的C 代碼,你希望跳過 x = 1的分配並直接返回到 printf 。 刪除 main 以查找返回指針的適當修改:(gdb) disassemble main

Dump of assembler code for function main:

0x080483e2 : push ebp

0x080483e3 : mov ebp,esp

0x080483e5 : and esp,0xfffffff0

0x080483e8 : sub esp,0x20

0x080483eb : mov DWORD PTR [esp+0x1c],0x0

0x080483f3 : mov DWORD PTR [esp+0x8],0x3

0x080483fb : mov DWORD PTR [esp+0x4],0x2

0x08048403 : mov DWORD PTR [esp],0x1

0x0804840a : call 0x80483c4

0x0804840f : mov DWORD PTR [esp+0x1c],0x1

0x08048417 : mov eax,DWORD PTR [esp+0x1c]

0x0804841b : mov DWORD PTR [esp+0x4],eax

0x0804841f : mov DWORD PTR [esp],0x80484f0

0x08048426 : call 0x80482f4

0x0804842b : leave

0x0804842c : ret

End of assembler dump.

如果不修改返回指針,則在 0 x0804840a處調用 function 將返回 0 x0804840f 。 但是我們想跳過這個,回到下一個指令。 下一條指令從 0個x08048417開始,它是along位的。 所以我們對返回指針的修改必須增加 0個x8的值。

考慮到這些因素,我使用下面的代碼來列印" 0"而不是" 1":void function(int a, int b, int c) {

char buffer1[8];

char buffer2[10];

int* ret;

ret = buffer1 + 0x10;

*ret+=8;

}

void main() {

int x;

x = 0;

function(1,2,3);

x = 1;

printf("%dn",x);

}

總結

以上是生活随笔為你收集整理的linux2.6 gcc,在Linux内核 2.6.38.7 上,gcc堆栈粉碎代码不工作 请帮助_gcc_开发99编程知识库...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。