ACECTF1.0部分题解
ACECTF1.0
比赛看起来奖品还可以,但是没想到题目很鸡肋。
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}