为什么我不能在 LibC 中的导出函数中设置断点(使用 gdb)?作为动态链接的 Libc,它必须包含它导出的函数的符号。我不应该能够为这些函数中的任何一个设置断点吗?
我只是试图做:
(gdb) b _IO_vfprintf@@GLIBC_2.2.5
Function "_IO_vfprintf@@GLIBC_2.2.5" not defined.
Run Code Online (Sandbox Code Playgroud)
但是查看 ELF 文件中的 dynamyc-symbols 表,该符号确实存在:
127: 0000000000049cf0 20904 FUNC GLOBAL DEFAULT 12 _IO_vfprintf@@GLIBC_2.2.5
Run Code Online (Sandbox Code Playgroud) 我试图在屏幕会话中运行idal64(IDA pro),但是我收到此错误:
TVision error: Can not load libcurses.so
Without libcurses can work only with xterm/linux
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
我安装了'libncurses5-dev','libncursesw5-dev','lib32ncurses5-dev'和'libx32ncurses5-dev',但没有改变.
这个库似乎已正确安装:
#find / -name libcurses.so
/usr/lib32/libcurses.so
/usr/lib/x86_64-linux-gnu/libcurses.so
/lib/libcurses.so
/lib64/libcurses.so
/lib32/libcurses.so
Run Code Online (Sandbox Code Playgroud)
我的机器信息:
Linux 3.13.0-49-generic #83-Ubuntu SMP Fri Apr 10 20:11:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
奇怪的是,IDA在屏幕外正常工作.任何的想法?
为什么不能重新编译GLibc关闭所有优化(即-O0)?
特别是这样做:
make CFLAGS='-O0 -w' CXXFLAGS='-O0 -w'
Run Code Online (Sandbox Code Playgroud)
我明白了:
#error "glibc cannot be compiled without optimization"
Run Code Online (Sandbox Code Playgroud) 如果gcc编译的程序正在调用dlopen,则必须在启用-ldl选项的情况下编译它.这意味着这样的程序依赖于库libdl.so上的运行时.事实上,通过对它执行ldd,我们看到了这一行:
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
Run Code Online (Sandbox Code Playgroud)
libc.so反过来使用dlopen(例如,处理libnss.so),但是没有出现在libldl.so上执行ldd:
/lib64/ld-linux-x86-64.so.2 (0x00007f5a488e4000)
linux-vdso.so.1 => (0x00007fff7bdfe000)
Run Code Online (Sandbox Code Playgroud)
为何如此区别?
看看这个主要:
int
main()
{
int asd = 10;
printf("%p\n", &asd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
特定时刻 asd 的地址:
0x7ffff5f7c16c
Run Code Online (Sandbox Code Playgroud)
主要地址(始终相同):
(gdb) disass main
Dump of assembler code for function main:
0x00000000004005b4 <+0>: push %rbp
Run Code Online (Sandbox Code Playgroud)
为什么常规 c 程序的变量地址在每次执行时都会改变,而程序本身的起始地址总是相同的(假设它不是位置无关的)?我看到地址可变是由于ASLR模式,但为什么它只影响程序变量,而不影响代码分配的位置?这是否与作为代码部分 ro 在不是绝对必要的情况下随机化它没有意义的事实有关?
另外,为什么main的起始地址和变量asd的地址之间存在巨大的差距?
我已经看到数组argv(在c/c ++程序中)包含已被引号括起来的字符串.
例如,考虑以下程序:
#include <iostream>
using namespace std;
int main (int argc, char* argv[]) {
cout << argv[1];
}
Run Code Online (Sandbox Code Playgroud)
当我执行它时:
./prog 'asd'
Run Code Online (Sandbox Code Playgroud)
我收到:
asd
Run Code Online (Sandbox Code Playgroud)
有没有办法知道某个参数是否被linux中的引号(单数或双引号)剥离,而没有转义它们(如此处建议如何防止在argv中丢失双引号?)?