静态链接之mprotect
静态链接之mprotect这篇文章针对ctfshow上的49,50题
什么是mprotect函数meprotect函数可以用来修改指定内存页的权限为可读、可写、可执行。
大多可写的部分都不可执行,利用该函数修改后可传入shellcode来获取shell
函数原型:
1int mprotect(const void* start,size_t len,int prot);
第一个参数*start是指向需要进行操作的地址
第二个参数len是地址往后多大的长度
第三个参数port是要赋予的权限
区间开始的地址start必须是一个内存页的起始地址(地址的后三位为0,0x1000=4096u),指定的内存区间必须包含整个内存页(4KB=4096B)
区间长度len必须是页大小的整数倍。
mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值
prot可以取一下几个值,并且可以用”|”将几个属性合起来使用:
PROT_READ:表示内存段内的内容可写;
PROT_WRITE:表示内存段内的内容可读;
PROT_EXEC:表示内存段 ...
pwntools
pwntools的使用该板块会持续更新,学一点写一点
学习资料来源于:1
导入pwntools库1from pwn import*
设置基本信息1context(arch = 'amd64',os = 'linux',log_level = 'debug')
os是靶机的操作系统类型
arch是题目的架构,一般是AMD64(64位)或i386(32位)
log_level是指日志输出等级,设置为debug可以在脚本运行时输出我们具体发送了什么信息,靶机反馈了什么信息。
连接远程靶机1io = remote("ip",port)#前者为靶机地址,后者为端口号
1io = ssh(host='ip',user='用户名',port=端口号,password='密码')
本地调试1io = process("./pwn")
发送信息12345678p.send(payload) # 直接发送payloadp.sendline ...
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手,能够在二进制方面有所成就。
最后因为刚入门,主题也没完全配置好所以博客会比较简陋,学习的知识也很少所以文章会比较基础。

