pwn store
- x64 elf | FULL RELRO , NX , STACK CANARY , PIE
- 功能分析:
- add order
- 創(chuàng)建 的 chunk 和 指定size的 chunk (0<size<1024) , 并作出輸入 (無溢出)
- 輸入 Good's name (指定 size 的 chunk) 時使用read且未強制加上\x00 結尾 | 可以使用 unsorted bin leak
- edit | 修改指定
- 判斷 order_num && index <= 0x10 && name_list[3 * index]
- 輸入new name | 此處使用 strcpy 將輸入在棧上的 new name 存入 name_list 中對應的地址 , 但是棧上輸入的 new_name 的位置 和 add 中 size 的存儲位置相連,造成了一個 off_by_one 的溢出
- 輸入 new goods
- show | 未實現(xiàn)
- pay
- 判斷 order_num && order_list[3 * index]
- free(name_list[3 * index])
- free(order_list[3 * index])
- memset( &order_id_list[3*index] , 0 , 0x18 ) # 將對應選項置為空
- 利用過程:
-
- 使用 add 的 unsorted bin leak 得到 main_arena + 0x60 的 地址 , 計算得出 libc 加載地址 以及下面需要劫持的符號的地址 (__free_hook)
- 1.1 注意此題 libc 版本時 libc 2.27 | 開啟了 tcache
- 1.2 利用的時候 注意 , 每個 idx tcache 存儲的chunk數(shù)量是 7 , LIFO , 滿后存入 unsorted bin 或 fastbin
- 1.2.1 調(diào)用時 優(yōu)先調(diào)用 tcache 存儲的 chunk
- 1.2.2 使用 tcache 時 靠近 top chunk 的 chunk 在 free 時 不會并入 top chunk
- free chunk 進入 tcache
- 使用 edit 的 offbyone 覆蓋 對應chunk的size位 , 然后 造成堆溢出 , 從而能覆蓋 進入 tcache 的 chunk的 next 指針 | alloc to arbitrarily
- 連續(xù)兩次分配出對應大小的 chunk , 設置其中一個 order 的 name 為 "/bin/sh\x00" , 控制 __free_hook 指向system
- free(name) | system(/bin/sh\x00)
-
- add order
pwn_base
- x86 elf | nx
- 流程分析:
- 輸入一段0x30長度的字符串 , base64 后執(zhí)行
- 考察點:
- ascll shellcode
- alpha3
- 因為長度限制,不能直接使用 msf 或者 alpha3 生成的shellcode
- shellcode 要求
-
- read(0 , &sc , N) ( &sc 為 第一段 shellcode 的 地址 , 存儲在調(diào)用后的 eax 中 欲虚, 目的是讀入 第二段 shellcode | N > len(shellcode1 + shellcode2))
- 1.1 這段shellcode 要求全部由 base64的可用字符組成
- 1.2 pop ebx | inc eax .. 等指令不可使用
- 1.3 查找 https://nets.ec/Ascii_shellcode
- 1.4 int 0x80 , 需要用 兩個可見字符和寄存器中的值 異或或者做出其他的處理得出,考慮到長度限制,異或會是一個比較好的選擇
-
- 輸入第二段shellcode即可
- 2.1 需要填充 前 0x32 個字符
-
arm pwn
- arm pwn | stack canary , nx
- 流程分析:
- 輸入1:
- 1.輸入name
- 2.然后使用 snprintf 組合成一個字符串 輸入 &s, 返回值為長度n (組合后的字符串長度 而非 最后寫入的長度)
- write(1 , &s , n) | canary 植旧,的位置是 &s+0x14 (所以 輸入 大于 9字節(jié)即可leak canary)
- 輸入2:
- 輸入地址 &s [ebp - 0x1c] 輸入長度 0x100 | 棧溢出
- | 棧分布 | [input start(padding * 0x18) , canary , ebp , ret]
- 輸入1:
- 利用過程:
- leak canary
-
- 棧溢出 執(zhí)行 system("/bin/sh")
- rop gadget | 設置 r0 為 &“/bin/sh” ,r3 為 system 地址 | 因為沒有直接的 pop r0
- pop {r4, r5, r6, r7, r8, sb, sl, pc};
- pop {r3, pc};
- mov r0 , r7 ; bx r3 ;
- 坑點:
- arm 推薦動態(tài)調(diào)試 , ida 分析的棧分布和動態(tài)調(diào)試時實際的棧分布不太相同。拱绑。艾蓝。。