V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
leeside
V2EX  ›  程序员

xv6 的 system calls lab

  •  
  •   leeside · 21 天前 · 1053 次点击

    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 条附言  ·  21 天前
    1. 是我搞糊涂指针和位的计算了.
    2. 最小应该是 offset + 8 ,移动 8 个字节,8 * 8 = 64.
    3. 32 是字节数,因为 end 是 char*,+1 会移动一个字节.
    2 条回复    2025-08-13 11:07:23 +08:00
    aynakeya
        1
    aynakeya  
       21 天前   ❤️ 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
       21 天前
    @aynakeya 感谢感谢,看懂了
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5310 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 07:56 · PVG 15:56 · LAX 00:56 · JFK 03:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.