这道题比较简单
下载附件,在Linux中运行。
发现直接输出一串字符,再次运行,输出一串不同的字符串,重复操作,发现每次的输出都不相同。
将文件拖入IDA中反汇编。
v50 = __readgsdword(0x14u); s = 83; v11 = 69; v12 = 67; v13 = 67; v14 = 79; v15 = 78; v16 = 123; v17 = 87; v18 = 101; v19 = 108; v20 = 99; v21 = 111; v22 = 109; v23 = 101; v24 = 32; v25 = 116; v26 = 111; v27 = 32; v28 = 116; v29 = 104; v30 = 101; v31 = 32; v32 = 83; v33 = 69; v34 = 67; v35 = 67; v36 = 79; v37 = 78; v38 = 32; v39 = 50; v40 = 48; v41 = 49; v42 = 52; v43 = 32; v44 = 67; v45 = 84; v46 = 70; v47 = 33; v48 = 125; v49 = 0; v3 = time(0); v4 = getpid(); srand(v3 + v4); for ( i = 0; i <= 99; ++i ) { v5 = rand() % 0x28u; v6 = rand() % 0x28u; v7 = *(&s + v5); *(&s + v5) = *(&s + v6); *(&s + v6) = v7; } puts(&s); return 0; }
分析上部关键代码,发现程序根据时间和进程识别,提供的生成伪随机数序列的种子。
利用随机数对字符串进行随机的交换。
至此发现了一个问题,既然为随机交换字符串,那为何多次运行输出的字符串,长度也不尽相同。
分析发现 v5 和 v7 不一定在字符长度的范围内,则在对 v5 和 v7 下标的字符进行交换时,可能会将空字符串置换进字符串,这样会导致字符串的长度缩减。
编写python脚本
s = [83, 69, 67, 67, 79, 78, 123, 87, 101, 108, 99, 111, 109, 101, 32, 116, 111, 32, 116, 104, 101, 32, 83, 69, 67, 67, 79, 78, 32, 50, 48, 49, 52, 32, 67, 84, 70, 33, 125, 0] flag = ‘‘ for i in s: flag += chr(i) print(flag)
输出:SECCON{Welcome to the SECCON 2014 CTF!}
解题结束!
原文:https://www.cnblogs.com/MuZiShiYe/p/11041469.html