ret2libc
ret2libc前置基础libc常用于处理动态链接程序,动态链接:程序在运行或加载时,在内存中完成链接的过程,即系统库和自己编写的代码分割成两个独立的模块,等到程序运行时再将这两个模块进行链接。详细介绍可以看指南摘要的动态链接部分
其具有延迟绑定的特点,只有当函数第一次被调用时,动态链接器才进行符号查找、重定位等操作,如果未被调用则不进行绑定
ELF文件通过过程链接表和GOT的配合来实现延迟绑定,每个被调用的库函数都有一组对应的PLT和GOT。(plt里存放的是汇编指令,用于跳转到got,got里存放了地址 )
工具指令ROPgadget
获取gadget地址,--binary参数指定文件,可以是可执行文件或libc文件,grep用于筛选,--string用于筛选字符串
通过pop rdi;ret可以将栈地址中的值传给rdi寄存器,其他寄存器同理,故p64(pop_rdi_ret)+p64(rdi_content)即可控制rdi寄存器的值为rdi_content
12345$ROPgadget --binary pwn --only 'pop|ret' | grep ...
ret2text
函数压入栈中是由上往下由栈底到栈顶,通过payload将数据压入栈是由下往上由栈顶往上压入到栈底
未开保护存在可利用函数类(地址跳转)有打印flag的函数什么保护都没开,存在gets函数有栈溢出漏洞,有打印flag的函数。
思路:利用栈溢出覆盖原函数到其ebp,用flag的地址覆盖原函数返回地址,以达到运行打印flag函数的效果
12345678910111213141516171819202122from pwn import *# 设置 pwntools 的上下文环境context(arch='i386', os='linux', log_level='debug')# 连接到远程服务器io = remote("pwn.challenge.ctf.show", 28182)# 加载本地二进制文件elf = ELF('./pwn')# 获取 get_flag 函数的地址flag = elf.sym['get_flag']# 构造 payload,cyclic用于生成 ...
2024玄武杯
序:玄武杯pwn只出了两题签到题有点可惜,但是还是学到了很多东西(下次不会再被保护吓到了!!)
Miscmisc0:一题图片识别题,刚开始还没头绪结果直接公布答案了qwq,看了学长的wp后发现了用谷歌识图就出来了
misc1:编码转换,给了一串二进制题目提示组cp,猜测应该要转为字符故首先尝试将其转为ASCII字符,出现一段有cp,的字符串,拖工具一键解码没出来,看元素只有了两个所以试着改了一下摩斯码,把c换成 . 把p换成 - ,当作分隔符,(因为没想到写脚本转就手打了,打完之后眼睛花了还出错了好几次,下次一定写脚本转),转换之后解码包裹得解,后来查文章发现cp也是摩斯码的一种表现形式
misc2:信息查找题,给了一张图片查该飞机在当天10点经过哪个城市
从图片中可以看到飞机机翼上有飞机的编号B-20A6,另一架飞机上有航空公司名字且两架飞机的logo一样故确认为中国国际航空公司的飞机,打开文件属性发现备注了拍摄时间2024年10月12号00:00故确认了范围,接下来寻找能够查航空轨迹的工具,我用的是航旅纵横里面可以用航班号、飞机编号查具体时间的飞机的飞行轨迹。
misc3:sno ...
第一篇文章
首先要感谢baozongwi//学长,帮我搭建了基础的hexo并装好了主题,并且在学习上帮了我很多,我会努力学习不辜负学长期望的!!
记录一下自己的目标:希望成为一名资深pwn手,能够在二进制方面有所成就。
最后因为刚入门,主题也没完全配置好所以博客会比较简陋,学习的知识也很少所以文章会比较基础。