reader@hacking:~/booksrc $ cp a.out a
reader@hacking:~/booksrc $ ./a SLEDLESS
SLEDLESS is at 0xbfffff4e
reader@hacking:~/booksrc $ cp a.out bb
reader@hacking:~/booksrc $ ./bb SLEDLESS
SLEDLESS is at 0xbfffff4c
reader@hacking:~/booksrc $ cp a.out ccc
reader@hacking:~/booksrc $ ./ccc SLEDLESS
SLEDLESS is at 0xbfffff4a
reader@hacking:~/booksrc $ ./a.out SLEDLESS
SLEDLESS is at 0xbfffff46
reader@hacking:~/booksrc $ gdb -q
(gdb) p 0xbfffff4e - 0xbfffff46
$1 = 8
(gdb) quit
reader@hacking:~/booksrc $
他基本上是制作具有不同文件名长度的不同文件,以了解它将如何影响环境变量SLEDLESS的内存。
这是他的解释:
如前面的实验所示,执行名的长度程序会影响导出的环境变量的位置。总体趋势似乎是地址的减少两个字节pro的长度每增加一个字节,环境变量克名称。程序名称a.out也是这样,因为不同之处在于-名称a.out和a之间的长度为4个字节,并且区别地址0xbfffff4e和0xbfffff46之间的字节为8个字节。这一定意味着执行程序的名称也位于堆栈中的某个位置,这导致了转移。
总趋势不是每次减少2位吗?他在其他所有地方都说字节,应该将其更改为位吗?
总趋势不是每次都减少2位吗?
没有一方面,字符(即字节),整数,指针等没有以字节或内存字内的任意位偏移量存储。
此实验中地址是否更改1、2、4或8个字节取决于体系结构(例如,x86,x86_64,arm,ppc等)和所使用的语言。另外,我无法从您的问题中得知地址是否对应于SLEDLESS
CLI参数(即argv[1]
),或者程序是否正在报告getenv("SLEDLESS")
返回的地址(我假设这是一个C程序)。这也将影响地址的更改。