我目前正在学习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!");
}
}
其思想是,我的成功消息将永远不会运行,除非我利用gets
输入超过10个字符的something
,导致溢出,覆盖成功消息所在的函数返回地址。
我知道我应该用gdb查看汇编代码,并寻找地址,但我不知道如何做到这一点。
有人能给我一个例子吗?谢谢!
1条答案
按热度按时间qgelzfjb1#
试试这个,希望它能帮你弄清楚这一点。祝你好运!
考虑将
gets
移到thisEvaluatesToFalse
中,以覆盖main
推送的返回地址,以便从thisEvaluatesToFalse
返回的内容将返回到成功的puts
。就像这样:
下面是使用w/ gdb的一些要点。
让您自己决定如何为
gets
输入值,以便执行将C
和D
替换为所需值的操作。如果你可以选择一种不同的方法,那么不要使用
gets
来处理溢出,而是尝试使用memcpy
并复制超过10个字节。同样的影响,堆栈也会被修改。