以下是我获得的关于program_invocation_name的一些信息:
<.bss>或<.data>__。
但在stack记忆区。这很奇怪.)下面是program_invocation_name的调试器视图:
pwndbg> x/s program_invocation_name
0xbffff302: "/tmp/my_program"问题)
我跟踪了从程序开始到结束的执行流程,但是在设置program_invocation_name的那一刻我就找不到program_invocation_name了。
问题)
Q1.谁(什么函数)设置这个值?(loader设置这个值..?)
Q2.程序知道如何识别它为global variable,尽管这个值位于stack中。
Q3.有时,一些二进制程序运行时没有此值。在这种情况下,这是loader的问题。
发布于 2018-09-12 00:35:00
是谁(什么函数)设置了这个值?(加载程序设置此值.?)
您可以通过在上面设置一个监视点来回答这个问题:
(gdb) start
Temporary breakpoint 1, main () at t.c:5
5 return 0;
(gdb) info var program_invocation_name
All variables matching regular expression "program_invocation_name":
Non-debugging symbols:
0x00007ffff7dd43b8 program_invocation_name
0x00007ffff7dd43b8 program_invocation_name
(gdb) watch *(char **)0x00007ffff7dd43b8
Hardware watchpoint 2: *(char **)0x00007ffff7dd43b8
(gdb) run
Starting program: /tmp/a.out
Hardware watchpoint 2: *(char **)0x00007ffff7dd43b8
Old value = <unreadable>
New value = 0x7ffff7b9b7a5 ""
0x00007ffff7de4c02 in _dl_relocate_object () from /lib64/ld-linux-x86-64.so.2
(gdb) c
Continuing.
Hardware watchpoint 2: *(char **)0x00007ffff7dd43b8
Old value = 0x7ffff7b9b7a5 ""
New value = 0x7fffffffdfa7 "/tmp/a.out"
0x00007ffff7b22963 in __init_misc () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0 0x00007ffff7b22963 in __init_misc () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff7a5a134 in _init () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007ffff7de886a in call_init.part () from /lib64/ld-linux-x86-64.so.2
#3 0x00007ffff7de89bb in _dl_init () from /lib64/ld-linux-x86-64.so.2
#4 0x00007ffff7dd9c5a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#5 0x0000000000000001 in ?? ()
#6 0x00007fffffffdfa7 in ?? ()ZQ2。程序如何知道它是全局变量,尽管这个值位于堆栈中?
该变量是.data部分中的一个全局变量:
(gdb) info sym 0x00007ffff7dd43b8
program_invocation_name in section .data of /lib/x86_64-linux-gnu/libc.so.6它是一个指针,指向堆栈(它指向内核将argv[]传递给进程的堆栈区域)。
Q3。有时,一些二进制程序运行时没有此值。在这种情况下,是装载机的问题吗?
如果没有此变量,二进制程序将无法运行。但是变量可能指向空字符串(例如,如果父进程没有使用通常的调用约定,而是执行类似于execl("/tmp/a.out", (char*)NULL)的操作)。
此外,程序还可以“擦除”自己的堆栈(例如,由于堆栈溢出,或故意隐藏ps (许多rootkit都这样做)),然后program_invocation_name将继续指向程序名称曾经存在但不再存在的堆栈位置。
https://stackoverflow.com/questions/52275427
复制相似问题