嗨,我正在使用Ubuntu,只是关闭了我的ASLR来检查2个文件(dumb.c和dumber.c)
哑巴正在创建文件并输入变量地址
dumber正在阅读并进行打印我很难理解为什么在某些计算机中它可以打印16而其他计算机32767
dumb.c
$ curl -q -v \
-H "Connection: keep-alive" \
-H "Accept-Encoding: identity" \
-H "Accept-Language: en-US" \
-H "User-Agent: Mozilla/5.0" \
https://www.saiglobal.com/
dumber.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int i = 7;
int j = 12;
int k = 15;
int *p = &j;
FILE *fp;
if(0 == (fp = fopen("dumb.txt", "w")))
{
printf("well, that didn\'t work!\n");
return -1;
}
fprintf(fp, "%p\n", (void*)p);
printf("Address from Dumb: %p, value: %d\n", (void *)p, *p);
if(fclose(fp))
{
printf("oh well.");
return -1;
}
sleep(300);
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
在dumber.c
,您拥有:
fscanf(fp, "%p\n", &p); /* getting address dumb process put there */
然后您拥有:
printf("p points to: %d\n", *p); /* reading memory content at that address */
因此,在哑处理中,您将读取哑处理在其中放置的地址,从这一点来看,p
并不指向j
。
现在,通常来说,由于这两个主电源是不同的进程,因此不管ASLR如何,哑巴看到的内存地址的内容很可能与哑地址在同一地址的值不同。 这就是进程的工作方式(我假设这些进程在Linux \ Windows \ Mac中运行),它们被加载到具有不同虚拟和物理地址映射的不同物理地址,而且您也不知道在哑进程中此地址是否指向有效地址。
现在,这里发生的是当您使用ASLR运行时,两个进程之间的进程地址空间(进程使用的虚拟地址)肯定不同。
如果没有ASLR进程,则所有进程的地址空间都相同,无论如何,物理地址都可能不同。 由于两个进程的堆栈使用情况相同,所以哑进程将j
的偏移量(虚拟地址)写入文件,而哑进程读取此偏移量,并且由于哑进程具有{ {1}}与dumber处理的偏移量相同,您将访问dumber的j
。使用ASLR时,哑巴看到的地址是哑巴进程的有效地址,但很可能不是哑巴的有效地址(很可能对此哑巴地址没有映射)
您可以通过在其中一个过程中更改j
的位置来进行验证,执行此操作,并且在哑处理过程中,您将永远不会看到j
所指向的地址上打印16作为值。