[英]buffer overflow exploit change function call
我正在嘗試執行緩沖區溢出,以將調用從功能A更改為功能B。這可行嗎? 我知道我將必須弄清楚必須輸入多少字節,直到可以控制返回指針,然后弄清楚函數B的地址。是否可以更改它,以便在“ x == 10”之后注入功能B的地址而不是功能A? 編輯:是否有可能在調用fillbuff之后,而不是返回到main,而是將其發送給函數B? 任何提示表示贊賞。
int fillBuff(int x){
char buff[15];
puts("Enter your name");
gets(buff);
return(x + 5);
}
void functionA(){
puts("I dont want to be here");
exit(0);
}
void functionB(){
printf("I made it!");
exit(0);
}
int main(){
int x;
x = fillbuff(5);
if (x == 10){
functionA();
}
}
這是一篇展示如何執行此操作的文章: http : //insecure.org/stf/smashstack.html 。
像這樣編譯程序: gcc -g -c program.c
(帶有-g
)並運行gdb ./a.out
。 之后,運行命令disas main
。 您應該看到代碼的反匯編及其在內存中的組織方式。 您可以將main
函數替換為任何其他函數,並查看其代碼。 有關反匯編的更多信息,請參見: https : //sourceware.org/gdb/onlinedocs/gdb/Machine-Code.html
運行GDB
並反匯編我計算機上的功能, functionA()
的地址為0x400679
,而functionB()
的地址為40068a
。 如果看到主功能的反匯編代碼,則有一個對地址0x400679
的調用,您想要將其更改為40068a
。 基本上,您必須使函數fillBuff
的緩沖區溢出,並且在到達指針的空間后,必須填充地址。 本文介紹了如何做到這一點。
緩沖區溢出是C語言中未定義的行為。保證緩沖區溢出時不會發生任何事情,據我所知,該語言不需要局部變量和/或存儲的返回地址的特定內存布局。 除此之外,某些編譯器會插入堆棧保護程序,以使緩沖區溢出攻擊更加困難。
如果要定義行為,則需要查看生成的程序集,並弄清楚緩沖區溢出將要做什么。 根據生成的程序集,您可以確定堆棧布局和地址布局,並嘗試使用其他函數的地址覆蓋返回地址。
如果使用的是GCC,則打印出程序集的命令行選項為-Wa,-al
。 如果需要Intel語法,請添加-masm=intel
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.