试了一下,运行结果如红框所示,第一反应是HBO的编剧也是蛮拼的。。。
这是一段花式输出字符串的程序,源代码被黑科技玩坏了
原理其实很简单,我们注意到代码中有个特别的 magic number 是65,没错,那就是ASCII 表里的 A,前面那一堆不过是在叠加偏移量,以此来实现输出。
具体地说,偏移量的计算是用 0x1FULL 这个无符号长整型常量作为掩码(二进制表示为 11111),从低位开始每次从
0x79481E6BBCC01223 + ((dcf_t)0x1222DC << 64)
这个大整数中取出 5 位,所取出的 5 位二进制表示即为偏移量。
我们用同样的 trick 可以输出任意想要的字符串。比如:
#include <stdio.h> #include <stdlib.h> typedef unsigned long u64; typedef void enc_cfg_t; typedef int enc_cfg2_t; typedef __int128_t dcf_t; enc_cfg_t _ctx_iface(dcf_t s, enc_cfg2_t i){ int c = (((s & ((dcf_t)0x1FULL << i * 5)) >> i * 5) + 65); printf("%c", c);} enc_cfg2_t main() { for (int i=0; i<10; i++){ _ctx_iface(0x28EC789572FC8 + ((dcf_t)0x000000 << 64), i); } }
将得到:
摸清了套路,我们也成了老司机,甚至可以写一段程序来生成这段看起来很黑科技的代码。
gen.c
#include <stdio.h> #include <string.h> #define MAX_LEN 25 // 128 的位整数最多用此方法可以存放25个字符 const char *text = "#include <stdio.h>
#include <stdlib.h>
typedef unsigned long u64;
typedef void enc_cfg_t;
typedef int enc_cfg2_t;
typedef __int128_t dcf_t;
enc_cfg_t _ctx_iface(dcf_t s, enc_cfg2_t i){
int c = (((s & ((dcf_t)0x1FULL << i * 5)) >> i * 5) + 65);
printf("%%c", c);}
enc_cfg2_t main() {
for (int i=0; i<%d; i++){
_ctx_iface(0x%llX + ((dcf_t)0x%X << 64), i);
}
}
"; int main() { char input[MAX_LEN]; memset(input, 0x00, sizeof(char)*MAX_LEN); if (fgets(input, MAX_LEN, stdin) == NULL) { printf("fail to read input
"); return -1; } unsigned long long mask1 = 0; __int128_t mask2 = 0; int i; for (i = 0; input[i] != '
' && i < MAX_LEN; i++) { if (i < 12) { mask1 |= (unsigned long long)(((input[i] - 'A') & 0x1F)) << i*5; } else if (i == 12) { mask1 |= (unsigned long long)(((input[i] - 'A') & 0xF)) << i*5; mask2 |= ((input[i] - 'A') & 0x10) >> 4; }else{ mask2 |= (unsigned long long)(((input[i] - 'A') & 0x1F)) << (i-13)*5+1; } } printf(text, i, mask1, mask2); }
现在用这段程序,我们可以随意发挥了