解题思路
前言:签到题
#include <iostream>
int main()
{
char input[] = “moectf{?????????????????????????????????}"; // 这是假的flag
char password_enc[] = {
123, 121, 115, 117, 98, 112, 109, 100, 37, 96, 37, 100, 101, 37, 73, 39,
101, 73, 119, 73, 122, 121, 120, 113, 73, 122, 121, 120, 113, 73, 97, 119,
111, 73, 98, 121, 73, 115, 110, 102, 122, 121, 100, 115, 107, 22 };
// password_enc的每一位和22进行异或, 就能得到真实的密码
for (int i = 0; i < 46; i++) { // 46是 input的长度,也是flag的长度!
if ((input[i] ^ 22) != password_enc[i]) {
printf("Password is wrong!\n");
exit(0);
}
}
printf("Password is right!\n");
return 0;
}
#include <iostream>
int main()
{
char password_enc[] = {
123, 121, 115, 117, 98, 112, 109, 100, 37, 96, 37, 100, 101, 37, 73, 39,
101, 73, 119, 73, 122, 121, 120, 113, 73, 122, 121, 120, 113, 73, 97, 119,
111, 73, 98, 121, 73, 115, 110, 102, 122, 121, 100, 115, 107, 22 };
for (int i = 0; i < 46; i++) {
flag[i]=password_enc[] ^ 22;
}
for (int i = 0; i < 46; i++) {
printf("%c",flag[i]);
}
return 0;
}
一、easyre
1、先:由exeinfope可知:为64位无壳。
2、放入IDA64:==SHIFT + F12”==快捷键打开程序的字符串调用窗口,点击flag
可的到答案flag{this_Is_a_EaSyRe}
二、reverse_1
前提:strncmp函数为字符串比较函数 ,功能是将str1和str2进行比较,最多比较n个字节。若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
1、先:由exeinfope可知:为64位无壳。
2、放入IDA64:==SHIFT + F12”==快捷键打开程序的字符串调用窗口,Ctrl+x查看是哪段函数调用了该字符串(查看汇编代码),按“F5”查看伪C代码
if ( !strncmp(Str1, Str2, v5) )
printf("this is the right flag!\n");
else
printf("wrong flag\n");
if ( Str2[j] == 'o' )
Str2[j] = '0';
strncmp(str1,str2,v3)是把str1与str2两字符串的前v3位数做一个比较,若str1=str2,返回0;大于返回正数,小于返回负数
if(!strncmp(str1,str2,v3))是一个判断语句,if()括号里面的内容如果为真,则输出"this is the right flag",这时我们只需要知道什么情况为真。
点击str2:{hello_world}:由上得{hell0_w0rld}
可的到答案{hell0_w0rld}
三、xor
前提:异或
1、先:由exeinfope可知:为64位无壳。
2、放入IDA64:==SHIFT + F12”==快捷键打开程序的字符串调用窗口,Ctrl+x查看是哪段函数调用了该字符串(查看汇编代码),,按“F5”查看伪C代码
if ( !strncmp(num, global, 0x21uLL) )
点击global 在双击aFKWOXZUPFVMDGH 在Shift+E提取16进制
unsigned char aFKWOXZUPFVMDGH[] =
{
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
};
进入C语言:
#include <stdio.h>
int main()
{
unsigned char aFKWOXZUPFVMDGH[] =
{
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
};
unsigned char flag[35] = { 'f' };
for (int i = 1; i < 33; i++) {
flag[i] = aFKWOXZUPFVMDGH[i]^aFKWOXZUPFVMDGH[i - 1];
}
for (int i = 1; i < 33; i++) {
printf("%c", flag[i]);
}
return 0;
}
结果:flag{QianQiuWanDai_YiTongJiangHu}