gpt4 book ai didi

c - 无法使用 GDB 找到堆栈粉碎功能

转载 作者:太空狗 更新时间:2023-10-29 14:55:38 25 4
gpt4 key购买 nike

我有以下 C 应用程序:

#include <stdio.h>

void smash()
{
int i;
char buffer[16];
for(i = 0; i < 17; i++) // <-- exceeds the limit of the buffer
{
buffer[i] = i;
}
}

int main()
{
printf("Starting\n");
smash();
return 0;
}

我使用以下版本的 gcc 进行交叉编译:

armv5l-linux-gnueabi-gcc -v
Using built-in specs.
Target: armv5l-linux-gnueabi
Configured with: /home/tarjeif/svn/builder/build_armv5l-linux-gnueabi/gcc-4.4.1/gcc-4.4.1/configure --target=armv5l-linux-gnueabi --host=i486-linux-gnu --build=i486-linux-gnu --prefix=/home/tarjeif/svn/builder/build_armv5l-linux-gnueabi/toolchain --with-sysroot=/home/tarjeif/svn/builder/build_armv5l-linux-gnueabi/toolchain --with-headers=/home/tarjeif/svn/builder/build_armv5l-linux-gnueabi/toolchain/include --enable-languages=c,c++ --with-gmp=/home/tarjeif/svn/builder/build_armv5l-linux-gnueabi/gmp-5.0.0/gmp-host-install --with-mpfr=/home/tarjeif/svn/builder/build_armv5l-linux-gnueabi/mpfr-2.4.2/mpfr-host-install --disable-nls --disable-libgcj --disable-libmudflap --disable-libssp --disable-libgomp --enable-checking=release --with-system-zlib --with-arch=armv5t --with-gnu-as --with-gnu-ld --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --disable-nls --without-fp --enable-threads
Thread model: posix
gcc version 4.4.1 (GCC)

这样调用:

armv5l-linux-gnueabi-gcc -ggdb3 -fstack-protector-all -O0 test.c

在目标上运行时,它输出:

Starting
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)

我在 gdb 中加载生成的核心转储,产生以下回溯:

GNU gdb (GDB) 7.0.1
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i486-linux-gnu --target=armv5l-linux-gnueabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/andersn/workspace/stacktest/a.out...done.
Reading symbols from /home/andersn/workspace/stacktest/linux/toolchain/lib/libc.so.6...done.
Loaded symbols for /home/andersn/workspace/stacktest/linux/toolchain/lib/libc.so.6
Reading symbols from /home/andersn/workspace/stacktest/linux/toolchain/lib/ld-linux.so.3...done.
Loaded symbols for /home/andersn/workspace/stacktest/linux/toolchain/lib/ld-linux.so.3
Reading symbols from /home/andersn/workspace/stacktest/linux/toolchain /lib/libgcc_s.so.1...done.
Loaded symbols for /home/andersn/workspace/stacktest/linux/toolchain/lib/libgcc_s.so.1
Core was generated by `./a.out'.
Program terminated with signal 6, Aborted.
#0 0x40052d4c in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:67
67 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
in ../nptl/sysdeps/unix/sysv/linux/raise.c
(gdb) bt
#0 0x40052d4c in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:67
#1 0x40054244 in *__GI_abort () at abort.c:92
#2 0x40054244 in *__GI_abort () at abort.c:92
#3 0x40054244 in *__GI_abort () at abort.c:92
#4 0x40054244 in *__GI_abort () at abort.c:92
#5 0x40054244 in *__GI_abort () at abort.c:92
#6 0x40054244 in *__GI_abort () at abort.c:92
... and so on ...

现在,问题:我完全无法从 GDB 中找到导致堆栈崩溃的函数,即使 smash() 函数不会覆盖堆栈的任何结构数据,只会覆盖堆栈保护器本身。我该怎么办?

最佳答案

问题是编译您的目标 libc.so.6 的 GCC 版本有问题并且没有为 __GI_raise 发出正确的展开描述符。如果展开描述符不正确,GDB 在展开堆栈时会进入循环。

您可以检查展开描述符

readelf -wf /home/andersn/workspace/stacktest/linux/toolchain/lib/libc.so.6

我希望您在 GDB 中从任何调用中止的程序中得到完全相同的结果,例如

#include <stdlib.h>
void foo() { abort(); }
int main() { foo(); return 0; }

不幸的是,除了尝试构建更新版本的 GCC,然后用它重建整个“世界”之外,您无能为力。

关于c - 无法使用 GDB 找到堆栈粉碎功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4024898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com