NSSCTF五题积累(四)
第一轮
1.Crypto
[TCTF 2019]babyrsa
#AMM #Crypto #RSA
RSA challs are always easy, right? Even if N is not a integer.
2.Web
[鹤城杯 2021]流量分析
#流量分析 #日志审计 #脚本编写
抢分做法:一把梭

回顾:

发现大量HTTP请求包含SQL盲注特征
攻击者使用ASCII逐字符提取技术,通过判断每个位置字符的ASCII值来获取flag
这种技术是典型的基于响应的SQL盲注攻击
攻击者通过盲注技术获取了存储在数据库表 t 中的flag字段内容。
flag{w1reshARK_ez_1sntit}
3.Misc
[BJDCTF 2020]鸡你太美
#编码分析 #脚本编写 #GIF提取

这个gif文件没有正确显示。文件头修复:

NSSCTF{zhi-yin-you-are-beautiful}
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
[BJDCTF 2020]base??
#Base家族 #古典密码 #其他
dict:{0: ‘J’, 1: ‘K’, 2: ‘L’, 3: ‘M’, 4: ‘N’, 5: ‘O’, 6: ‘x’, 7: ‘y’, 8: ‘U’, 9: ‘V’, 10: ‘z’, 11: ‘A’, 12: ‘B’, 13: ‘C’, 14: ‘D’, 15: ‘E’, 16: ‘F’, 17: ‘G’, 18: ‘H’, 19: ‘7’, 20: ‘8’, 21: ‘9’, 22: ‘P’, 23: ‘Q’, 24: ‘I’, 25: ‘a’, 26: ‘b’, 27: ‘c’, 28: ‘d’, 29: ‘e’, 30: ‘f’, 31: ‘g’, 32: ‘h’, 33: ‘i’, 34: ‘j’, 35: ‘k’, 36: ‘l’, 37: ‘m’, 38: ‘W’, 39: ‘X’, 40: ‘Y’, 41: ‘Z’, 42: ‘0’, 43: ‘1’, 44: ‘2’, 45: ‘3’, 46: ‘4’, 47: ‘5’, 48: ‘6’, 49: ‘R’, 50: ‘S’, 51: ‘T’, 52: ‘n’, 53: ‘o’, 54: ‘p’, 55: ‘q’, 56: ‘r’, 57: ‘s’, 58: ‘t’, 59: ‘u’, 60: ‘v’, 61: ‘w’, 62: ‘+’, 63: ‘/‘, 64: ‘=’}
chipertext:
FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw
1 | #!/usr/bin/env python3 |
BJD{D0_Y0u_kNoW_Th1s_b4se_map}
2.Web
[SWPUCTF 2021 新生赛]easy_md5 lamaper
#弱比较 #PHP #数组绕过
既要两变量个值不相同,又要两个变量md5值一样。
可以发现此时判断md5值是否一样用的是==,这是php的弱类型比较,
方法一: 可以使用带0e开头的数字穿进行传递参数,因为php会将0e开头的数字转化为0,故此时md5值相等,而两个变量值不相等;
方法二: 可以传递数组,如name[]=123,password[]=456,md5不能加密数组,故两个md5返回的都是null
另:若遇到===这样的强类型比较,方法一就失效了,方法二仍然有效,或者还可以使用软件fastcoll进行md5碰撞,生成两个字符串使得他们的md5值相同
3.Misc
[SWPUCTF 2021 新生赛]gif好像有点大
#GIF #提取二维码 #图片隐写
纯找。

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}

