rrr
- x86 elf | nx
- 漏洞点: 栈溢出 | read(0 , buf , 0xa0) | buf 在 ebp-0x30
- 流程分析:
- srand(time(0))
- read(0 , buf , 0xa0)
- len = strlen(buf)
-
- 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)
- 从链表上解链 , 和 unlink 基本类似
- 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))
- create
- 漏洞:
- show 处有多余输出 , 可以进行 unsorted bin leak
-
- edit 处 有堆溢出 , 控制堆空间的分布之后 , 通过此处堆溢出进行fastbin attack
- 重点注意堆的分布和 realloc的函数特点
- 0x70 - > 0xe0 (freed , unsoredbin ) | realloc(pointer_0x70 , 0xdc) | 0xe0 - > 0x70(freed , fastbin)
- exp
网友评论