Reversing-x64Elf-100
开始分析
64位ida打开文件
shift f12 跟踪字符串
找到主函数入口
f5反编译
逻辑分析
signed __int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
signed __int64 result; // rax@3__int64 v4; // rcx@6char s; // [sp+0h] [bp-110h]@1__int64 v6; // [sp+108h] [bp-8h]@1v6 = *MK_FP(__FS__, 40LL);printf("Enter the password: ", a2, a3);if ( fgets(&s, 255, stdin) ){
if ( (unsigned int)check((__int64)&s) ){
puts("Incorrect password!");result = 1LL;}else{
puts("Nice!");result = 0LL;}}else{
result = 0LL;}v4 = *MK_FP(__FS__, 40LL) ^ v6;return result;
}
程序从键盘输入流(stdin)中获得数据传给s
再通过check函数检测密码是否正确
分析check函数
signed __int64 __fastcall sub_4006FD(__int64 a1)
{
signed int i; // [sp+14h] [bp-24h]@1const char *v3; // [sp+18h] [bp-20h]@1const char *v4; // [sp+20h] [bp-18h]@1const char *v5; // [sp+28h] [bp-10h]@1v3 = "Dufhbmf";v4 = "pG`imos";v5 = "ewUglpt";for ( i = 0; i <= 11; ++i ){
if ( (&v3)[8 * (i % 3)][2 * (i / 3)] - *(_BYTE *)(i + a1) != 1 )return 1LL;}return 0LL;
}
技巧:这三个字符串看似是独立的
可是后面却用了一个二维数组的方式来访问
(&v3)[8 * (i % 3)][2 * (i / 3)]
&v3取第一个指针的引用相当于一个指针的指针
(&v3)[8*(i%3)]
等同于*(v3+8*(i%3))
等同于v3[i%3]
因此
判断语句等同于
v3[i%3][2*(i/3)] - a1[i] != 1
反向解密脚本
array=["Dufhbmf","pG`imos","ewUglpt"]
s=""
for i in range(0,12,1):s+=chr(ord(array[i%3][2*(i//3)])-1)print(s)