常见混淆逆向做题

做题

[RoarCTF 2019]polyre

OLLVM控制流平坦化。用IDA的D-810进行恢复,配置使用default_unflattening_ollvm.json,然后Load。IDA的F5一般直接从缓存里找,可以选择随便NOP一句再撤销,再F5。发现为奇怪的加密。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstdio>
using namespace std;
unsigned long long int enc[7]={
0xBC8FF26D43536296, 0x520100780530EE16, 0x4DC0B5EA935F08EC, 0x342B90AFD853F450,
0x8B250EBCAA2C3681, 0x55759F81A2C68AE4, 0xB0004B7679FA26B3
};
unsigned long long int flag[7];
signed long long int tmp;
int main(void){
for(register int i=0;i<7;i++){
for(register int j=0;j<64;j++){
if(enc[i]&0x01==1)
enc[i]=((enc[i]^0xB0004B7679FA26B3)>>1)|0x8000000000000000;//这句易错:左移运算后要恢复符号位为1
else
enc[i]=enc[i]>>1;
};
flag[i]=enc[i];
};
for(register int i=0;i<7;i++)
printf("%llx\n",flag[i]);
return 0;
};

[SUCTF 2018 招新赛]HelloPython

用onelinerizer混淆严重的一个Python2.7的程序,大体阅读发现是TEA加密,delta和key能在程序中找到,密文在题面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <cstdio>
using namespace std;
const unsigned int key[4]={3735928559, 590558003, 19088743, 4275878552},delta=2654435769;
unsigned int enc[2]={0xf1f5d29b ,0x6e4414ec};
void TEA_decrypt(unsigned int enc1,unsigned int enc2){
unsigned int v0=enc1,v1=enc2,sum=32*delta;
for(int i=0;i<32;i++){
v1-=((((v0<<4)+key[2])^(v0+sum)^((v0>>5)+key[3])));
v0-=((((v1<<4)+key[0])^(v1+sum)^((v1>>5)+key[1])));
sum-=delta;
};
printf("NSSCTF{0x%8x_0x%8x}",v0,v1);
return;
};
int main(void){
for(int i=0;i<2;i+=2)
TEA_decrypt(enc[i],enc[i+1]);
return 0;
};

[suctf 2019]hardcpp

经典控制流平坦化,用D-810解决。输出了个MD5提示,去网上解出来是“#”的MD5。

一堆Lambda表达式,直接硬杠然后写exp:

1
2
3
4
5
6
enc=[0xF3,0x2E,0x18,0x36,0xE1,0x4C,0x22,0xD1,0xF9,0x8C,0x40,0x76,0xF4,0x0E,0x00,0x05,0xA3,0x90,0x0E,0xA5]
flag='#'
for i in range(1,21):
tmp=((enc[i-1]^((ord(flag[i-1])^18)*3+2))-(ord(flag[i-1])%7))&0xFF
flag+=chr(tmp)
print(chr(tmp),end='')

其中提示给的“#”就是输入的第一个字符,知道后就可以倒退。