比赛复现
春秋杯bypass:分析:
main函数用于处理一个名为.BYPASS的文件,会进行一系列验证操作,验证成功,程序会进入一个函数等待用户输入。程序无直接的后门函数。
可获得libc基地址:
主要漏洞在sub_400978()函数
s,s2,v4三个数组在栈上相邻,有两次循环赋值,循环赋值的结束条件是s[i]=0,memset只清空了s数组,故第一次循环赋值后s2不再是都为0,所以在第二次循环赋值时可以通过第一次给s2的赋值来达到数组越界覆盖返回地址为获取shell地址。(要注意控制好下标i,使能正确覆写到返回地址)
计算i:i位于rbp-2h即v4[526],i有两个字节即v4[526]和v4[527] (为了更好表示才这样写,实际上这种写法是错的),v4[526]=s[531],故i的值为531,十进制的531转换为二进制为1000010011,为了将其表示为16进制需要在前面补零即00000010 00010011,即高位字节’0x02’,低位字节’0x13’ 64位小端序程序低位字节存储在内存的低地址处,高位字节反之,栈是从高地址想低地址生长的,我们是从低地址向高 ...
Git学习
Git 学习笔记一、Git 简介Git 是一个开源的分布式版本控制系统,用于有效、高速地处理从小到大的项目版本管理。它允许团队协作开发项目,同时跟踪文件的变更历史。
二、安装 Git在 Windows 上,可以从Git 官网下载安装包并安装。在 macOS 和 Linux 上,可以通过包管理器(如 Homebrew 或 apt)安装。
12345# macOSbrew install git# Ubuntusudo apt install git
安装完成后,可以通过以下命令检查 Git 版本:
1git --version
三、配置 Git首次使用 Git 时,需要配置用户信息,这些信息会出现在每次提交中。
12345# 配置全局用户名git config --global user.name "Your Name"# 配置全局用户邮箱git config --global user.email "your_email@example.com"
四、克隆仓库克隆仓库是将远程仓库的代码复制到本地的过程。
12# 克隆远程仓库到本地 ...
ret2shellcode
开始正式学习shellcode了!
ret2shellcod前置基础大端序与小端序:
大端序和小端序是指计算机存储多字节数据类型(如整数、浮点数等)时字节的排列顺序。
大端序:一个多字节值的最高位字节(即“大端”)存储在最低的内存地址处,其余字节按照大小递减的顺序存储。这种排列方式类似于我们写数字时从最高位到最低位的顺序。
例如一个16位的二进制数0x1234在大端序存储系统中,它的存储方式如下:
123内存地址 数据0x00 0x120x01 0x34
小端序:一个多字节值的最低位字节(即“小端”)存储在最低的内存地址处,其余字节按照大小递增的顺序存储。这种排列方式类似于我们从最低位到最高位读取数字的顺序。
使用上面相同的16位二进制数0x1234,在小端序存储系统中,它的存储方式如下:
123内存地址 数据0x00 0x340x01 0x12
大多数现代个人电脑和服务器使用小端序存储,而某些大型机、网络协议和旧的计算机系统则使用大端序。
系统调用32位程序执行系统调用获取shell
12345678910void __nor ...
ctfshow刷题日记53-55
爆破”Canary” pwn53分析:题目hint:”再多看一眼就会爆炸”
可能会遇到爆破
checksec
IDA分析
main函数:
12345678int __cdecl main(int argc, const char **argv, const char **envp){ setvbuf(stdout, 0, 2, 0); logo(); canary(); ctfshow(); return 0;}
canary函数:
12345678910111213int canary(){ FILE *stream; // [esp+Ch] [ebp-Ch] stream = fopen("/canary.txt", "r"); if ( !stream ) { puts("/canary.txt: No such file or directory."); exit(0); } fread(&global_canary, 1u ...
ctfshow_pwn前置杂记
一些Linux指令SSHSSH(Secure Shell)是一种网络协议,用于安全地远程登录到计算机系统。SSH 主要用于以下场景:
远程命令行登录文件传输(通过 SFTP 或 SCP)端口转发
使用格式:
ssh ctfshow@题目地址 -p题目端口号
lsls 命令用于列出目录内容
eg:
ls:列出当前目录的内容。
ls -l:以长格式列出当前目录的内容,显示文件的详细信息。
ls -a:列出当前目录的所有文件,包括隐藏文件(以点开头的文件)。
ls /path/to/directory/:列出指定目录的内容。
注:ls后加 / 是为了明确指定路径避免歧义
ncnc(Netcat)是一个功能强大的网络工具,用于读取和写入网络连接
看起来你正在使用 gdb(GNU 调试器)来调试一个程序。gdb 是一个强大的工具,可以帮助你分析和调试程序的行为。如果你有具体的调试需求或遇到问题,请告诉我更多细节,我可以提供进一步的帮助。
echoecho 是一个常用的命令行工具,用于将指定的文本输出到标准输出设备(通常是终端,也可以是指定文件)。这个命令非常简单但功能强大, ...
汇总
前言此篇文章是因为平时找一些指令要到处翻文章感觉有点麻烦就做了一些知识点的小汇总。
内容包括Linux指令、找ROPgadget指令、64位程序传参寄存器、GDB调试….,pwntools单独放在另一篇文章了感兴趣的师傅可以在博客主页翻翻看
Linuxnc1nc 域名 端口号
nc用于连接远程靶机,是Linux中的一个网络工具(还有很多其他用法但不常用就不列举了)
ssh1ssh 用户名@题目地址 -p题目端口号
ssh是一种网络协议,用于安全的远程登录到计算机系统
ls1ls
ls用于列出当前工作目录下的文件或子目录
cd1cd 目标路径
pwd列目录1pwd
pwd显示当前工作目录的内容
chown程序提权1chmod 777 文件名
该指令用于将程序变为可读可写可执行,即改变程序的权限
file查看文件类型1file 文件名
dynamically linked为动态链接
static Linking为静态链接
AWDP修复后文件上传国赛半决打了第一次AWDP结果看不懂怎么传防御了的文件其中涉及一个update.sh文件
update.sh 是一个常见的 ...
静态链接之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用于生成 ...

