0

下面的代码示例中的两个奇怪的外观没有意义。

  1. foo为什么和之间的距离argv[0]总是不同?
  2. 为什么不对齐到4?虽然预期结果是 4 的倍数,但并不

我想知道看起来奇怪的详细原因。

我知道这与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
4

1 回答 1

0

1、为什么foo和argv[0]的距离总是不一样?

因为 ASLR。

我知道这与 ASLR 无关

您确定吗?您的内核的虚拟地址空间随机化参数值 (randomize_va_space) 是多少?它应该是 0。

2.为什么不对齐到4?虽然预期结果是 4 的倍数,但并不

你想用它来证明什么?您的代码计算从argv中的第一个字符串到局部变量foo的距离。这有什么意义?

处理参数和局部变量的方式和位置实际上取决于操作系统和编译器。看看下面的帖子:C/C++ 主要函数参数在哪里

于 2013-05-21T09:09:16.390 回答