下面的代码示例中的两个奇怪的外观没有意义。
foo
和argv[0]
之间的距离总是不同?我想知道奇怪的外表的详细原因。
我知道它与ASLR
无关[root@localhost ~]# cat /etc/fedora-release
Fedora release 14 (Laughlin)
[root@localhost ~]# cat poc.c
#include <stdio.h>
int main(int argc, char *argv[]){
int foo;
printf("%d\n", (int)argv[0] - (int)&foo);
}
[root@localhost ~]# ./poc
5345
[root@localhost ~]# ./poc
8465
[root@localhost ~]# ./poc
4641
[root@localhost ~]# ./poc
1201
[root@localhost ~]# ./poc
2881
[root@localhost ~]# ./poc
7073
[root@localhost ~]# ./poc
5905
[root@localhost ~]# ./poc
2225
[root@localhost ~]# ./poc
2465
[root@localhost ~]# ./poc
6017
[root@localhost ~]# ./poc
8657
[root@localhost ~]# ./poc
8401
[root@localhost ~]# ./poc
5073
[root@localhost ~]# ./poc
5505
[root@localhost ~]# ./poc
1761
[root@localhost ~]# ./poc
8609
[root@localhost ~]# ./poc
3665
[root@localhost ~]# ./poc
3633
[root@localhost ~]# ./poc
6257
[root@localhost ~]# ./poc
3441
[root@localhost ~]# ./poc
4961
[root@localhost ~]# ./poc
5233
[root@localhost ~]# ./poc
561
[root@localhost ~]# ./poc
3441
[root@localhost ~]# ./poc
2097
[root@localhost ~]# ./poc
1729
[root@localhost ~]# ./poc
1841
[root@localhost ~]# ./poc
2241
[root@localhost ~]# ./poc
2145
[root@localhost ~]# ./poc
6593
[root@localhost ~]# ./poc
5681
[root@localhost ~]# ./poc
737
[root@localhost ~]# ./poc
8353
[root@localhost ~]# ./poc
1937
[root@localhost ~]# ./poc
3937
[root@localhost ~]# ./poc
4769
[root@localhost ~]# ./poc
3441
[root@localhost ~]# ./poc
6097
[root@localhost ~]# ./poc
6673
[root@localhost ~]# ./poc
1857
[root@localhost ~]# ./poc
5617
[root@localhost ~]# ./poc
5473
[root@localhost ~]# ./poc
7313
[root@localhost ~]# ./poc
3921
[root@localhost ~]# ./poc
2369
[root@localhost ~]# ./poc
4609
[root@localhost ~]# ./poc
5569
[root@localhost ~]# ./poc
6209
[root@localhost ~]# ./poc
3457
[root@localhost ~]# ./poc
3665
[root@localhost ~]# ./poc
3297
[root@localhost ~]# ./poc
4465
[root@localhost ~]# ./poc
5281
[root@localhost ~]# ./poc
6017
[root@localhost ~]# ./poc
2705
[root@localhost ~]# ./poc
1601
[root@localhost ~]# ./poc
7457
[root@localhost ~]# ./poc
4145
[root@localhost ~]# ./poc
2353
[root@localhost ~]# ./poc
5537
[root@localhost ~]# ./poc
7873
[root@localhost ~]# ./poc
6449
[root@localhost ~]# ./poc
3297
答案 0 :(得分:0)
<强> 1。为什么foo和argv [0]之间的距离总是不同?
因为ASLR。
我知道这与ASLR无关
你确定吗?你的内核的虚拟地址空间随机化参数值(randomize_va_space)是什么?它应该是0。
<强> 2。为什么不与4对齐?虽然预期结果是4的倍数,但不是
你想用什么证明?您的代码计算从 argv 中的第一个字符串到本地变量 foo 的距离。这是什么意思?
&amp;处理参数和局部变量的实际上是OS和编译器相关的。请查看以下帖子:Where are C/C++ main functions parameters