CPCTF 2019 Writeup Binary class Easy Binary passcode

Binary

class

Description

Main.class http://files.problem.cpctf.space/Main.class

classファイルが与えられるのでオンラインデコンパイラに投げた。 http://www.javadecompilers.com/

import java.io.PrintStream;

public class Main { public Main() {} static int[] answer = { 70, 76, 65, 71, 95, 49, 48, 48, 123, 106, 97, 118, 97, 95, 49, 53, 95, 119, 48, 114, 97, 125 };
  

  public static void main(String[] args) {}
  
  static void pl(Object o) { System.out.println(o); }
  
  static void ans() {
    String ans = "";
    for (int i = 0; i < answer.length; i++) {
      ans = ans + (char)answer[i];
    }
    pl(ans);
  }
}

asciiでデコードする。 https://www.dcode.fr/ascii-code

f:id:Yunolay:20190418172153p:plain

FLAG : FLAG_100{java_15_w0ra}

Easy Binary

Description

easybinary

まずはfileコマンドで確認。

$ file easybinary
easybinary: 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]=73f0907df85cf75b4030ca7fbbbd9de69302929f, not stripped

stringsでフラグが得られた。

$ strings easybinary | grep FLAG
FLAG_100{5trings_c0mannd_is_c0nven1ent!}

FLAG : FLAG_100{5trings_c0mannd_is_c0nven1ent!}

passcode

Description

binary

ファイルが与えられる。

$ file passcode
passcode: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=14b96a100033c70b43f9b67e075323c935a36758, not stripped

とりあえずIDAに投げる。

f:id:Yunolay:20190418172209p:plain

mainで一文字ずつ比較している。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp-12h] [ebp-50h]
  int v5; // [esp-Eh] [ebp-4Ch]
  int v6; // [esp-Ah] [ebp-48h]
  int v7; // [esp-6h] [ebp-44h]
  int v8; // [esp-2h] [ebp-40h]
  char v9; // [esp+0h] [ebp-3Eh]
  int v10; // [esp+2h] [ebp-3Ch]
  int v11; // [esp+6h] [ebp-38h]
  int v12; // [esp+Ah] [ebp-34h]
  int v13; // [esp+Eh] [ebp-30h]
  int v14; // [esp+12h] [ebp-2Ch]
  int v15; // [esp+16h] [ebp-28h]
  int v16; // [esp+1Ah] [ebp-24h]
  int v17; // [esp+1Eh] [ebp-20h]
  int v18; // [esp+22h] [ebp-1Ch]
  char *v19; // [esp+2Ah] [ebp-14h]
  unsigned int v20; // [esp+32h] [ebp-Ch]
  int *v21; // [esp+36h] [ebp-8h]

  v21 = &argc;
  v20 = __readgsdword(0x14u);
  puts("What is flag?");
  __isoc99_scanf("%49s", &v9, v4, v5, v6, v7, v8, v10, v11, v12, v13, v14, v15, v16, v17, v18);
  if ( v9 != 'F'
    || HIBYTE(v8) != 'L'
    || (_BYTE)v10 != 'A'
    || BYTE1(v10) != 'G'
    || BYTE2(v10) != '_'
    || HIBYTE(v10) != '2'
    || (_BYTE)v11 != '0'
    || BYTE1(v11) != '0'
    || BYTE2(v11) != '{'
    || HIBYTE(v11) != '('
    || (_BYTE)v12 != '0'
    || BYTE1(v12) != 'R'
    || BYTE2(v12) != 'r'
    || HIBYTE(v12) != 'e'
    || (_BYTE)v13 != 'C'
    || BYTE1(v13) != '+'
    || BYTE2(v13) != 'i'
    || HIBYTE(v13) != ('|')
    || (_BYTE)v14 != '!'
    || *(_WORD *)((char *)&v14 + 1) != '}' )
  {
    puts("This is not flag");
  }
  else
  {
    v19 = &v9;
    printf("Flag is %s\n", &v9);
  }
  return 0;
}

全部つなげるとフラグが得られる。

FLAG : FLAG_200{(0RrcC+il!}