전체 글

    KnightCTF - Droid Flag

    Droid Flag - 100 이번 KnightCTF 문제 풀면서 안드로이드 관련 문제가 나왔는데 워겜이나 변조 앱 분석은 했어도 CTF 문제는 처음이라 풀이를 남긴다. Analysis Application 앱 실행 후 확인해보면 다음과 같은 부분을 확인할 수 있다. “Enter Flag”라는 안내 문구가 적혀있으며, 사용자가 입력할 수 있는 칸 “VALIDATE”라는 문자열이 적힌 Flag 인증 버튼 Source Code MainActivity 디컴파일러를 이용하여 APK를 열어준 후 MainActivity를 확인하기 위해 AndroidManifest 파일을 통해 이를 확인해준다. MainActivity를 확인해보면 이런저런 코드를 확인할 수 있는데 여기서 중요한 부분은 이전에 확인해본 것과 같이 값을..

    프리패치 파일을 통해 ADS 정보 추출

    개요 Prefetch 프리패치(Prefetch) 란..? Windows 내에서 프리 패칭은 부팅 혹은 응용 프로그램을 실행할 때 성능 향상을 위해 구현된 기능으로 부팅 혹은 응용 프로그램 실행 후 모니터링하여 이를 파일로 생성한다. 생성된 프리패치 파일은 이후 재부팅 혹은 응용 프로그램 재실행 시 속도 향상을 위해 사용된다. 기본적으로 프리패치 파일은 “%SystemRoot%\Prefetch” 경로에 위치한다. Tools WinPrefetchView : 프리 패치 파일을 불러와서 GUI 를 사용하여 정보를 보여준다. 추가로 옵션 → 고급 옵션을 통해 프리 패치 파일을 따로 불러와 확인할 수 있다. PECmd : 프리 패치 파일 혹은 폴더 경로를 지정하여 분석한 결과를 json, csv, html 등으로 ..

    Level 1 ~ 8

    앱 정보 앱을 실행하면 1 ~ 8번까지 조건들이 나열되어 있으며, CHECK 버튼을 눌렀을 때 해당 조건이 만족되면 초록색 그렇지 않으면 빨간색으로 바뀌는 애플리케이션이다. Level 1 Change class challenge_01's variable 'chall01' to:1 Level 1의 조건은 challenge_01 클래스의 chall01 변수의 값을 1로 설정하는 것이다. challenge_01 public class challenge_01 { static int chall01; public static int getChall01Int() { return chall01; } } challenge_01 클래스를 확인해보면 다음과 같다. chall01 변수와 해당 변수의 값을 넣어줄 수 있는 ge..

    Uncrackable 2

    앱 정보 앱을 실행시키면 이전 Uncrackable 1과 똑같이 루팅 감지를 하고 OK 버튼을 누르면 종료되는 것을 확인할 수 있다. 루팅 감지는 이전 단계와 똑같이 우회할 수 있으니 우회를 한 뒤 확인해보면 사용자 입력을 받을 수 있는 공간 하나와 VERFIY 버튼 하나로 구성되어 있음을 알 수 있다. 또한 이전과 똑같이 무작위 데이터 입력 후 버튼을 눌러보면 "Nope..."이라는 창을 확인할 수 있다. 앱 분석 verify() public void verify(View view) { String str; String obj = ((EditText) findViewById(R.id.edit_text)).getText().toString(); AlertDialog create = new AlertDia..

    Uncrackable 1 - Secret String

    앱 정보 이전 루팅 우회를 사용하여 애플리케이션을 실행하면 다음과 같이 문자열을 입력받는 부분과 VERIFY 버튼을 확인할 수 있다. 이때 문자열을 아무 값을 넣은 후 VERIFY 버튼을 눌러주면 다음과 같이 다시 시도하라는 메시지 창을 확인할 수 있다. 앱 분석 verify() public void verify(View view) { String str; String obj = ((EditText) findViewById(R.id.edit_text)).getText().toString(); AlertDialog create = new AlertDialog.Builder(this).create(); if (a.a(obj)) { create.setTitle("Success!"); str = "This is..

    Uncrackable 1 - Root Detection

    앱 정보 앱을 실행시켜보면 다음 그림과 같이 "Root detected"라는 창이 생기고 OK 버튼을 누르면 앱이 종료되는 것을 확인할 수 있다. 앱 분석 onCreate() public void onCreate(Bundle bundle) { if (c.a() || c.b() || c.c()) { a("Root detected!"); } if (b.a(getApplicationContext())) { a("App is debuggable!"); } super.onCreate(bundle); setContentView(R.layout.activity_main); } public class c { public static boolean a() { for (String file : System.getenv("..

    Hardcoding Issues(Part 2) - Level 12

    앱 정보 하드 코딩된 정보를 찾아 입력하면 해결할 수 있는 문제 기본 화면은 다음 [그림 1]과 같이 vendor key를 입력할 수 있는 부분과 ACCESS 버튼으로 구성되어있다. 아무 값이나 입력한 후 ACCESS를 눌러보면 다음과 같은 메시지를 확인할 수 있다. 앱 분석 Hardcode2Activity private DivaJni djni; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView((int) R.layout.activity_hardcode2); this.djni = new DivaJni(); } public void access(View view) { if (t..

    Access Control Issues(Part 3) - Level 11

    앱 정보 level11은 비밀 노트 애플리케이션으로 4자리 숫자의 PIN 코드를 설정한 후 노트를 확인할 때 설정한 코드를 인증하여 비밀 노트를 확인할 수 있는 애플리케이션이다. 기본 화면은 다음과 같으며, 4자리 PIN 코드를 입력할 수 있는 칸과 PIN 코드 입력 후 생성/변경할 수 있는 버튼 그리고 비밀 노트로 이동하는 버튼으로 구성되어 있다. 비밀 노트로 이동하기 이전에 PIN 코드 입력 후 생성/변경 버튼을 눌러준다. 이동하면 PIN 코드를 입력할 수 있는 칸과 비밀 노트에 접속하는 버튼으로 구성되어 있으며, 이전에 설정한 코드를 입력한 후 버튼을 눌러 노트에 접속해준다. 이동하면 다음과 같은 정보를 확인할 수 있다. 앱 분석 addPin() public void addPin(View view)..

    Insecure Logging - Level 1

    정보 level 1은 신용카드 번호를 입력 후 체크 아웃하는 기능을 가졌으며, 신용카드 번호와 같은 민감한 정보가 로그에 남는 것을 확인하는 단계이다. 기본 화면은 다음 [그림 1]과 같이 신용 카드 번호를 입력할 수 있는 부분과 CHECK OUT이라는 버튼 하나로 구성되어 있다. 이때 신용카드 번호 입력 후 CHECK OUT 버튼을 누르면 "An error occured. Please try again later"라는 문자열이 출력되는 것을 확인할 수 있다. 분석 checkout public void checkout(View view) { EditText cctxt = (EditText) findViewById(R.id.ccText); try { processCC(cctxt.getText().toStr..

    FLAG SEVEN - SQLITE

    Analysis Code onCreate public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView((int) R.layout.activity_flag_seven_sqlite); C((Toolbar) findViewById(R.id.toolbar)); j.g.a(this); H(); ((FloatingActionButton) findViewById(R.id.fab)).setOnClickListener(new a(this)); SQLiteDatabase writableDatabase = this.u.getWritableDatabase(); ContentValues contentValues = new ContentValues();..