赛题合集
国内比赛XYCTF2025girlfirendcheck发现保护全开,有菜单但是似乎不是堆题
发现有system("echo /flag"); 但是没有/bin/sh
解析各个选择
1:
123456789101112131415161718192021__int64 lll1(){ char buf[56]; // [rsp+0h] [rbp-40h] BYREF unsigned __int64 v2; // [rsp+38h] [rbp-8h] v2 = __readfsqword(0x28u); if ( dword_4094 ) { puts("You have already tried to talk to her, and she left..."); } else { dword_4094 = 1; puts("Girl is very beautiful!"); puts("what do you ...
ctfshow刷题记录
pwn75栈迁移check
1234567桌面$ checksec pwn[*] '/home/pwn/桌面/pwn' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)
题目提示”栈空间不够怎么办”,可以用栈迁移
栈迁移原理是利用两次leave ret先将ebp的值修改为输入shell的地址,再利用第二次leave ret将esp的值改为ebp的值,pop ebp将此时栈顶的值弹入ebp中,esp+4执行ret也就是pop eip将当前栈顶内容弹入执行流,使我们压在栈上非返回地址处的地址也可以执行达到控制执行流的效果
观察程序
漏洞函数:ctfshow
1234567891011int ctfshow(){ char s[36]; // [esp+0h] [ebp-28h] BYREF memset(s, 0, 0x20u) ...
polar2025春季赛 wp
前言这次polarD&N上pwn方向上的题都挺好的,进一步学习了canary绕过也发现了自己的很多问题(看得懂知识的不知道怎么实际来打等)
libc一题简单的ret2libc,也是当天唯一出的一题
12345678int jiu(){ char buf[58]; // [esp+Eh] [ebp-3Ah] BYREF puts("like"); read(0, buf, 0x50u); return 0;}//有栈溢出漏洞
程序动态链接,开了nx没开canary有puts函数直接puts泄露libc即可
exp:
12345678910111213141516171819202122232425262728from pwn import*from LibcSearcher import*io=remote('1.95.36.136',2148)#io=process('./pwn')elf=ELF('./pwn1')main=elf.sym['main ...
GDB调试
GDB调试这篇文章用于记录gdb调试的学习
常用指令123456789101112131415gdb pwn #开始调试b 函数名 #在指定函数处打断点b* 地址 #在指定位置处设置断点b* $rebase(0x111D) #有PIE时这样下断点得先run起来n #c语言级的断点定位(走得快一点)ni #汇编级别的断点定位(走得精细一点)s/si #s与si的区别和n/ni相同,不同点在于s/si会进入函数内部fibi #跳出函数r #运行c #让程序继续运行stack 30 #查看此时栈中的内容x/gx #计算偏移x/1gx $rsp+0x10 #查看rsp+0x10处的值start #开始程序vmmap #查看各段信息
给exp加gdb调试
12context.terminal = ["tmux","splitw","-h"]#左右分屏gdb.attach(io)#放到想要在exp中停止的位置,程序在运行时候会停止在该处进行调试
此处加了一个小插件tmux可以双栏显示调试,更方便查看 ...
ret2syscall
ret2syscall64位系统调用获取shell需要满足
12345rax = 59rdi = bin_sh_addrssrsi = 0rdx = 0syscall
32位系统调用获取shell需要满足
12345eax = 0xbebx = bin_sh_addrssecx = 0edx = 0int 0x80
其实在ret2shellcod里我们就已经使用过ret2syscall的类似解法,也就是系统调用但只用了orw,这篇文章来介绍静态链接的elf文件使用gadget构造系统调用execve(“/bin/sh”,NULL,NULL)拿shell
对于i386程序想要系统调用execve(“/bin/sh”,NULL,NULL)需要达成以下条件:
系统调用号,即 eax 应该为 0xb,因为是execve所以是0xb
第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
第二个参数,即 ecx 应该为 0
第三个参数,即 edx 应该为 0
最后int 0x80 系统调用
接下 ...
VN wp
MiscVN_Lang简单的签到题,原本以为真的要解密程序里的那个字符串结果发现记事本打开搜VN就有flag。
CryptoeasymathAI神力,首先多项式求根求解多项式方程找到质数候选值,质数筛选,模运算计算平方根和模数,Tonelli-Shanke算法计算模数下的平方根,注意考虑平方根正负两种情况,接着用中国剩余定理将模质数下的解合并为模N下的解,最后过滤解码即可。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115# 导入所需的库from sympy import symbols, solve, isprimefrom sympy.ntheory.modul ...
比赛复现
春秋杯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 ...

