strcpy(end+32, argv[1]); 为什么是偏移 32 呢,run 应该占用了一个 64 字节 的指针才对啊,有点儿疑惑
https://pdos.csail.mit.edu/6.828/2024/labs/syscall.html
struct run {
struct run *next;
};
int
main(int argc, char *argv[])
{
if(argc != 2){
printf("Usage: secret the-secret\n");
exit(1);
}
char *end = sbrk(PGSIZE*32);
end = end + 9 * PGSIZE;
strcpy(end, "my very very very secret pw is: ");
strcpy(end+32, argv[1]);
printf("secret pointer: %p\n", end);
exit(0);
}
1
aynakeya 21 天前 ![]() 虽然好像你懂了,但是我还是还是回一下。
sbrk 申请一块新的 heap ,总之就是向系统申请了一块内存。 然后往那块内存的第 10 个 page 写了`"my very very very secret pw is: "` 这个字符串,这串字符串长度是 34 byte. char 的大小是 1byte ,+32 就是移动指针到"is: _"这边然后写入 secret ,所以最后在第 10 个 page 里就会有"my very very very secret pw is: some_random_secret"。 这块和`struct run `没有多大关系 然后稍微看了一下 lab ,可能有剧透。 没仔细看,先运行 secret 然后再运行 attack ,两个都是 fork 然后 exec 。所以我猜应该两个 proc 可以拿到相同的 page 。然后 lab 里写了没 memset 清空 page ,所以应该直接申请一堆 page 暴力看哪个 page 开头有"my"就 ok 了。 |