━━━━ ◇ ━━━━
해킹/SuNiNaTaS 모의해킹

25. 써니나타스 (Suninatas) 25번 문제풀이 Write-up

728x90
반응형

써니나타스 모의해킹 사이트

https://suninatas.com/challenges

 

써니나타스

웹해킹, 포렌식, 리버싱, 암호학, 해킹 워게임 제공.

www.suninatas.com


써니나타스 25번은 시스템에 관련된 문제다. 개발자도구에서는 힌트가 없었고 LAST NUMBER이라는 문구와 함께 MAKE와 다운로드 버튼이 있었다. 

 

 

MAKE 버튼을 눌러보니 위와 같은 메시지가 alert 됐다. 그리고 LAST NUMBER은 1455가 부여됐다. 지금은 어떤 정보도 얻을 수 없기 때문에 다운로드 버튼을 눌러봐야겠다. 

 

 

다운로드를 하여서 Suninatas25.zip 파일을 압축해제하면 Suninatas25라는 파일이 생긴다. 

 

 

출처: http://forensic-proof.com/archives/300

이번에도 24번과 같이 HxD를 통해서 파일 시그니처를 알아봤다. 이번에도 동일하게 PKzip 파일이었다. 

 

 

Suninatas25 파일의 확장자를 Suninatas25(2).zip으로 바꿔준 뒤 압축해제를 했다. 

※ 파일이름이 Suninatas(2).zip이 된 이유는 아까 먼저 받아둔 Suninatas25.zip파일 때문에 자동으로 이름 수정이 됐다. 

이번에도 apk파일이었다. 

 

 

 

이번에도 24번과 같이 class.dex 파일을 dex-tools-2.1로 복사 혹은 이동해 준다. 

 

혹시 dex2jar이 없다면 아래 링크에서 다운로드하여서 진행하면 된다. 

https://github.com/pxb1988/dex2jar/releases/tag/v2.1

 

Release v2.1 · pxb1988/dex2jar

set version to 2.1

github.com

 

 

 

윈도우 CMD창을 열고 dex-tools-2.1 폴더의 경로로 이동한 뒤 d2j-dex2jar.bat class.dex 명령어로 class.dex 파일을 디컴파일 해준다. 

class-dex2jar.jar 파일이 잘 생성되었다. 

 

 


동일하게 jar파일 내부의 class들을 java코드로 읽을 준비를 해야 한다. 

이번에도  JD-GUI로 진행하겠다. 

 

혹시 없는 분들은 아래 링크에서 다운로드 받고 진행하면 된다. 

http://java-decompiler.github.io/#jd-gui-download

 

Java Decompiler

The “Java Decompiler project” aims to develop tools in order to decompile and analyze Java 5 “byte code” and the later versions. JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files. You can browse the reco

java-decompiler.github.io

 


JD-GUI로 class-dex2jar.jar 파일을 연 모습이다. 

 

 

Suninatas25.class의 코드이다. 

전체 코드를 함수별로 분리해서 보면 아래와 같다. 

 

 

1) getContacts

public class Suninatas25 extends Activity {
  public String getContacts(String paramString) {
    StringBuffer stringBuffer = new StringBuffer();
    Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    while (true) {
      if (!cursor.moveToNext())
        return stringBuffer.toString(); 
      String str1 = cursor.getString(cursor.getColumnIndex("display_name"));  //주소록에서 선택된 이름
      String str2 = cursor.getString(cursor.getColumnIndex("_id"));  //주소록에서 선택된 ID
      if (str1.equals("SuNiNaTaS")) {  //주소록 이름(str1)이 SuNiNaTaS이면
        if (paramString.equals("sb")) {  //파라미터 값이 sb이면
          stringBuffer.append(str1);  //stringBuffer에 str1 값인 SuNiNaTaS를 append 한다
          continue;  //아래 코드는 무시하고 계속
        } 
        if (paramString.equals("id"))  //파라미터 값이 id라면
          stringBuffer.append(str2);  //stringBuffer에 str2 값인 주소록에서 선택된 ID를 넣는다
      } 
    } 
  }

 

 

2) getTel

  public String getTel(String paramString) {
    StringBuffer stringBuffer = new StringBuffer();
    Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id=" + paramString, null, null);
    //파라미터로 들어온 값을 주소록 ID 값을 이용하여 번호를 알아낸다
    while (true) {
      if (!cursor.moveToNext())
        return stringBuffer.toString(); 
      stringBuffer.append(cursor.getString(cursor.getColumnIndex("data1")));
    }  //위에서 얻은 번호를 stringBuffer에 append 한다.
  }

 

 

3) onCreate

public void onCreate(Bundle paramBundle) {
    super.onCreate(paramBundle);
    setContentView(2130903040);
    ((Button)findViewById(2131165186)).setOnClickListener(new View.OnClickListener() {
          public void onClick(View param1View) {
            EditText editText1 = (EditText)Suninatas25.this.findViewById(2131165184);
            EditText editText2 = (EditText)Suninatas25.this.findViewById(2131165185);
            Editable editable1 = editText1.getText();  //입력한 ID
            Editable editable2 = editText2.getText();  //입력한 PW
            String str = Suninatas25.this.getContacts("sb");  //getContact함수에 sb를 넣은 결과 = str
            try {
              String str1 = Suninatas25.this.getContacts("id");  //getContact함수에 id를 넣은 결과 = str1
              str1 = Suninatas25.this.getTel(str1);  //getTel함수에 str1을 넣은 결과를 다시 str1에 넣는다
              if (str != null) {
                StringBuilder stringBuilder = new StringBuilder();
                this("http://www.suninatas.com/challenge/web25/chk_key.asp?id=");
                Uri uri = Uri.parse(stringBuilder.append(editable1.toString()).append("&pw=").append(editable2.toString()).append("&Name=").append(str.toString()).append("&Number=").append(str1.toString()).toString());
                //URL에 id, pw, name, number값을 넣으면 그 값을 다음 화면으로 넘긴다
                Intent intent = new Intent();
                this("android.intent.action.VIEW", uri);
                Suninatas25.this.startActivity(intent);
              } 
            } catch (Exception exception) {
              (new AlertDialog.Builder((Context)Suninatas25.this)).setMessage("Wrong!").setNeutralButton("Close", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface param2DialogInterface, int param2Int) {
                      param2DialogInterface.dismiss();
                    }
                  }).show();
            } 
          }
        });
  }

 

 

URL = http://www.suninatas.com/challenge/web25/chk_key.asp?id=

Uri uri = Uri.parse(stringBuilder.append(editable1.toString()).append("&pw=").append(editable2.toString()).append("&Name=").append(str.toString()).append("&Number=").append(str1.toString()).toString());
 //URL에 id, pw, name, number값을 넣으면 그 값을 다음 화면으로 넘긴다

 

위 코드를 가지고 내가 넘겨야 할 값을 나열해 봤다. 

http://www.suninatas.com/challenge/web25/chk_key.asp?id="ID값"&pw="PW값"&Name=SuNiNaTaS&Number=1455

 

참고로 해당페이지로 넘어가기 위해서는 아래 URL과 같이 http ☞ https로 바꿔줘야 한다. 

https://www.suninatas.com/challenge/web25/chk_key.asp?id="ID값"&pw="PW값"&Name=SuNiNaTaS&Number=1455

내 아이디와 비밀번호 값을 마저 입력하고 이동했더니 위와 같은 화면이 출력됐다. 이럴 때는 고급을 누른 뒤에, 

안전하지 않음으로 이동을 클릭해 주면 된다. 

 

 

그런데,, 역시나 쉽게 보내주지 않는 써니나타스. 

어떤 문제가 있을까 생각을 해보다가 혹시 모바일인가 싶어서 개발자도구를 연 뒤,

위 빨간 네모의 디바이스 변경 버튼을 눌러주면 모바일로 접속하는 환경이 만들어진다. 

 

그다음 주소창에 다시 https://www.suninatas.com/challenge/web25/chk_key.asp?id="ID값"&pw="PW값"&Name=SuNiNaTaS&Number=1455 을 입력하고 이동!

 

 

그러면 인증키가 출력된다. 

 

 

그러면 축하메시지와 함께 25번 문제를 끝냈다는 alert가 뜬다. 

java 코드를 아직까지는 원활하게 읽어내려가지 못하기 때문에 시간이 조금 많이 걸렸다. java도 조금씩 공부를 병행해야겠다. 

 

25번 문제

 

성공

728x90
반응형
COMMENT