IDA의 설치 경로에 있는 dbgsrv 폴더에서 linux_serverx64를 우분투 서버로 복사한다.



서버에서 linux_serverx64를 실행시킨다.


디버깅 할 ELF파일을 IDA로 연다.



Remote Linux debugger로 선택한 후 디버깅을 실행한다.




Application 과 Input file에는 절대경로를 써주고 ip주소를 입력해주면 디버깅이 시작된다.





이렇게 올리디버거로 exe 파일 디버깅 하듯 


IDA로 elf 파일 디버깅 할 수 있다.


 리눅스 뿐만 아니라 윈도우 맥에서도 똑같이 디버깅 가능하다.





'리버싱' 카테고리의 다른 글

Assembly Jump Relative Address (Intel x86)  (0) 2019.07.09
How To See opcode using IDA  (0) 2017.02.10
Z3 SMT Solver for windows using visual studio  (0) 2017.02.08

-포트번호가 22번일 때는 포트번호 생략가능


1.  Remote To Local 


scp -P 포트번호  사용자명@원격서버주소:해당파일경로 로컬위치


2. Remote Directory To Local 


scp -r -P 포트번호 사용자명@원격서버주소:해당디렉토리경로 로컬위치


3.  Local To Remote


scp -P 포트번호 로컬파일위치 사용자명@원격주소:원격서버경로



'' 카테고리의 다른 글

Ooops, IDA has almost crashed!  (0) 2019.01.28
Color highlighted on the Mac Terminal  (0) 2016.09.01
ssh connection errors  (0) 2016.08.31

먼저 앱을 다운후 실행 시키려 했지만 설치가 안됨.


계속 해매다가 이상한점 발견.


일반적인 apk


문제 apk


맥에서 옳게 인식을 하면 맥 실행파일 아이콘이 나와야 하는데 문제의 apk는 인식을 못함 .


자세히 보니 파일명들이 이상한 것을 볼 수 있음.


class.dex -> classes.dex


resource.arsc -> resources.arsc


AndroidManIfests.xml -> AndroidManifest.xml


변경하면 정상적으로 설치가 됨.


실행하면 키값이 뜸.






'문제 > CodeEngn_Smart_App' 카테고리의 다른 글

CodeEngn SmartApp 02  (0) 2016.08.25
CodeEngn SmartApp 03  (0) 2016.08.24


MainActivity를 살펴보면 앱이 켜질때 2013년 11월 2일 12시 35분 3초 이면서 Volume 함수의 리턴값이 53이어야 키값이 뜬다.


makeDate함수와 Volume함수를 조건에 맞도록 수정하는 방법도 있지만 


그냥 조건문 다음에 this.aView.setText(keyString)) 함수를 한번더 호출 하도록 Smali 코드를 패치했다.







'문제 > CodeEngn_Smart_App' 카테고리의 다른 글

CodeEngn SmartApp 01  (0) 2016.08.25
CodeEngn SmartApp 03  (0) 2016.08.24

  1. ==== Example 1 ====
  2. .method private isValid([Ljava/lang/String;[Ljava/lang/String;Ljava/math/BigInteger;)Ljava/lang/Boolean;
  3.     .locals 7 // 메소드 내부에서 사용하는 레지스터 수 ex. v1~v7
  4.     .parameter "issuerDN" // 파라미터 이름, 뒤에서부터, p3
  5.     .parameter "subjectDN" // p2
  6.     .parameter "serial" // p1      
  7. .prologue
  8.     const/4 v6, 0x4 // v6 = 0x4
  9.     const/4 v5, 0x3 // v5 = 0x3
  10.     const/4 v4, 0x2 // v4 = 0x2
  11.     const/4 v3, 0x1 // v3 = 0x1
  12.     const/4 v2, 0x0 // v2 = 0x0
  13. .line 103
  14.     aget-object v0, p1v2   // v0 = p1[v2],  v0 = serial[v2]array[] (p1)의 특정 index(v2) 의 값을 v0에 저장
  15.     // p0 는 this 인듯...
  16.     iget-object v1, p0Lops/black/herpderper/TrustModifier$AlwaysTrustManager;->CN1:Ljava/lang/String; // v1 = this.AlwaysTrustManager->C1
  17.     invoke-virtual {v0, v1}Ljava/lang/String;->equals(Ljava/lang/Object;)Z // v0 = String->equals(v0v1);
  18.     move-result v0
  19.     if-eqz v0, :cond_0 // v0가 0 이면 cond_0 로 점프
  20.     aget-object v0, p1v3
  21.     iget-object v1, p0Lops/black/herpderper/TrustModifier$AlwaysTrustManager;->OU:Ljava/lang/String; // AlwaysTrustManager->OU
  22.     invoke-virtual {v0, v1}Ljava/lang/String;->equals(Ljava/lang/Object;)Z
  23.     move-result v0
  24.     if-eqz v0, :cond_0 // if(v0 == 0) goto cond_0;
  25.     ...
  26.     .line 119
  27.     invoke-static {v3}Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean; //  v0 = Boolean->valueOf(v3);
  28.     move-result-object v0
  29.     .line 121
  30.     :goto_0
  31.     return-object v0 // return v0;
  32.     :cond_0
  33.     invoke-static {v2}Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;  // v0 = Boolean->valueOf(v2); // v2=0=false
  34.     move-result-object v0
  35.     goto :goto_0
  36. ==== Result 1 ====
  37. private Boolean isValid(String[] serial, String[] subjectDN, BigInteger issuerDN) {
  38.   v6=4;
  39.   v5=3;
  40.   v4=2;
  41.   v3=1;
  42.   v2=0;
  43.   v0 = serial[v2];
  44.   v1 = AlwaysTrustManager->C1;
  45.   v0 = String->equals(v0v1);
  46.   if(v0 == 0)
  47.      goto cond_0;
  48.   v0 = serial[v3];
  49.   v1 = AlwaysTrustManager->OU;
  50.   v0 = String->equals(v0v1);
  51.   if(v0 == 0)
  52.      goto cond_0;
  53.   ...
  54.   v0 = Boolean->valueOf(v3); // v3=1=true
  55.   :goto_0
  56.   return v0;
  57.   :cond_0
  58.   v0 = Boolean->valueOf(v2); // v2=0=false
  59.   goto: goto_0;
  60. ==== Example 2 ====
  61. # virtual methods
  62. .method protected varargs doInBackground([Ljava/lang/String;)Ljava/lang/String;
  63.     .locals 17
  64.     .parameter "uri"
  65.     .prologue
  66.     .line 28
  67.     invoke-static {}Landroid/os/Debug;->isDebuggerConnected()Z
  68.     move-result v14
  69.     if-eqz v14, :cond_0
  70.     .line 29
  71.     const/16 v14, 0x539
  72.     div-int/lit8 v14, v140x0
  73.     .line 31
  74.     :cond_0
  75.     const/4 v11, 0x0
  76.     .line 34
  77.     .local v11, url:Ljava/net/URL;
  78.     :try_start_0
  79.     new-instance v12, Ljava/net/URL;
  80.     const/4 v14, 0x0
  81.     aget-object v14, p1v14
  82.     invoke-direct {v12, v14}Ljava/net/URL;-><init>(Ljava/lang/String;)V // <init>() 괄호 안에 변수 갯수 = 파라미터 갯수, 즉 v14만 파라미터 v12 는 리턴값 저장
  83.     :try_end_0
  84.     .catch Ljava/net/MalformedURLException{:try_start_0 .. :try_end_0} :catch_1
  85.     .end local v11           #url:Ljava/net/URL; // 이런건 다 코멘트
  86.     .local v12, url:Ljava/net/URL;
  87.     move-object v11, v12
  88.     .line 41
  89.     .end local v12           #url:Ljava/net/URL;
  90.     .restart local v11       #url:Ljava/net/URL;
  91.     :goto_0
  92.     const/4 v13, 0x0
  93.     .line 44
  94.     .local v13, urlConnection:Ljava/net/HttpURLConnection;
  95.     :try_start_1
  96.     invoke-virtual {v11}Ljava/net/URL;->openConnection()Ljava/net/URLConnection;
  97.     move-result-object v14
  98.     move-object v0, v14
  99.     check-cast v0, Ljava/net/HttpURLConnection;
  100.     move-object v13, v0
  101.     .line 47
  102.     const/4 v14, 0x1
  103.     invoke-virtual {v13, v14}Ljava/net/HttpURLConnection;->setDoOutput(Z)V // Z -> 하나의 파라미터 나타냄, v13.HttpURLConnection->setDoOutput(v14);
  104.     .line 48
  105.     const-string v14, "POST"
  106.     invoke-virtual {v13, v14}Ljava/net/HttpURLConnection;->setRequestMethod(Ljava/lang/String;)V
  107.     .line 51
  108.     invoke-static {v13}Lops/black/herpderper/TrustModifier;->relaxHostChecking(Ljava/net/HttpURLConnection;)V
  109.     .line 52
  110.     invoke-virtual {v13}Ljava/net/HttpURLConnection;->getOutputStream()Ljava/io/OutputStream;
  111.     move-result-object v5
  112.     .line 55
  113.     .local v5, out:Ljava/io/OutputStream; // v5 = get_OutputStream();
  114.     const/4 v14, 0x1
  115.     aget-object v14, p1v14
  116.     const-string v15, "UTF-8"
  117.     ...
  118.   :catch_1
  119.     move-exception v1
  120.     .line 38
  121.     .local v1, e1:Ljava/net/MalformedURLException;
  122.     invoke-virtual {v1}Ljava/net/MalformedURLException;->printStackTrace()V
  123.     goto/16 :goto_0
  124. ==== Result 2 ====
  125. protected String doInBackground(String[] uri) {
  126.   v14 = android.os.Debug.isDebuggerConnected();
  127.   if(v14==0)
  128.     goto cond_0;
  129.   v14 = 0x539;
  130.   v14 = v14 / 0;
  131.   :cond_0
  132.   v11 = 0;
  133.   v11 = url:Ljava/net/URL;
  134.   :try_start_0
  135.   v12 = java/net/URL;
  136.   v14 = 0;
  137.   v14 = uri[v14]; // v14 = uri[0];
  138.   v12 = URL->init(v14);
  139.   :try_end_0
  140.   .catch MalformedURLException :catch_1
  141.   v11 = (java/net/URL) v12;
  142.   :goto_0
  143.    v13 = 0;
  144.    v13 = (HttpURLConnection) v13;
  145.   :try_start_1
  146.    v14 = URL->openConnection(v11);
  147.    v0 = v14;
  148.    v0 = (HttpURLConnection) v0;
  149.    v13 = v0;
  150.    v14 = 1;
  151.    v13.setDoOutput(v14);
  152.    v14 = "POST";
  153.    v13.setRequestMethod(v14);
  154.    ops.black.herpderper.TrustModifier.relaxHostChecking(v13);
  155.    v5 = getOutputStream(v13);
  156.    v14 = 1;
  157.    v14 = uri[v14];


'안드로이드' 카테고리의 다른 글

Android NDK & JNI for MAC  (1) 2016.08.24


디컴파일 해보니 랜덤으로 생성된 stairs와 내가 올라가야할 stairs가 있다.


랜덤으로 생성된 번호까지 내가 클릭을 하면 키값이 나온다.


TextView 2개가 있는데 첫번째는 랜덤으로 생성된 수 두번째는 내가 클릭할 때마다 증가되는 수.


조건에서 랜덤값과 내값이 다르다면 증가만하고 return 된다.


즉 조건문만 바꿔주면 키값이 뜬다.


호환이 안되서인지 랜덤으로 생성된 수가 보이지 않는다.


Smali코드에서 두번째 TextView에 eq이 아니라 ne일때 cond_0으로 점프하게 하면 키값이 뜰것이다.


Smali코드 패치후 컴파일 한후 버튼을 누르면 바로 키값이 뜬다.




'문제 > CodeEngn_Smart_App' 카테고리의 다른 글

CodeEngn SmartApp 01  (0) 2016.08.25
CodeEngn SmartApp 02  (0) 2016.08.25

xinetd란

-> inetd가 관리하는 포트에 접속 요청이 들어오면 inetd는  tcpd 프로그램에 요청을 넘기고 tcpd는 hosts.{allow|deny} 파일 규칙에 따라 허락여부를 결정.

    허락된 요청에 대해 서버 프로세스가 시작된다.


쉽게말해 대회 때 nc나 클라이언트측 소켓 짤때 서버측 소켓 짤 필요없이 xinetd가 서버에서 통신해줌.



apt-get install xinetd


세팅


vi /etc/xinetd.conf



# Simple configuration file for xinetd

#

# Some defaults, and include /etc/xinetd.d/


defaults

{


# Please note that you need a log_type line to be able to use log_on_success

# and log_on_failure. The default is the following :

# log_type = SYSLOG daemon info


}

#Telnet Setting


service telnet{

        disable=no

        flag= REUSE

        socket_type=stream

        wait=no

        user=root

        server=/usr/sbin/in.telnetd

        log_on_failure+=USERID

}


includedir /etc/xinetd.d



vi /etc/services

맨 밑에


서비스명            포트번호/tcp


vi /etc/xinetd.d/서비스명


service 서비스명

{

        flags = REUSE

        socket_type = stream

        wait = no

        user = root//권한(관리자 권한으로 해놓으면 해커들에의해 권한이 따일수도)

        server = /tmp/test_file//실행될 파일의 경로

        disable = no

}


/etc/init.d/xinetd restart  //서비스 재시작



ex)




xinetd로 돌아가는 프로그램은 사용자의 입력을 그대로 받는다.


즉 scanf 든 gets 든 알아서 입력을 처리해줌







https://developer.android.com/ndk/index.html

에서 ndk 다운후 압축 해제.


sdk를 설치한 디렉토리에 ndk 복사.


sdk와 마찬가지로  환경변수 PATH에 ndk경로 추가.{

vi ~/.bash_profile{

export PATH=$PATH:/ndk경로

}

source ~/.bash_profile

}


안드로이드 스튜디오에서 javah 설정


preference -> tools -> external tools 

javah를 사용하려면 당연히 jdk 설치



Android 에서 Project로 변경후  src/main 디렉토리에서 우클릭 후 JNI 폴더 생성.


JNI구현 순서


자바코드 작성

컴파일후 클래스 파일 얻기

javah 클래스에서 헤더파일 생성

생성한 헤더파일로 c/c++ 코딩

c/c++ 컴파일해서 라이브러리 생성

자바코딩된 어플리케이션에 라이브러리를 포함한 apk생성





원하는 클래스 생성뒤 사용하고싶은 함수 선언.

public class socket {
static {
System.loadLibrary("모듈명");
}
public static native String check(String str);
}

클래스 밑 함수 선언후 clean Project , Rebuild Project 해야함 안하면 클래스인식못해서 헤더파일 생성안댐


그 후에 생성한 클래스에서 우클릭후 javah 클릭 



우클릭 했을 때 NDK랑 javah 안뜨면 external tools 설정 안했기 때문.



jni폴더에 헤더파일 생성되었고 

JNIEXPORT jstring JNICALL Java_com_example_tmdahr1245_problem_socket_check(JNIEnv* env, jclass jc, jstring jstr);

헤더파일내 내가 위에서 사용하고 싶은 함수가 문법에 맞춰 선언되어있음.


JNIEnv, jclass는 반드시 인자값으로 들어가야 하며 내가 원하는 인자값을 만들때마다 뒤에 하나씩 추가댐


jstring을 c언어 char*로 변환할 때 

const char* str = (*env)->GetStringUTFChars(env, jstr, JNI_FALSE);

c언어 char*을 jstring으로 변환할 때 

jstring ret=(*env)->NewStringUTF(env, str);


이제 jni폴더에 c/cpp 파일 생성해서 

#include"com_example_tmdahr1245_problem_socket.h"

해주고 c언어로 코딩하면 사용가능


후에 설정해야 하는것은 


app/build.gradle에서

defaultConfig {
applicationId "com.example.tmdahr1245.problem"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"

ndk{
moduleName"모듈명"
}

}

gradle/gradle.properties에서


android.useDeprecatedNdk=true


gradle/local.properties 에서


ndk.dir=/Users/tmdahr1245/Library/Android/ndk/android-ndk-r12b(ndk 경로)


소캣 통신 할때에는 당연히 android_manifest.xml 에서


<uses-permission android:name="android.permission.INTERNET"/>



코드상 틀린게 없는데 안되면 안드로이드 스튜디오 껏다 키기




'안드로이드' 카테고리의 다른 글

Android Smali Code Example  (0) 2016.08.24

+ Recent posts