逆向实践之Evr_Q_HCTF2017

题目链接: https://pan.baidu.com/s/1slC2wcl 密码: nmug

题目分析:一道比较简单的题目,需要解决使用IDA的F5时的小问题,之后分析实现流程有四部分构成,因为是一位操作后对应一位,可以直接进行爆破,获取答案。

解决方案:

逆向实践之Evr_Q_HCTF2017_第1张图片

题后思考:

官方wp 中表述为交换位的操作,其一为将0b10101010位与0b01010101位互换。实现的方式是:

v1 = (a[i] & 0xAA) >> 1

v2 = (a[i] << 1) & 0x55

enc_t[i] = v1 | v2

而对应的解密方案为:


逆向实践之Evr_Q_HCTF2017_第2张图片

这样的问题都是基于位操作进行的,决定总结一些关于位操作的知识:

1、或

常用于设置某一位为1,而保证其它的位不变。比如:result |= (1<<12)将设置result的第12位为1;

或者给某个位属性值附加上另一个属性值,比如:result |= exp,位标记一定的信息。

2、与

常用于设置某一位为0,而保证其它的位不变。比如:result &= ~(1<<12)将设置result的第12为0;

或者获得某个属性的某一位或某几位。比如:result & 3 将获得result的最低的两位;

测试某个属性是否等于或包含特定的值,比如if(result & exp)

3、异或

将某一特定位取反(~),而保证其它的位不变。比如:result ^= (1<<12)将result的第12位取反。

也常用于数据清零,比如:result ^= reslut

4、左移

<<:按位左移操作符,exp << n;将容器中的所有位向左移n位,空出的位用0填补。乘2的m次方

5、右移

>>:按位右移操作符,exp >> n;将容器中的所有位向右移n位,空出的位用0填补。除以2的m次方

a >> 31,对于一个32位的有符号int,即为获取其符号位,判断正负号

高低位字节交换:a = (a >> 8) | (a << 8)

取x的奇数位并将偶数位用0填充用代码实现就是x & 0xAAAA

取x的偶数位并将奇数位用0填充用代码实现就是x & 0x5555

奇偶位上数据交换:x = ((x & 0xAAAA) >> 1) | ((x & 0x5555) << 1)

0xCCCC,0xF0F0,0xFF00

例如同场赛题re_level2_ez_crackme(该题主要模拟了一个汇编解释,需要将其转变为高级语言进行反推)中包含的一项:out[i]=((out[i]&0x1f)<<3)+((out[i+1]&0xe0)>>5)的作用就是整体循环左移3位。其中可以注意到0x1f+0xe0=0xff,0x1f<<3+0xe0>>5=0xff;取前一个字符的五位左移3位作头,后一个字符的前三位作尾。

复原的方式:out[i]=((out[i]&0x1f)<<3)+((out[i+1]&0xe0)>>5)

x+y=x-~y-1=(x|y)+(x&y);

x-y=x+~y+1=(x|~y)-(~x&y);

x^y=(x|y)-(x&y);

-a= ~a + 1

参考文章:你必须知道的简单的位操作技巧 与 高级位操作技巧

位操作用途特征与技巧

注:针对需要快速解答并暴力破解可行的题型,可以考虑暴力破解



题目的设计思路中提到了TLS+SMC(Self-Modifying Code)反调试在静态分析下没有大影响。

你可能感兴趣的:(逆向实践之Evr_Q_HCTF2017)