Reversing-x64Elf-100
打开IDA
进入主函数
F5 反编译
发现了‘’输入密码‘’ “密码错误” “nice”
我们记住如果if成立 那么就返回密码错误 如果不成立 就返回 nice
其中有一个if语句 双击 sub_4006FD
进入判断函数语句
发现有3个带有字符串的变量
我们进行分析
v3 = "Dufhbmf";
v4 = "pG`imos";
v5 = "ewUglpt";
# 第一眼看是有3个变量 先待定
for ( i = 0; i <= 11; ++i )
# 循环12次 每一次都i加1
{
if ( (&v3)[i % 3][2 * (i / 3)] - *(char *)(i + a1) != 1 )
#关键!!!!!!!!!!!!!!!!!
#我们看到他 &v3 == 引用了v3 然后在v3[][] 很直观的看出来是二维数组
#说明前面的v3v4v5不是三个变量 而是v3[][]=['Dufhbmf','pG`imos','ewUglpt']
#然后我们假设i = 1
#v3[1%3][2*1%3]==v3[1][2]意思就是取出一个字符串
#然后- *(char *)(i + a1) 的意思是 a1为主函数的 我们认为他是用户输入的
#所以就是用户输入输入取下一个字符和字符串比较
#如果if(x=!1) 则输出1 linux中 为正确 所以会输出密码错误
#我们需要输出 0 那么就是
#&v3)[i % 3][2 * (i / 3)] - flag = 1
#flag = &v3)[i % 3][2 * (i / 3)] -1
return 1LL;
}
return 0LL;
}
我们开始编写exp
v3=['Dufhbmf','pG`imos','ewUglpt'] #二维数组变为py程序
flag =''
for i in range(12):#循环12次
flag+=chr(ord(v3[i % 3][2 * int(i / 3)])-1)
#将我们刚刚分析的编写
print(flag)
得到flag Code_Talkers
666
下载解压文件
放入
我们查看主函数进行审计
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [rsp+0h] [rbp-1E0h]
char v5; // [rsp+F0h] [rbp-F0h]
memset(&s, 0, 0x1EuLL);
printf("Please Input Key: ", 0LL);
__isoc99_scanf("%s", &v5);
encode(&v5, &s);
if ( strlen(&v5) == key )
{
if ( !strcmp(&s, enflag) )
puts("You are Right");
else
puts("flag{This_1s_f4cker_flag}");
}
return 0;
}
我们发现you are right 我们发现key 是比较的我们先找key
双击key 发现
12H 十六进制的 我们转换一下就是18
所以
key=18
然后我们发现要经过下一个if语句才能返回you are right
我们双击enflag发现enflag的值
enflag = 'izwhroz""w"v.K".Ni'
我们发现在左侧的函数这边有一个函数叫 encode 我们点击
int __fastcall encode(const char *a1, __int64 a2)
{
char v3[32]; // [rsp+10h] [rbp-70h]
char v4[32]; // [rsp+30h] [rbp-50h]
char v5[40]; // [rsp+50h] [rbp-30h]
int v6; // [rsp+78h] [rbp-8h]
int i; // [rsp+7Ch] [rbp-4h]
i = 0;
v6 = 0;
if ( strlen(a1) != key )
return puts("Your Length is Wrong");
for ( i = 0; i < key; i += 3 )
{
v5[i] = key ^ (a1[i] + 6);
v4[i + 1] = (a1[i + 1] - 6) ^ key;
v3[i + 2] = a1[i + 2] ^ 6 ^ key;
*(_BYTE *)(a2 + i) = v5[i];
*(_BYTE *)(a2 + i + 1LL) = v4[i + 1];
*(_BYTE *)(a2 + i + 2LL) = v3[i + 2];
}
return a2;
}
出现了函数
我们只需要写出下面的if语句就可以得到a2
我们进行exp
en = 'izwhroz""w"v.K".Ni'
flag = ''
key = 18
for i in range(0,18,3):
flag+=chr((ord(en[i])^key)-6)
#在这里面 因为 ^的优先级比-小 所以要用()先运算
flag+=chr((ord(en[i+1])^key)+6)
flag+=chr((ord(en[i+2])^key)^6)
print(flag)
^是对字符串进行与计算
print(10^3)
9
10 = 1010
3 = 0011
按位异或即为对应的二进制位相异时,数值为1,相同则为0
10 = 1010
3 = 0011
10^3 = 1001 = 9
所以10^3的结果为9
easyRE1
下载解压
1.改后缀
改为txt直接搜索flag 将flag小写然后加上{}
2.正常
有两个文件 我们随便放入一个到IDA中
直接快捷键 SHIFT +F12
shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置
出现flag
lucknum
解压放入 主函数F5反编译得到flag