NSSCTF五题积累(一)
第一轮
1.Crypto
[CryptoCTF_2020]One_Line_Crypto

1 | from Crypto.Util.number import * |
enc文件:14608474132952352328897080717325464308438322623319847428447933943202421270837793998477083014291941466731019653023483491235062655934244065705032549531016125948268383108879698723118735440224501070612559381488973867339949208410120554358243554988690125725017934324313420395669218392736333195595568629468510362825066512708008360268113724800748727389663826686526781051838485024304995256341660882888351454147057956887890382690983135114799585596506505555357140161761871724188274546128208872045878153092716215744912986603891814964771125466939491888724521626291403272010814738087901173244711311698792435222513388474103420001421
2.Web
[M1r4n]冰蝎的秘密
#流量分析 #Webshell流量
题目描述:在一次网络安全的挑战中,你截获了一段神秘的冰蝎流量。据说这段流量中隐藏着重要的信息。你能解开这个谜团,找出隐藏在流量中的秘密吗?
解答:

流量包损坏。需要修复
法一:CTFNetA修复
法二:使用pcapfix修复
法三:使用010 editor,与正常流量对照手动修复
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
[BJDCTF_2020]Easy
附件:easy.exe
无壳程序,直接分析即可

第二轮
1.Crypto
[SWPUCTF_2021_新生赛]ez_caesar
#凯撒密码 #Base家族 #古典密码
1 | import base64 |
NSSCTF{youhaveknowcaesar}
2.Web
[SWPUCTF_2021_新生赛]easy_sql
http://node4.anna.nssctf.cn:28049/
3.Misc
[强网拟态2021]BlueWhale
附件:
先分析外层流量包,追踪TCP流
获取密码:th1sIsThEpassw0rD
但似乎不是内层压缩包解压密码。
暴力破解:
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 函数剩下的代码了。
[HXPCTF 2021]shitty blog
1.Crypto
[SWPUCTF 2021]新生赛 ez_rsa
题目内容:p = 1325465431 q = 152317153 e = 65537 计算出d,将d用MD5加密后包裹NSSCTF{}提交
具体代码:
1 | import gmpy2 |
d=43476042047970113
NSSCTF{08bb8fb628da85923e5734a75ac19ffe}
[LitCTF 2023]只需要nc一下~
没有信息。cat一下dockerfile
这个是假flag。
我们需要执行一些系统命令来获取更多信息:
id:查看当前用户的权限。whoami:查看当前用户。发现咱有root权限ps aux:查看当前进程,确认是否有相关程序env:查看环境变量。
NSSCTF{ecf2ed91-f9ca-497b-addf-b1707a4ca59b}

