黄昏時に…
バイナリ(decompile)
undefined8 main(void)
{
uint res;
size_t len;
long in_FS_OFFSET;
int i;
code *func [2];
char input [40];
long local_20;
local_20 = *(long *)(in_FS_OFFSET + 0x28);
printf("Enter the flag: ");
__isoc99_scanf(&DAT_00102015,input);
func[0] = a;
func[1] = b;
i = 0;
while( true ) {
len = strlen(input);
if (len <= (ulong)(long)i) break;
res = (*func[i % 2])(input[i],i);
printf("0x%X, ",(ulong)res);
i = i + 1;
}
putchar(10);
if (local_20 != *(long *)(in_FS_OFFSET + 0x28)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return 0;
}
int a(int param_1,int param_2)
{
return param_2 + param_1;
}
uint b(uint param_1,uint param_2)
{
return param_1 ^ param_2;
}
out.txt
0x41, 0x6D, 0x72, 0x62, 0x67, 0x64, 0x81, 0x46, 0x74, 0x79, 0x6B, 0x68, 0x6D, 0x45, 0x6F, 0x6C, 0x7B, 0x4E, 0x7B, 0x60, 0x73, 0x42, 0x85, 0x79, 0x7C, 0x7C, 0x8C, 0x77, 0x7D, 0x73, 0x82, 0x62,
デコンパイル結果を読むと、$i$番目の文字を次のように変換している
$out_i = \begin{cases} a(in_i, i) &\text{if } iが偶数 \\ b(in_i,i) &\text{if } iが奇数 \end{cases}$
$a(x,y)=x+y$
$b(x,y)=x \oplus y$
逆算可能なので逆算する。
out = [
0x41, 0x6d, 0x72, 0x62, 0x67, 0x64, 0x81, 0x46,
0x74, 0x79, 0x6b, 0x68, 0x6d, 0x45, 0x6f, 0x6c,
0x7b, 0x4e, 0x7b, 0x60, 0x73, 0x42, 0x85, 0x79,
0x7c, 0x7c, 0x8c, 0x77, 0x7d, 0x73, 0x82, 0x62
]
print(bytes((c ^ i) if i % 2 else (c - i) for i, c in enumerate(out)))