常见混淆逆向做题 做题 [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 ; 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='' )
其中提示给的“#”就是输入的第一个字符,知道后就可以倒退。