我在CentOS和Debian上都运行了一个程序。输出完全相同,但是在Centos中我得到了3行粗体,而在Debian中却没有。这三行内容是什么,我也如何在Debian中获得它们?

execve(“./z1”,[“./z1”],[/* 31个变量*/])= 0
brk(0)= 0x8458000
access(“/etc/ld.so.nohwcap”,F_OK)= -1 ENOENT(无此类文件或目录)
mmap2(NULL,8192,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0)= 0xb7f41000
access(“/etc/ld.so.preload”,R_OK)= -1 ENOENT(无此类文件或目录)
打开(“/home/myuser/public_html/libs/libmudflap.so.0”,O_RDONLY)= 3
读取(3,“\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0PJ\0\0004\0\0\0“...,512)= 512
fstat64(3,{st_mode = S_IFREG | 0755,st_size = 105432,...})= 0
mmap2(NULL,943136,PROT_READ | PROT_EXEC,MAP_PRIVATE | MAP_DENYWRITE,3,0)= 0xd89000
mmap2(0xda2000、4096,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE,3、0x19)= 0xda2000
mmap2(0xda3000,836640,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS,-1,0)= 0xda3000
关闭(3)= 0
open(“/home/myuser/public_html/libs/libc.so.6”,O_RDONLY)= 3
read(3,“\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320m\1\0004\0\0\0“...,512)= 512
fstat64(3,{st_mode = S_IFREG | 0755,st_size = 1327556,...})= 0
mmap2(NULL,4096,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0)= 0xb7f40000
mmap2(NULL,1337704,PROT_READ | PROT_EXEC,MAP_PRIVATE | MAP_DENYWRITE,3,0)= 0x891000
mprotect(0x9d1000,4096,PROT_NONE)= 0
mmap2(0x9d2000、12288,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE,3、0x140)= 0x9d2000
mmap2(0x9d5000、10600,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS,-1、0)= 0x9d5000
关闭(3)= 0
open(“/home/myuser/public_html/libs/libdl.so.2”,O_RDONLY)= 3
读取(3,“\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 @\n\0\0004\0\0\0“...,512)= 512
fstat64(3,{st_mode = S_IFREG | 0755,st_size = 9736,...})= 0
mmap2(NULL,12408,PROT_READ | PROT_EXEC,MAP_PRIVATE | MAP_DENYWRITE,3,0)= 0x74e000
mmap2(0x750000,8192,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE,3,0x1)= 0x750000
关闭(3)= 0
mmap2(NULL,4096,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0)= 0xb7f3f000
set_thread_area({entry_number:-1-> 6,base_addr:0xb7f3f6c0,限制:1048575,seg_32bit:1,内容:0,read_exec_only:0,limit_in_pages:1,seg_not_present:0,可用:1})= 0
open(“/dev/urandom”,O_RDONLY)= 3
read(3,“\f\233\37”,3)= 3
关闭(3)= 0
mprotect(0x750000,4096,PROT_READ)= 0

最佳答案

我认为这与strace没有任何关系。我不确定,但可能与内存中的排列方式有关。我知道有些系统将二进制文件的部分放在内存中的随机位置,以防止恶意 Activity 。这称为Address Space Layout Randomization(ASLR)。我猜测那时CentOS正在使用它,而Debian不是。有关在CentOS中禁用ASLR的信息,请参见this post。尝试一下,看看strace是否仍然显示/dev/urandom正在打开。

因此,关键是可能是您的系统而不是strace或引起差异的程序。

-编辑-

所以上面我可能是错的。我对此问题进行了大量研究,并设法缩小了范围。我发现它很可能是进行这些调用的库。我使用的方法有点复杂,但是可行。 See this post如果您仍然好奇的话,该如何做。

我使用gnome(eog)进行了调试,因为我编写的简单测试程序不会触发urandom的读取。事实证明,Gkt +是我的罪魁祸首,它使用随机数为某些对象创建唯一的ID。我很好奇,您的程序正在使用什么来进行这些调用。在这一点上,我怀疑是ASLR。

10-04 10:24
查看更多