rrr
- x86 elf | nx
- 漏洞點(diǎn): 棧溢出 | 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 處是一個(gè)保護(hù)措施 | 繞過方法 , 根據(jù) read 不因?yàn)?\x00 停止但 strlen 因?yàn)?\x00 停止的特點(diǎn)热某,在輸入中加入 \x00 繞過異或輸入保護(hù)
- exp
mycard
- x64 elf | Full Relro , stack canary , nx , pie
- 流程分析:
- create
- input( 0 , name , 0x40 , '\n') | 最后一個(gè)參數(shù)是結(jié)尾判斷符
- 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 加入鏈表
- 結(jié)構(gòu)體
- now | dq 8 byte | card 指針
- last | dq | 前一個(gè) node , 頭節(jié)點(diǎn)的 last 為其本身
- next | dq | 下一個(gè) node , 最后一個(gè)節(jié)點(diǎn)的 next 為 null
- 結(jié)構(gòu)體
- edit
- max = help() | 列出所有的 card
- index = atoi(input(0 , index , 14 , '\n'))
- if(index < max):
- now | 第 index 個(gè) card節(jié)點(diǎn)
- 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') | 產(chǎn)生堆溢出
- else:
- now-> size = new_len
- input(0 , now + 0x44 , new_len)
- delete
- 從鏈表上解鏈 , 和 unlink 基本類似
- 重要操作 : free(*node) , free(node)
- 從鏈表上解鏈 , 和 unlink 基本類似
- help
- 作用是 展示每個(gè) card 的 name 和 size
- 實(shí)際操作:
- write(0 , now_card , 0x40) # name
- if now_card -> size > 32:
- write(0 , now_card + 0x44 , 0x20) # 錯(cuò)誤使用 , 應(yīng)該通過 strlen(now_card + 0x44) 獲得輸出長度
- else:
- write(0 , now_card + 0x44 , size))
- create
- 漏洞:
- show 處有多余輸出 , 可以進(jìn)行 unsorted bin leak
-
- edit 處 有堆溢出 , 控制堆空間的分布之后 , 通過此處堆溢出進(jìn)行fastbin attack
- 重點(diǎn)注意堆的分布和 realloc的函數(shù)特點(diǎn)
- 0x70 - > 0xe0 (freed , unsoredbin ) | realloc(pointer_0x70 , 0xdc) | 0xe0 - > 0x70(freed , fastbin)
- exp