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编程知识库...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 毕业(250)
- 下一篇: 项目管理实战之团队管理 (转)