CBM CTF 2019 Pwn pwn3

pwn3

reverse the binary and submit number at: nc 35.231.63.121 1340

$ file pwn03
pwn03: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=b05f6b18edc1239d39e04a6b36d3d457ca96c1f5, not stripped

まずはmain()から見ていく。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [rsp+Ch] [rbp-4h]

  puts("enter the number");
  fflush(_bss_start);
  __isoc99_scanf("%d", &v4);
  if ( v4 & 1 )
    puts("you entered an odd number");
  else
    puts("you entered an even number");
  return 0;
}

入力して出力するだけ。 gen_key()を見てみる。

void gen_key()
{
  int seed; // [rsp+8h] [rbp-8h]
  signed int i; // [rsp+Ch] [rbp-4h]
  signed int j; // [rsp+Ch] [rbp-4h]

  srand(2109u);
  for ( i = 0; i <= 9; ++i )
    seed = rand();
  srand(seed);
  for ( j = 0; j <= 19; ++j )
    rand();
}

seedに同じ数値を与えれば同じ乱数でkeyを表示できるはず。

srand関数は rand関数で発生させる擬似乱数の発生系列を変更します。srand関数の引数seedに同じ数値を与えると、rand関数は同じ繰返しで擬似乱数を発生させます。たとえば、下の使用例1では同じ seed で10回 srand関数を呼んでいますが、結果を見ると、10回とも同じ繰返しでrand関数は擬似乱数を発生させています。

また、srand関数を呼ばずにrand関数を実行した場合には、srand関数でseedに1を設定したことと同じになり、プログラムを何度実行しても同じ繰り返しで擬似乱数を発生します。

http://www9.plala.or.jp/sgwr-t/lib/srand.html

srand()に2109を引数に与えて乱数を生成するgen_key()を書く。

#include <stdlib.h>
#include <stdio.h>

void main(){
    int seed;
    int i;
    int j;
    int r;

    srand(2109);
    for(i=0;i<=9; ++i){
        seed = rand();
    }
    srand(seed);
    for(j=0;j<=19;++j){
        r = rand();
    }
    printf("%d", r);
}
~/Desktop/CBMCTF/Pwn/pwn3 ᐅ gcc gen_key.c
~/Desktop/CBMCTF/Pwn/pwn3 ᐅ ./a.out
585020141%

keyが585020141だとわかったので入力することでFLAGが得られた。

~/Desktop/CBMCTF/Pwn/pwn3 ᐅ echo 585020141 | nc 35.231.63.121 1340
enter the number
flag is cbmctf{sR4nd_!5_n07_R4nd0m!!}

FLAG : cbmctf{sR4nd_!5_n07_R4nd0m!!}