我目前正在學習 C 并試圖了解更多關于堆疊中的記憶體是如何作業的,以及如何使用 gdb 來提供幫助。
下面是我的問題的代碼片段:
bool thisEvaluatesToFalse(char* something) {
return false;
}
void main() {
char something[10];
puts("My plan is to input a specific string over 10 characters than will achieve my goal:");
gets(something);
if (thisEvaluatesToFalse(something)) {
puts("If this runs, its a success!");
}
}
這個想法是,除非我利用輸入超過 10 個字符,否則我的成功訊息將永遠不會運行,從而導致溢位,將函式的回傳地址覆寫到成功訊息所在的位置。getssomething
我知道我應該用 gdb 查看匯編代碼并尋找地址,但我不完全確定如何執行此操作。
任何人都可以指導我或給我一個例子嗎?謝謝!
uj5u.com熱心網友回復:
試試這個,希望它可以幫助你解決這個問題。祝你好運!
考慮移動gets到thisEvaluatesToFalse覆寫推送的回傳地址,main因此回傳thisEvaluatesToFalse將回傳puts成功。
像這樣:
#include <stdio.h>
unsigned int thisEvaluatesToFalse() {
char something[10];
gets(something);
return 0xdeadbeef;
}
int main() {
puts("My plan is to input a specific string over 10 characters than will achieve my goal:");
if (thisEvaluatesToFalse()) {
puts("If this runs, its a success!");
}
return 0;
}
以下是使用 gdb 作業的亮點。
gcc main.c -fno-stack-protector -ggdb
gdb a.out
(gdb) disass main
0x0000000100003eeb < 27>: call 0x100003eb0 <thisEvaluatesToFalse>
0x0000000100003ef0 < 32>: cmp $0x0,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/532810.html
標籤:C部件数据库缓冲堆栈溢出
