NSSCTF五题积累(六)
第一轮
1.Crypto
[羊城杯 2020]Simple
#RSA #Crypto
1 | from Crypto.Util.number import * |
1 | from Crypto.Util.number import * |
2.Web
[ByteCTF 2019]BabyBlog
#二次注入 #正则RCE #diable_function绕过
3.Misc
[长城杯 2021 院校组]签到
#编码分析 #字符编码ASCII
5a6d78685a3374585a57786a6232316c5833527658324e6f5957356e5932686c626d64695a544639
先hexadecimal再base64
flag{Welcome_to_changchengbe1}
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
[MoeCTF 2021]midpython
#Python #自定义逻辑 #REVERSE

https://cn.bing.com/search?q=pyinstxtractor
这个工具可以将PyInstaller编译的.exe文件反编译回源代码.py文件
1 | python pyinstxtractor.py 文件名 |

获得大量文件。寻找核心的Midpython.pyc,使用pycdc


1 | key = [ |
1 | xorr(x, y) = xoor(x, y) ^ 14 = ((x ^ y ^ 11) ^ 45) ^ 14 |
1 | key = [69,70,79,72,88,75,85,127,89,85,74,19,74,122,107,103,75,77,9,73,29,28,67] |
选择32~126的原因:
ASCII(美国标准信息交换码)将字符分为几个主要范围:
0-31 :控制字符(不可打印),如换行符(\n)、制表符(\t)、回车符(\r)等,这些字符在屏幕上无法正常显示为可见字符。
32 :空格字符,是唯一可打印的控制字符。
33-126 :可打印字符,包括所有常用字符:标点符号(如!、@、#、$等)、数字(0-9)、大写字母(A-Z)、小写字母(a-z)、其他符号(如=、+、-、*等)。
moectf{Pyth0n_M@st3r!!}
第二轮
1.Crypto
[HGAME 2022 week1]Matryoshka
#维吉尼亚 #凯撒密码 #摩斯代码
为了学好四六级,协会里某不知名的康师傅决定通过看英文小说来提高自己的英语水平。
可不知道为什么,下载来的小说竟然都被打乱并加密了。
他费尽千辛万苦重要找到了一部分小说的原文,你能帮帮他么?
⠨⠨⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠨⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠨⠨⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠤⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠤⠤⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠨⠨⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠨⠨⠨⠨
Caesar:21; Vigenère:hgame
先盲文解密看看

发现解密后开头不太对:

试着反转一下再解密

46,66,42,75,66,45,46,6E,6D,4C,73,36,44,33,73,69,59,74,4C,36,58,32,70,34,69,4E,30,63,64,53,6C,79,6B,6D,39,72,51,4E,39,6F,4D,53,31,6A,6B,73,39,72,4B,32,52,36,6B,4C,38,68,6F,72,30,3D
16进制特征。
1 | str='46,66,42,75,66,45,46,6E,6D,4C,73,36,44,33,73,69,59,74,4C,36,58,32,70,34,69,4E,30,63,64,53,6C,79,6B,6D,39,72,51,4E,39,6F,4D,53,31,6A,6B,73,39,72,4B,32,52,36,6B,4C,38,68,6F,72,30,3D' |
466642756645466E6D4C73364433736959744C3658327034694E306364536C796B6D3972514E396F4D53316A6B7339724B3252366B4C38686F72303D

FfBufEFnmLs6D3siYtL6X2p4iN0cdSlykm9rQN9oMS1jks9rK2R6kL8hor0=
然而直接base解码并不成功。
根据题目提示:维吉尼亚密码的key是hgame。不妨先试一下,因为解完末端依旧是=号,然后再base64可能性大一点。

YzBibXZnaHl6X3swUmF6X2d4eG0wdGhrem9fMG9iMG1fdm9rY2N6dF8hcn0=

c0bmvghyz_{0Raz_gxxm0thkzo_0ob0m_vokcczt_!r}
根据题目:凯撒21位

h0gralmde_{0Wfe_lccr0ympet_0tg0r_atphhey_!w}
最后栅栏密码解密:

hgame{Welc0me_t0_the_w0rld_0f_crypt0graphy!}
2.Web
[SWPUCTF 2021 新生赛]include
#PHP伪协议 #PHP #文件包含


构造:?file=php://filter/read=convert.base64-encode/resource=flag.php

PD9waHANCiRmbGFnPSdOU1NDVEZ7OTdiYWY3MmUtMDg0ZS00MGIwLWFmYzEtMWE2NzAxOWFkODA2fSc7

NSSCTF{97baf72e-084e-40b0-afc1-1a67019ad806}
3.Misc
[NISACTF 2022]huaji?
#图片隐写 #压缩包分析 #图片分离

binwalk提取文件:
一个加密zip内含flag

接下来找解压密码。原图片应该还有未发掘信息。

6374665f4e4953415f32303232

ctf_NISA_2022。解压

flag{Nls@_FumYEnnOjy}
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
[SWPUCTF 2021 新生赛]非常简单的逻辑题
#Python #语言逆向 #逆向技术
1 | flag = 'xxxxxxxxxxxxxxxxxxxxx' |
1 | # 已知的加密结果 |
NSSCTF{Fake_RERE_QAQ}

