攻防世界-逆向

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值