首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么函数集"program_invocation_name“?什么时候?

什么函数集"program_invocation_name“?什么时候?
EN

Stack Overflow用户
提问于 2018-09-11 11:59:18
回答 1查看 593关注 0票数 0

以下是我获得的关于program_invocation_name的一些信息:

  • 此值包含用于调用调用程序的名称。
  • 此值将自动初始化。
  • 此值是全局变量。 (所以乍一看,我以为是在<.bss><.data>__。 但在stack记忆区。这很奇怪.)

下面是program_invocation_name的调试器视图:

代码语言:javascript
复制
pwndbg> x/s program_invocation_name
0xbffff302: "/tmp/my_program"

问题)

我跟踪了从程序开始到结束的执行流程,但是在设置program_invocation_name的那一刻我就找不到program_invocation_name了。

问题)

Q1.谁(什么函数)设置这个值?(loader设置这个值..?)

Q2.程序知道如何识别它为global variable,尽管这个值位于stack中。

Q3.有时,一些二进制程序运行时没有此值。在这种情况下,这是loader的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-12 00:35:00

是谁(什么函数)设置了这个值?(加载程序设置此值.?)

您可以通过在上面设置一个监视点来回答这个问题:

代码语言:javascript
复制
(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部分中的一个全局变量:

代码语言:javascript
复制
(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将继续指向程序名称曾经存在但不再存在的堆栈位置。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52275427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档