pwn学习总结(五) —— ret2dl_runtime_resolve(待补充)
生活随笔
收集整理的這篇文章主要介紹了
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
描述:
.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函數,其實調用的是
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
執行流程:
總結
以上是生活随笔為你收集整理的pwn学习总结(五) —— ret2dl_runtime_resolve(待补充)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 恶意代码分析(一)
- 下一篇: Fuzz学习笔记(一)—— WinAFL