int __cdecl main(int argc, const char **argv, const char **envp)
{
const char *v3; // rdi
if ( argc != 3 )
{
printf("%s [mod] [text]\n", *argv, envp);
exit(1);
}
if ( !strcmp(argv[1], "encode") )
{
encode(argv[2]);
}
else if ( !strcmp(argv[1], "decode") )
{
v3 = argv[2];
decode();
}
return 0;
}
아주 간단한 프로그램. 인자로 encode를 넘겨주면 뒤의 string을 암호화해준다. decode는 구현안됨
__int64 __fastcall encode(const char *string)
{
signed int j; // [rsp+Ch] [rbp-24h]
int i; // [rsp+10h] [rbp-20h]
int bin; // [rsp+14h] [rbp-1Ch]
_BYTE *buf; // [rsp+18h] [rbp-18h]
int len; // [rsp+24h] [rbp-Ch]
len = strlen(string);
buf = malloc(9 * len);
for ( i = 0; i < len; ++i )
{
string[i] ^= 35u;
bin = string[i];
for ( j = 0; j < 8; ++j )
{
buf[8 * i + j] = bin % 2 + 0x30;
bin /= 2;
}
}
printf("%s\n", buf);
return 0LL;
}
하는 일들을 보면 아래와 같다.
string[i] ^ 35
한다.for
문 돌면서 2진수로 변환하는데, 여기서 값이 거꾸로 나온다.01001으로 나와야하는데 10010으로 나오는 느낌.
고대로 코드짜서 복호화하면 된다.
Dncrypt flag
hello = "1110011001010110011101100101011000011010100001100100100010110010001111101110101011001000001111100110100011101010100011100100100010110110001000100011111011100010010010001011001000100110001111101110011011001000101100100010001001111010"
sp = []
string = ""
for i in range(len(hello)): # 8글자단위로 reverse해서 넣음
string += hello[i]
if (len(string) / 8) >= 1:
sp.append(string[::-1])
string = ""
flag = ""
for i in range(len(sp)): # XOR후 string으로 변환
flag += chr(int(sp[i],2) ^ 35)
print flag