CBM CTF 2019 Pwn pwn5

pwn5

Ananlyse the binary and get flag at: nc 35.231.63.121 1342

$ file pwn5
pwn5: 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]=773d00f80eafcb7c49f23f67372ca67463de87fe, not stripped

main()から見ていく。print_flag()がある。

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

  v5 = 1048576;
  puts("enter an INT");
  __isoc99_scanf("%d", &v4);
  if ( v4 <= 0 )
  {
    puts("no enter a positive number only");
    result = -2;
  }
  else if ( v4 + v5 <= 152 )
  {
    print_flag();
    result = 2;
  }
  else
  {
    puts("sorry!! Try again");
    result = -1;
  }
  return result;
}

0以上の整数を入力して入力された値(v4)とv5(1048576)を足した結果が<=152ならprint_flag()が呼ばれる。 v5(1048576)を足すと152以下にはならないので桁あふれさせる。

int 32bitの最大値は2147483647なので(v4 + 1048576) = (2147483647 + 1)にする。

2147483647 - 1048576 + 1 = 2146435072

2146435072を入力すると( v4 + v5 <= 152 )がTrueになってprint_flag()が呼ばれる。

flagを残してなかったのでlocalで。

~/Desktop/CBMCTF/Pwn/pwn5 ᐅ ./pwn5
enter an INT
2146435072
this flag is local.