xor
下载文件后用ida打开,查看伪代码,分析可得该程序需要用户输入一串字符,然年后令该字符的第i位与第i-1位进行异或,异或后的结果与global对应的字符串进行比较,故该题的flag需要我们逆向异或(即从最后一位开始向前异或)后正向输出
跟进global得到字符串后转化为十进制数
编写程序并运行得到结果
Reverse 3:
先查壳
32位可执行文件,无壳,拖到ida32分析
跟踪sub_41110BE发现从键盘读入的字符串经过了base64加密,加密后再经过一个循环,得到的字符串与Str相同,跟踪进Str2字符串
因此要得到flag,需要反向设计循环后base64解密,编写代码和运行结果如下:
将该字符串拉去base64解码工具解码得到flag
不一样的flag:
查壳:
32位,无壳,拖到ida里分析
经分析大概意思是我们输入的每一个数字都代表向一个方向移动,如果是移动到了“1”的话就直接退出了,如果移动到了“#”的话就算我们输入的flag是 正确的,即视为通关。这是一个迷宫的地图,根据他给出的一串数字"*11110100001010000101111#",可以得出“*”是迷宫的起点,“#”是迷宫的终点,中间只能经过0,不能经过1.由后面判断语句 v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == '#'中的“5*”可以推出迷宫图有5列,每一行都有相同数量的数字,故只有一种排列方法如下:
为什么说“5*”就代表有五列呢?因为数字在数组中是线性排列的,也就是说这个迷宫图数字对应在数组中的位次是如下:
每上下两数字之差为5,而*(_DWORD *)&v3[25]代表的是上下移动,每次上下移动对应原来的数组位次加5,故5**(_DWORD *)&v3[25]代表上下移动次数。综上5 * *(_DWORD *)&v3[25]+v4代表的是操作后的位置。最外面是一个大循环,故每一次循环都执行一次操作。v7[]里面为什么要减41?我们进行调试操作,用F8往下走直到走到输入函数那里,随便输入一个数字后双击伪代码中的v7查看v7地址
后两位F0对应十进制为240,计算240-41为199,199对应的十六进制数是C7,往上查找到C7,
C7存储的字符是“*”正好是迷宫图起点,因此V7数组相比V3数组偏移41,故要在V7[]里面减41.回到迷宫图,所以我们的flag正是在不踩到“1”的情况下走到#的路线所对应的数字。
路线为下下下右右上上右右下下下,对应的数字为“222441144222”,所以flag{222441144222}