猫头鹰
信安舆情早知道

逆向分析:面试Tencent的简单笔试题

1

0x01 算法表达式总结

str2=(str1[i+1]>>2&0x1f|((str1&0x7)<<2))^0x15;

0x02 简单分析步骤:

首先查了下壳,发现查壳类型不同,疑为自写壳。

2

运行程序查看程序行为:

3

大致推断为通过用户名校验密码用调试器进行分析

0x03 调试器分析步骤

通过对用户名下内存断点,进行断点跟踪

4 5

通过内存断点跟踪找到内存地址为 0040741E算法起始部分

6 7

在IDA中的显示以及反编译代码

通过对整个程序段分析知道:

  • 首先对输入的用户名字符串尾部追加一个首字符
  • 之后对该字符串分组,分组方式为字符串中每个字符都与他后面的字符组成一
    个分组
  • 对该分组中的每一个字符处理,处理方式为:
  1. 对第二个字符HEX进行算术右移2位得到的值与0x1F 逻辑与运算得到
    值1
  2. 第一个字符HEX值 与0x7 逻辑与 得到的值 再进行算术左移2位的得到
    的值再与上文值1进行逻辑或运算 得到的值再与0x15进行逻辑异或运算得到
    的值的DEC为 当前分组在密码表中对应的字符

密码表为:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMTVMPROTECT310

8

算法代码

include <stdio.h>

include <string.h>

int main()
{
char str1[20]={0};
char str2[20]={0};
char str3[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMTVMPROTECT310";
int len=0,flag=0;
printf("请输入用户名");
scanf("%s",str1);
len=strlen(str1);
for(int i=0;i<len;i++)
{
if(i==len-1)
{
str2=(str1[0]>>2&0x1f|((str1&0x7)<<2))^0x15;/(((str1[0]>>2)&0x1f)|(str1&0x7<<2))^0x15;/
}
else
{
str2=(str1[i+1]>>2&0x1f|((str1&0x7)<<2))^0x15;/(((str1[0]>>2)&0x1f)|(str1&0x7<<2))^0x15;/
}
}
for(i=0;i<len;i++)
{
printf("%c",str3[str2]);
}
printf("\n");
return 0;
}

 

 

*来源:90sec  Mottoin小编整理发布

转载请注明来自MottoIN,未经允许不得转载!MottoIN » 逆向分析:面试Tencent的简单笔试题

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

MottoIN 换一个角度看安全

寻求报道联系我们