题目地址:https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5074&page=1
工具: ida pro、python环境
知识:简单的算法分析,简单的脚本编写
方法一、
玩游戏,依次按12345678后出现flag
done!!! the flag is zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
方法二、
用ida打开文件,64位打不开就用32位
打开后shift+F12,alt+T查找flag
点击确定后,就直接定位到这句话所在的函数
for ( i = 0; i < 56; ++i )
{
*(&v2 + i) ^= *(&v59 + i);//按位异或运算符 两个操作数中,如果两个相应位相同,则结果为0,否则为1 &v2表示v2取地址
*(&v2 + i) ^= 0x13u;// 其实就是 *(&v2 + i) =*(&v2 + i) ^ 0x13u; //u表示无符号 十六进制13 转化为 十进制是19
}
return sub_45A7BE("%s\n");
}
// 1111 15
// 1110 14
// 0001 1
// 15^14=1 异或
粘贴到word中,用word取出V后面的值 V2~V58,把分号替换为逗号,
若要把这些数字变成一行:
将V2~V58中的值取出
123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0
将V59~V115中的值取出
18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32, 49, 32, 1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32, 16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0
tips : word中删除一列文字
word怎么选中删除 在word怎样选中删去一列文字
按住alt键,按住鼠标左键拖动选择要删除的部分并删除
写python脚本,计算异或
a=[123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]
b=[ 18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32, 49, 32, 1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32, 16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]
for i in range(57): # 57次循环 0~56 前包后不包
a[i]=a[i]^b[i]
a[i]=a[i]^19
print(chr(a[i]),end='') #转化为字符类型,不想让他换行后面加end=''
得到flag: zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}