
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 125 天前 虽然好像你懂了,但是我还是还是回一下。 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 了。 |