- 论坛徽章:
- 0
|
本帖最后由 shuimuyq 于 2016-01-21 11:43 编辑
我的代码是:
/* env.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *env = getenv(argv[1]);
printf("%p\n", env);
return 0;
}
我的操作过程如下:先分别执行两个程序,再gdb调试
直接执行:
shell# export EGG="XXXXX"
shell# gcc env.c -o a -g
shell# gcc env.c -o bbbbbbbbb -g (9个b)
shell# ./a EGG
0x7fffffffe54c
shell# ./bbbbbbbbb EGG
0x7fffffffe53c
gdb调试:
shell# gdb a
(gdb) b main
Breakpoint 1 at 0x40058c: file env.c, line 6.
(gdb) run EGG
Starting program: /root/Desktop/a EGG
Breakpoint 1, main (argc=2, argv=0x7fffffffdf98 ) at env.c:6
6 char *env = getenv(argv[1]);
(gdb) n
8 printf("%p\n", env);
(gdb) p env
$1 = 0x7fffffffe522 "xsadf"
shell# gdb bbbbbbbbb
(gdb) b main
Breakpoint 1 at 0x40058c: file env.c, line 6.
(gdb) run EGG
Starting program: /root/Desktop/bbbbbbbbb EGG
Breakpoint 1, main (argc=2, argv=0x7fffffffdf88 ) at env.c:6
6 char *env = getenv(argv[1]);
(gdb) n
8 printf("%p\n", env);
(gdb) p env
$1 = 0x7fffffffe51a "xsadf"
我的问题是:
按照堆栈理论(32位)
--------------------- 0xBFFFFFFF
|\000 \000 \000 \000| 0xBFFFFFFB (4 NULL byte)
|\000 ...... | 0xBFFFFFFA (program_name)
| ..................|
|...................| n. environment variable (env[n])
|...................| n-1. environment variable (env[n-1])
|...................| ...
|...................| 1. environment variable (env[0])
|...................| ...
|...................| n. argument string (argv[n])
|...................| n-1. argument string (argv[n-1])
|...................| ...
| . |
| . |
| . |
环境变量EGG, 无论是在执行时还是调试时EGG环境变量的地址 bbbbbbbbb 比 a应该只偏移8个字节
最后的结果却是,执行时偏移16个字节 即( strlen("bbbbbbbbb" ) - strlen("a" ) ) * 2
shell# ./a EGG
0x7fffffffe54c
shell# ./bbbbbbbbb EGG
0x7fffffffe53c
调试时是偏移8字节符合预期,而且通过x/10000c $rsp, 也可以发现在环境变量之前与程序名有关的只出现一次
(gdb) p env
$1 = 0x7fffffffe522 "xsadf" (a EGG)
(gdb) p env
$1 = 0x7fffffffe51a "xsadf" (bbbbbbbbb EGG)
为什么会这样呢? |
|