日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pwn学习总结(五) —— ret2dl_runtime_resolve(待补充)

發布時間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pwn学习总结(五) —— ret2dl_runtime_resolve(待补充) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

pwn學習總結(五) —— ret2_dl_runtime_resolve

  • 一、程序示例
  • 二、Section
    • .dynamic
    • .dynstr
    • .dymsym
    • .rel.plt
  • 三、延遲綁定
    • _dl_runtime_resolve

一、程序示例

第一步:編譯并運行以下代碼

#include<stdio.h>int main() {char buf[]="Hello World!\n";write(1, buf, strlen(buf));return 0; }

編譯命令:gcc -m32 test.c -o test

第二步:使用gdb進行調試

單步執行到下圖位置

步入write函數查看


可以發現,第一次調用write函數時,jmp到了plt[‘write’]的下一行

重點分析:
push 0x18:reloc_arg,32位程序對應當前函數在.rel.plt中的偏移,64位程序為index下標
push dword ptr[_GLOBAL_OFFSET_TABLE_+4]:link_map結構,其中包含dynamic指針

第三步:查看.plt

0x8048340: push DWORD PTR ds:0x804a004 //存放link_map結構,包含dynamic指針 0x8048346: jmp DWORD PTR ds:0x804a008 //調用_dl_runtime_resolve 0x804a004: 0xf7ffd918->link_map 0x804a008: 0xf7fee000->_dl_runtime_resolve

二、Section

.dynamic

描述:該段存儲了動態鏈接會用到的各個表的位置等信息

結構體

typedef struct {Elf32_Sword d_tag;union {Elf32_Word d_val;Elf32_Addr d_ptr;} d_un; } Elf32_Dyn;

在IDA中查看.dynamic

.dynstr

描述:

  • .dynstr[0]永遠為0
  • 包含了一些動態鏈接所需的字符串
  • 相關結構引用時引用的是字符串與.dynstr首地址間的偏移
  • .dymsym

    描述:記錄了各種符號的信息,每個結構體對應一個符號

    結構體

    typedef struct {Elf32_Word st_name; //符號名,相對.dynstr起始的偏移Elf32_Addr st_value;Elf32_Word st_size;unsigned char st_info; //對于導入函數符號,值為0x12unsigned char st_other;Elf32_Section st_shndx; }Elf32_Sym

    .rel.plt

    描述:重定位表(與windows重定位表概念不同),也是一個結構體數組,每個項對應一個導入函數

    結構體

    typedef struct {Elf32_Addr r_offset; //指向對應got表的指針Elf32_Word r_info; //index = r_info >> 8//對應此導入符號在.dynsym中的下標 } Elf32_Rel;

    三、延遲綁定

    描述
    1) 當我們第一次調用write函數,其實調用的是

    _dl_runtime_resolve(link_map, reloc_arg)

    2) reloc_arg為導入函數在.rel.plt中的偏移(比如此處的push 0x18)

    0x18 = 0 + 3 * sizeof(Elf32_Rel) = 0 + 3 * 0x8

    執行前

    pwndbg> x/wx 0x804A018 0x804a018: 0x08048386

    執行后

    pwndbg> x/wx 0x804A018 0x804a018: 0xf7ed8c70

    _dl_runtime_resolve

    執行流程

  • link_map訪問.dynamic,取出.dynstr, .dynsym, .rel.plt的指針
  • .rel.plt + reloc_arg(第二個參數/函數在.rel.plt中的偏移)求出當前函數的重定位表項Elf32_Rel的指針,記作rel
  • rel->r_info >> 8作為.dynsym的下標,求出當前函數的符號表項Elf32_Sym的指針,記作sym
  • .dynstr + sym->st_name得出符號名字符串指針
  • 在動態鏈接庫查找這個函數的地址,并且把地址賦值給rel->r_offset指向的數據,即函數在GOT表中對應的位置
  • 調用這個函數
  • 總結

    以上是生活随笔為你收集整理的pwn学习总结(五) —— ret2dl_runtime_resolve(待补充)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。