小编bad*_*ack的帖子

使用 gdb 在 LibC 中设置断点

为什么我不能在 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)

linker gdb libc debug-symbols

6
推荐指数
1
解决办法
2338
查看次数

IDA在屏幕内不起作用

我试图在屏幕会话中运行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在屏幕外正常工作.任何的想法?

linux ida

5
推荐指数
1
解决办法
499
查看次数

需要GLibc优化

为什么不能重新编译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 glibc libc

4
推荐指数
2
解决办法
609
查看次数

dlopen在libc和libdl中

如果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)

为何如此区别?

linux linker dynamic libc

4
推荐指数
1
解决办法
9285
查看次数

ASLR 和地址

看看这个主要:

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的地址之间存在巨大的差距?

linux debugging assembly gcc memory-address

3
推荐指数
1
解决办法
362
查看次数

c/c ++中的引号和argv

我已经看到数组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中丢失双引号?)?

c++ linux

2
推荐指数
1
解决办法
962
查看次数

标签 统计

linux ×4

libc ×3

gcc ×2

linker ×2

assembly ×1

c++ ×1

debug-symbols ×1

debugging ×1

dynamic ×1

gdb ×1

glibc ×1

ida ×1

memory-address ×1