1、easyre
考点:IDA工具使用
shift+f12直接得到flag
2、reverse1
X64架构;比较用户输入的flag
for (j = 0; ; ++j)
{
v8 = j;
v2 = j_strlen(Str2);
if (v8 > v2)
break;
if (Str2[j] == 111)#将str2中的'o'替换为'0'
Str2[j] = 48;
}
sub_1400111D1("input the flag:");
sub_14001128F("%20s", &Str1);#将用户输入的信息存放在str1中
v3 = j_strlen(Str2);
if ( !strncmp(&Str1, Str2, v3) )#如果str2=str1;提示正确的flag
sub_1400111D1("this is the right flag!\n");#说明str2为正确flag
}
找到str2存储的信息将’o’替换为’0’
3、reverse2
{
for ( i = 0; i <= strlen(&flag); ++i )
{
if ( *(&flag + i) == 105 || *(&flag + i) == 114 )
*(&flag + i) = 49;#将flag中的i r 替换为1
}
}
printf("input the flag:", argv);
__isoc99_scanf("%20s", &s2);
if ( !strcmp(&flag, &s2) )
result = puts("this is the right flag!");
else
result = puts("wrong flag!");
return result;
}
将flag中的i r 替换为1
4、内涵的软件
考点:熟悉IDA;shift+f12直接得到flag
5、 新年快乐
1、发现程序加了UPX 3.9.1的壳;脱壳(手动脱壳)
upx -d xx.exe
2、X32程序
strcpy(&v4, "HappyNewYear!");#将字符串复制到v4内存地址
v5 = 0;
memset(&v6, 0, 0x1Eu);#将v6前30个字节设置为0
printf("please input the true flag:");
scanf("%s", &v5);#用户输入的信息存储到v5中
if ( !strncmp((const char *)&v5, &v4, strlen(&v4)) )#比较v4与v5;说明v4就是flag
result = puts("this is true flag!");
else
result = puts("wrong!");
return result;
}
6、xor
v3 = (char *)256;
printf("Input your flag:\n", 0LL);
get_line(v6, 256LL);#将用户输入的值存储在v6中
if ( strlen(v6) != 33 )#检查v6的长度
goto LABEL_12;
for ( i = 1; i < 33; ++i )#遍历字符
v6[i] ^= v6[i - 1];#将当前字符与前一个字符异或
v3 = global;
if ( !strncmp(v6, global, 0x21uLL) )#比较v6和v3的值
printf("Success", v3);
else
LABEL_12:
printf("Failed", v3);
思路:比较v3与v6的值;v6的值进行了异或处理;找到v3的值逆向还原就是正确flag
#exp
ida_chars = [
0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
0x47, 0x32, 0x4F, 0x00
]
v6 = ida_chars.copy()
original = [0] * 33
original[0] = v6[0]
for i in range(1, 33):
original[i] = v6[i] ^ v6[i - 1]
print("".join(chr(x) for x in original))
7、reverse3
题目:
sub_41132F("please enter the flag:");
sub_411375("%20s", &Str);#str存储用户输入
v0 = j_strlen(&Str);#length
v1 = (const char *)sub_4110BE(&Str, v0, &v11);#调用函数修改str
strncpy(Dest, v1, 0x28u);#将v1复制到Dest数组中
v8 = j_strlen(Dest);#length
for ( j = 0; j < v8; ++j )#对每个字符ASCII值加上自己的索引j
Dest[j] += j;
v2 = j_strlen(Dest);
if ( !strncmp(Dest, Str2, v2) )#比较str2与Dest操作
sub_41132F("rigth flag!\n");
else
sub_41132F("wrong flag!\n");
}
思路:就是将str2中的元素的ASCII减去自己的索引J;然后通过sub_4110BE函数还原;跟进sub_4110BE发现是base64编码
import base64
s = [101, 51, 110, 105, 102, 73, 72, 57, 98, 95, 67, 64, 110, 64,