Jiw*_*won 0 binary x86 assembly executable elf
这是我得到的一些信息program_invocation_name:
<.bss>or中<.data>。stack内存区域中。这很奇怪......)这是调试器视图program_invocation_name:
pwndbg> x/s program_invocation_name
0xbffff302: "/tmp/my_program"
Run Code Online (Sandbox Code Playgroud)
问题)
我从程序开始到结束都遵循执行流程,但我找不到设置的那一刻。program_invocation_name
问题)
Q1 . 谁(什么函数)设置了这个值?(loader设置这个值..?)
Q2。global variable尽管该值位于 ? 中,但程序如何知道将其识别为stack?
Q3 . 有时,某些二进制文件运行时没有此值。在这种情况下,问题是loader?
谁(什么函数)设置了这个值?(加载器设置这个值..?)
您可以通过在其上设置观察点来回答这个问题:
(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 ?? ()
Run Code Online (Sandbox Code Playgroud)
ZQ2. 尽管该值位于堆栈中,程序如何知道将其识别为全局变量?
该变量是该节中的全局变量.data:
(gdb) info sym 0x00007ffff7dd43b8
program_invocation_name in section .data of /lib/x86_64-linux-gnu/libc.so.6
Run Code Online (Sandbox Code Playgroud)
它是一个指针,指向堆栈(它指向内核传递argv[]给进程的堆栈区域)。
Q3。有时,某些二进制文件运行时没有此值。这种情况下,是loader的问题吗?
如果没有此变量,二进制文件将无法运行。但该变量可能指向空字符串(例如,如果父进程没有使用通常的调用约定,而是执行了类似的操作execl("/tmp/a.out", (char*)NULL))。
此外,程序可以“擦除”自己的堆栈(例如,由于堆栈溢出,或故意隐藏ps(许多rootkit都这样做)),然后program_invocation_name将继续指向程序名称曾经所在的堆栈位置,但不会更长的是。