设置什么功能 "program_invocation_name" ?什么时候?
what function set "program_invocation_name" ? and when?
这是我得到的关于 program_invocation_name
的一些信息:
- 此值包含用于调用调用程序的名称。
- 这个值是自动初始化的。
- 这个值是全局变量。
(所以第一眼我以为是在<.bss>
或者<.data>
.
但它在 stack
内存区域。太奇怪了...)
这是 program_invocation_name
的调试器视图:
pwndbg> x/s program_invocation_name
0xbffff302: "/tmp/my_program"
问题)
我从程序开始到结束都按照执行流程,但是我找不到那个那个program_invocation_name
已设置。
问题)
Q1。谁(什么功能)设置这个值? (loader
设置这个值..?)
Q2。程序如何知道将其识别为 global variable
,尽管此值位于 stack
?
Q3。有时,一些二进制文件在没有这个值的情况下运行。在这种情况下,是loader
的问题?
Who(what function) set this value? (loader sets this value..?)
你可以通过设置观察点来回答这个问题:
(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. How program knows recognize it as global variable, although this value is located in the stack?
变量是.data
部分的全局变量:
(gdb) info sym 0x00007ffff7dd43b8
program_invocation_name in section .data of /lib/x86_64-linux-gnu/libc.so.6
它是一个指针,指向堆栈(它指向内核将 argv[]
传递给进程的堆栈区域)。
Q3. Sometimes, some binary runs without this value. In this case, It is problem of loader?
二进制文件不能运行 没有这个变量。但是变量可能指向空字符串(例如,如果父进程没有使用通常的调用约定,而是做了类似 execl("/tmp/a.out", (char*)NULL)
的事情)。
此外,该程序可以 "wipe" 自己的堆栈(例如,由于堆栈溢出,或故意隐藏 ps
(许多 rootkit 都这样做)),然后 program_invocation_name
将继续指向程序名称曾经是但不再是的堆栈位置。
这是我得到的关于 program_invocation_name
的一些信息:
- 此值包含用于调用调用程序的名称。
- 这个值是自动初始化的。
- 这个值是全局变量。
(所以第一眼我以为是在<.bss>
或者<.data>
.
但它在stack
内存区域。太奇怪了...)
这是 program_invocation_name
的调试器视图:
pwndbg> x/s program_invocation_name
0xbffff302: "/tmp/my_program"
问题)
我从程序开始到结束都按照执行流程,但是我找不到那个那个program_invocation_name
已设置。
问题)
Q1。谁(什么功能)设置这个值? (loader
设置这个值..?)
Q2。程序如何知道将其识别为 global variable
,尽管此值位于 stack
?
Q3。有时,一些二进制文件在没有这个值的情况下运行。在这种情况下,是loader
的问题?
Who(what function) set this value? (loader sets this value..?)
你可以通过设置观察点来回答这个问题:
(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. How program knows recognize it as global variable, although this value is located in the stack?
变量是.data
部分的全局变量:
(gdb) info sym 0x00007ffff7dd43b8
program_invocation_name in section .data of /lib/x86_64-linux-gnu/libc.so.6
它是一个指针,指向堆栈(它指向内核将 argv[]
传递给进程的堆栈区域)。
Q3. Sometimes, some binary runs without this value. In this case, It is problem of loader?
二进制文件不能运行 没有这个变量。但是变量可能指向空字符串(例如,如果父进程没有使用通常的调用约定,而是做了类似 execl("/tmp/a.out", (char*)NULL)
的事情)。
此外,该程序可以 "wipe" 自己的堆栈(例如,由于堆栈溢出,或故意隐藏 ps
(许多 rootkit 都这样做)),然后 program_invocation_name
将继续指向程序名称曾经是但不再是的堆栈位置。