安恒月赛 pwn wp | 2019_01

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)