比赛看起来奖品还可以,但是没想到题目很鸡肋。

Binary Exploitation

!Underflow

比新生赛还新生的签到题

jumPIEng

开启了pie保护

​

但是程序打印出了main函数的地址,保护和没开一样,接下来让我们输入一个地址,并且会跳转到该地址上。

继续看ida发现了后门

我们只需要根据偏移计算出该函数的准确地址即可跳转成功。

Running Out of Time

题目描述是一个逆向题

开始是生成了一个随机数,我们需要输入这个随机数才能进入p3xr9q_t1zz函数

分析下p3xr9q_t1zz函数发现

其实就是一个简单的xor,

我们直接无视前面的随机数绕过即可。

# 已知的加密密钥
v2 = 42

# 已知的加密输出(假设这是加密后的结果)
encrypted_output = [
    29, 27, 71, 25, 117, 31, 29, 26, 90, 90, 25, 78
]

# 解密过程
decrypted_output = [encrypted_output[i] ^ v2 for i in range(len(encrypted_output))]

# 将解密后的结果转换为字符串
decrypted_string = ''.join(chr(byte) for byte in decrypted_output)

# 打印解密结果
print("解密后的字符串为:")
print(decrypted_string)
#解密后的字符串为:
#71m3_570pp3d


总结:⑩中⑩

Reverse

Significance of Reversing

给了一个图片,根据命名用010打开,果然发现了问题

文件的16进制数据被反向排序了

写脚本逆过来即可

def swap_bytes(input_file, output_file):
    with open(input_file, 'rb') as f:
        data = f.read()

    # 将数据转换为十六进制字符串
    hex_data = data.hex()

    # 每8位一组分割
    byte_pairs = [hex_data[i:i + 2] for i in range(0, len(hex_data), 2)]

    swapped_pairs = []
    for i in range(len(byte_pairs)-1,0,-1):
        swapped_pairs.append(byte_pairs[i])

    swapped_hex_data = ''.join(swapped_pairs)

    # 将新的十六进制字符串转换为二进制
    swapped_binary_data = bytes.fromhex(swapped_hex_data)

    # 写入到输出文件
    with open(output_file, 'wb') as f:
        f.write(swapped_binary_data)
input_file = './Reverseme.png'  # 替换为你的输入文件名
output_file = 'output.bin'  # 替换为你的输出文件名
swap_bytes(input_file, output_file)

变换规则:

*a1 = (*a1 + 14) % 94 + 33

  • 可打印ASCII范围是33(!)到126(~),共94个字符。
  • (*a1 + 14)是将字符向前移位14个位置。
  • % 94确保结果在94个字符的范围内循环。
  • + 33将结果映射回33到126的范围。

实际上是一个ROT47的变种。标准的ROT47会在33到126之间循环移位47位,而这里是移位14位。

# 定义rot47_decrypt函数,模拟C代码中的解密逻辑
def rot47_decrypt(s):
    # 将字符串转换为字节数组以便修改
    result = list(s)
    i = 0
    while i < len(result):
        # 获取当前字符的ASCII值
        char_code = ord(result[i])
        # 如果是空字符(\0),停止处理
        if char_code == 0:
            break
        # 如果字符大于32且不是127,进行变换
        if char_code > 32 and char_code != 127:
            # 应用变换:(*a1 + 14) % 94 + 33
            new_code = (char_code + 14) % 94 + 33
            result[i] = chr(new_code)
        i += 1
    # 返回修改后的字符串
    return ''.join(result)

# 主函数逻辑,模拟C代码中的main函数
def main():
    # 初始化字符数组(用Python字符串模拟)
    v4 = ['\0'] * 25  # v4有25字节,初始填充空字符
    _19 = "prtr%u"   # _19直接赋值为"prtr%u"

    # 模拟strcpy操作
    v4[0:17] = list("=<0c3_Ff0CbGbCdbN")  # 前17个字符
    v4[18:24] = list("LHb0fc")             # 从索引18开始的6个字符
    v4_str = ''.join(v4[:17])              # v4的前部分
    v4_18_str = ''.join(v4[18:24])         # v4从18开始的部分

    # 对三个字符串进行解密
    decrypted_19 = rot47_decrypt(_19)
    decrypted_v4_18 = rot47_decrypt(v4_18_str)
    decrypted_v4 = rot47_decrypt(v4_str)

    # 拼接并打印结果
    final_string = decrypted_19 + decrypted_v4_18 + decrypted_v4
    print(f"\n解密后的字符串: {final_string}\n")

# 运行主函数
if __name__ == "__main__":
    main()
#解密后的字符串: ACECTF{w3_74lk_4b0u7_r3v3r53}