美文网首页
安恒月赛 pwn wp | 2019_01

安恒月赛 pwn wp | 2019_01

作者: fantasy_learner | 来源:发表于2019-02-11 17:28 被阅读0次

    rrr

    • x86 elf | nx
    • 漏洞点: 栈溢出 | read(0 , buf , 0xa0) | buf 在 ebp-0x30
    • 流程分析:
        1. srand(time(0))
        1. read(0 , buf , 0xa0)
        1. len = strlen(buf)
        1. for i in range(len):
        • buf[i] ^= rand()
    • tip:
      • 4 处是一个保护措施 | 绕过方法 , 根据 read 不因为 \x00 停止但 strlen 因为 \x00 停止的特点,在输入中加入 \x00 绕过异或输入保护
    • exp

    mycard

    • x64 elf | Full Relro , stack canary , nx , pie
    • 流程分析:
      • create
        • input( 0 , name , 0x40 , '\n') | 最后一个参数是结尾判断符
        • atoi(read(0 , nptr , 14 , "\n)) | 读入 desc 的 size
        • desc_temp = malloc(size)
        • input(0 , desc_temp , size , '\n')
        • result = malloc(size + 0x44)
        • strncpy(result , name , 0x40)
        • *(result + 0x40) = size | int 类型
        • memcpy(result + 0x44 , desc_temp , size)
        • free(desc_temp)
        • node = malloc(0x18)
        • 将 node 加入链表
          • 结构体
            • now | dq 8 byte | card 指针
            • last | dq | 前一个 node , 头节点的 last 为其本身
            • next | dq | 下一个 node , 最后一个节点的 next 为 null
      • edit
        • max = help() | 列出所有的 card
        • index = atoi(input(0 , index , 14 , '\n'))
        • if(index < max):
          • now | 第 index 个 card节点
          • input(0 , now , 0x40)
          • new_len = input(0 , new_len , 14)
          • if new_len > now->size:
            • now = realloc(now , new_len + 0x44)
            • now->size = new_len
            • input(0 , now + 0x44 , new_len + 0x44 , '\n') | 产生堆溢出
          • else:
            • now-> size = new_len
            • input(0 , now + 0x44 , new_len)
        • delete
          • 从链表上解链 , 和 unlink 基本类似
            • 重要操作 : free(*node) , free(node)
        • help
          • 作用是 展示每个 card 的 name 和 size
          • 实际操作:
            • write(0 , now_card , 0x40) # name
            • if now_card -> size > 32:
              • write(0 , now_card + 0x44 , 0x20) # 错误使用 , 应该通过 strlen(now_card + 0x44) 获得输出长度
            • else:
              • write(0 , now_card + 0x44 , size))
    • 漏洞:
        1. show 处有多余输出 , 可以进行 unsorted bin leak
        1. edit 处 有堆溢出 , 控制堆空间的分布之后 , 通过此处堆溢出进行fastbin attack
        • 重点注意堆的分布和 realloc的函数特点
        • 0x70 - > 0xe0 (freed , unsoredbin ) | realloc(pointer_0x70 , 0xdc) | 0xe0 - > 0x70(freed , fastbin)
    • exp

    相关文章

      网友评论

          本文标题:安恒月赛 pwn wp | 2019_01

          本文链接:https://www.haomeiwen.com/subject/xuwqeqtx.html