After running the program, it looks like the challenge is composed of several part, and we have to guess the flag through reversing the program. Let's open the program with radare2. The main function is easy to understand, it ask the user for the flag, wait for the user input, and then call the validate() function. The program is composed of several parts, we have to understand each part to retrieve the flag. After entering in the function validate(), there are many conditional jumps that are performed. It is quite simple to understand here, we just have to convert those hexadecimal numbers in ASCII character.

0x46 = F
0x43 = C
0x53 = S
0x43 = C
0x7b = {
Passing this step, the program call another function : difficult_part()
This part is also the same, we just need to convert those hexadecimal into ASCII characters.
\x65\x37\x35\x35\x32\x63\x66\x36 = e7552cf6
FCSC{e7552cf6
On this one, we have an instruction add eax, eax that tell you that eax is getting multiplied by 2 before the conditional jump. So I suppose we just need to divide the comparason by 2.
(\x68\xc6\xca\x64\xca\x8a\xc2\xc8) / 2 = \x34\x63\x65\x32\x65\x45\x61\x64 = 4ce2e5ad
FCSC{e7552cf64ce2e5ad
The instruction "shl" will proceed to shift the some bits to the left.
shl eax, 3
cmp eax, 0x180
0x180 = 110000000 so we just have to proceed to the reverse, we shift 3 bits to the right to find the initial value of eax. That gives us 000110000 = 0x30 = 0 in ASCII. If we continue it should gives us 0bb0954f.
FCSC{e7552cf64ce2e5ad0bb0954f
This part is a little bit tricky, each time before the conditional jump, it takes two values.
movzx edx, byte [var_fh]
mozx eax, byte [var_1fh]
xor eax, edx
Their position on the stack is different, 16 bits separate those two value. 0bb0954f = \x30\x62\x62\x30\x39\x35\x34\x66, takes 16 bits, therefore it will xor the current input with the previous user input.
In the last conditional jump there isn't any xor.
movzx edx, byte [var_9h]
mozx eax, byte [var_19h]
cmp dl, al
je 0x4014c5
the register dl must be equal to al, al is equal to f (last character of the previous input) To pass this step, the correct input was : 167a02cf.
After this, the program call another function, most_difficult_part(), we can expect some challenge here ! Looks like we only have one conditional jump in the program.
cmp al, 0x7d
je 0x40119e
To get into that jump, the register al must be equal to 0x7d, which is "}" in ASCII. It simply marks the end of the flag.
FCSC{e7552cf64ce2e5ad0bb0954f167a02cf}