• 请不要在回答技术问题时复制粘贴 AI 生成的内容
leeside
0.01D
V2EX  ›  程序员

xv6 的 system calls lab

  •  
  •   leeside · Aug 12, 2025 · 1738 views
    This topic created in 276 days ago, the information mentioned may be changed or developed.

    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);
    }
    
    Supplement 1  ·  Aug 12, 2025
    1. 是我搞糊涂指针和位的计算了.
    2. 最小应该是 offset + 8 ,移动 8 个字节,8 * 8 = 64.
    3. 32 是字节数,因为 end 是 char*,+1 会移动一个字节.
    2 replies    2025-08-13 11:07:23 +08:00
    aynakeya
        1
    aynakeya  
       Aug 13, 2025   ❤️ 1
    虽然好像你懂了,但是我还是还是回一下。

    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 了。
    leeside
        2
    leeside  
    OP
       Aug 13, 2025
    @aynakeya 感谢感谢,看懂了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2878 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:06 · PVG 20:06 · LAX 05:06 · JFK 08:06
    ♥ Do have faith in what you're doing.