namdicul's blog

気ままに更新します. CTFと暗号理論について勉強中です.

"Cpaw CTF" Q20.[Crypto]Block Cipher

与えられたC言語ソースコードを読み解いて復号してフラグを手にれましょう。 

暗号文:cpaw{ruoYced_ehpigniriks_i_llrg_stae} 

crypto100.c

 Answer: 

 

まずはC言語のファイルが与えられているので中身をのぞいてみましょう. 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(int argc, char* argv[]){

  int i;

  int j;

  int key = atoi(argv[2]);

  const char* flag = argv[1];

  printf("cpaw{");

  for(i = key - 1; i <= strlen(flag); i+=key) for(j = i; j>= i - key + 1; j--) printf("%c", flag[j]);

  printf("}");

  return 0;

}

 

まずはコマンドライン引数の内容を確認してみましょう. 第一引数は文字列(問題文中にあるcpaw文), 第二引数はkeyの値になることがわかります. 

問題はソースコード中のfor文の部分ですね. これは, 先頭からkey文字分読み込んで, 逆から出力し, またkey文字分読み込んで逆から出力し... ということを繰り返すことを意味しています. 今回の場合, key=4としてやれば意味のある文が得られそうですね.