반응형
25번 문제
- 모바일 리버싱 문제
문제 :
파일을 다운 받으면, 압축 파일 안에 아래와 같은 3가지 파일이 들어 있다.
해당 파일들은 안드로이드 앱과 관련된 파일이다.
그래서 class.dex 파일을 리버싱해 보았다.
리버싱하기
1. dex2jar-2.0 툴을 이용
> cd dex2jar-2.0 있는 위치
> d2j-dex2jar.bat --force [class.dex위치]
그러면 class.dex 파일이 class-dex2jar.jar 파일로 변환된다.
2. jd-gui를 활용해서 jar파일을 끌어서 java파일로 본다.
3. 전체 코드이다.
package com.example.suninatas25;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.Editable;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
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"));
if (str1.equals("SuNiNaTaS")) {
if (paramString.equals("sb")) {
stringBuffer.append(str1);
continue;
}
if (paramString.equals("id"))
stringBuffer.append(str2);
}
}
}
public String getTel(String paramString) {
StringBuffer stringBuffer = new StringBuffer();
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id=" + paramString, null, null);
while (true) {
if (!cursor.moveToNext())
return stringBuffer.toString();
stringBuffer.append(cursor.getString(cursor.getColumnIndex("data1")));
}
}
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();
Editable editable2 = editText2.getText();
String str = Suninatas25.this.getContacts("sb");
try {
String str1 = Suninatas25.this.getContacts("id");
str1 = Suninatas25.this.getTel(str1);
if (str != null) {
Intent intent = new Intent("android.intent.action.VIEW", Uri.parse("http://www.suninatas.com/challenge/web25/chk_key.asp?id=" + editable1.toString() + "&pw=" + editable2.toString() + "&Name=" + str.toString() + "&Number=" + str1.toString()));
Suninatas25.this.startActivity(intent);
}
return;
} 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();
return;
}
}
});
}
public boolean onCreateOptionsMenu(Menu paramMenu) {
getMenuInflater().inflate(2131099648, paramMenu);
return true;
}
}
Suninatas25 클래스의 주요 함수는
- getContacts
- getTel
- onCreate
이다.
1. getContacts 함수 : 주소록 관련 함수
Contactscontract.Contacts.CONTENT_URI //주소록에서 사람 이름만 보이도록 하는 것
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 함수
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id=" + paramString, null, null); //파라미터로 들어온 값을 주소록ID 값으로 번호를 알아낸다.
stringBuffer.append(cursor.getString(cursor.getColumnIndex("data1"))); //stringBuffer에 위에서 얻은 전화번호를 append 한다.
3. onCreate
editable1 : 입력한 ID
editable2 : 입력한 PW
String str = Suninatas25.this.getContacts("sb"); //getContacts함수에 "sb" 문자열 파라미터를 넣은 결과가 str
===> if (str1.equals("SuNiNaTaS")) { if (paramString.equals("sb")) { stringBuffer.append(str1); continue; } // str1이 "SuNiNaTaS"이고, 파라미터가 "sb"이면, str1값을 append 함
☞ 여기서 str이 SuNiNaTaS 인걸 알 수 있다...
String str1 = Suninatas25.this.getContacts("id"); //getContats함수에 "id" 문자열 파라미터를 넣은 결과가 str1
str1 = Suninatas25.this.getTel(str1); //getTel함수에 str1 파라미터를 넣은 결과를 다시 str1에 넣는다.
===> String str2 = cursor.getString(cursor.getColumnIndex("_id")); 에서 str2에 주소록 _id값이 들어가고, if (str1.equals("SuNiNaTaS")) { 중간 생략... if (paramString.equals("id")) stringBuffer.append(str2); } 에서 파라미터가 "id"이므로 주소록 _id 값이 str2값에 append 된다.
===> getTel(str1)을 통해서 전화번호 값이 str1에 저장이 된다.
☞ 홈페이지 화면에서 번호를 알 수 있음.
Intent intent = new Intent("android.intent.action.VIEW", Uri.parse("http://www.suninatas.com/challenge/web25/chk_key.asp?id=" + editable1.toString() + "&pw=" + editable2.toString() + "&Name=" + str.toString() + "&Number=" + str1.toString()));
// 위 Uri에 id, pw, name, number 값을 넣은 값을 다른 화면으로 넘긴다.
그래서 넘길 값을 확인하면,
http://www.suninatas.com/challenge/web25/chk_key.asp?id=id값&pw=pw값&Name=SuNiNaTaS&Number=5121
바로 홈페이지에 입력하면 이렇게 나온다.
개발자 도구로 모바일로 바꿔서 보내면, 결과가 나온다!
[참고] String Buffer
- 문자열 저장, 변경을 위한 메모리 공간을 지닌 클래스
- 문자열 데이터를 추가를 위해 append, insert 메소드를 지니고 있다.
- String 클래스 문자열 상수를 지니는 메모리 공간을 지니고 있으나, StringBuffer안의 메모리 공간은 값이 변경 가능한 변수의 성격을 지닌다.
- 버퍼를 저장할 때, 문자열의 형태로 저장되지 않고 단순히 데이터 형태롤 저장되고 나중에 toString에 의해 문자열로 변환되어서 나온다.
출처 : https://m.blog.naver.com/ninace/80210003143
반응형