짱짱해커가 되고 싶은 나

[안드로이드 취약점 진단] 2-2. adb 본문

모바일

[안드로이드 취약점 진단] 2-2. adb

동로시 2022. 6. 9. 14:05

ADB(Android Debug Bridge)

안드로이드 에뮬레이터나 실제 연결된 장치를 제어하기 위한 안드로이드 디버깅 도구

 

ADB 구성요소

  • client : 안드로이드 개발 시스템에서 실행, 사용자가 adb 명령 실행 -> 쉘에서 client 호출
  • server : 안드로이드 개발 시스템의 백그라운드 프로세서, 클라이언트, 에뮬레이터, adb demon 사이 통신 관리
  • demon : 에뮬레이터나 장치에서 background 프로세서로 동작하는 인스턴스
ADB client 시작 -> 서버 프로세서 실행 상태 확인 및 서버 구동 -> TCP 5037 포트에 바인드 -> 서버가 동작 중인 모든 에뮬레이터/장치 인스턴스에 대한 연결을 설정 -> 포트 번호 555~5585의 홀수 번호의 포트 스캐닝 -> ADB 데몬 발견 시 해당 포트에 연결

 

device 장치 선택

연결된 장치가 1대이면 별도로 선택하지 않아도 됨

  • 연결된 장치 확인
adb devices

-> 결과는 [시리얼 번호] [상태] 로 구분

시리얼 번호 : 에뮬레이터나 장치를 구분하기 위해 타입과 함께 콘솔 포트 번호 표시

상태 : 연결되어 있지 않거나 응답이 없을 경우 device 위치에 offline이라고 뜸, 연결되면 device로 상태 변경

  • adb 실행 with device 선택 옵션
    • -d : USB 장치
    • -e : 에뮬레이터
    • -s : 같은 종류의 장치가 여러 개 연결되어 있을 때 
//usb 장치나 에뮬레이터 장치가 1개씩 있을 때
adb -d shell //usb
adb -e shell //에뮬레이터

//장치별로 2개씩 있을 때
adb - s <장치명> shell

 

adb 디버그 기능

  • logcat : 안드로이드 장치에서 발생하는 로그 메시지 화면 출력 or 파일 형태로 저장
    • -b [ buffer<radio | events | main> ]
      • radio : radio/telephony 관련 메시지
      • events : 이벤트 관련 메시지
      • main : 메인 로그 버퍼(default)
    • -c : 기록된 로그 메시지 삭제 & 종료
    • -d : 로그 메시지 화면에 덤프하고 종료
    • (-d) -f <filename> : d 옵션 없이 쓰면 작업 중단 신호가 입력될 때까지 로그 메시지 기록
    • -g (-b <radio|events|main>) : 선택된 버퍼의 크기를 출력하고 종료, 기본으로 main이 선택되어 있음
    • -n <count> -r <로그 파일 용량> -f <파일 이름> : n 옵션이 없으면 기본값으로 4개 설정, 파일이름은 filename.1, .2로 저장 (숫자가 낮을수록 최신 로그)
    • -r <kbytes> : 파일로 저장하는 경우, 파일 용량 설정 옵션
    • -s (ActivityManger:I) : 기본 필터의 종류를 slient로 변경하도록 설정, 모든 메시지를 출력하지 않도록 하고 입력된 태그만 사용자가 확인
    • -v <format> : 특정 메타데이터 필드를 선택해서 출력
      • brief : 우선순위/태그, 메시지가 발생한 프로세스의 pid 출력 (default)
      • process : pid 출력
      • tag : 우선순위/태그 출력
      • raw : 원본 메시지만 출력
      • time : 날짜, 호출 시간, 우선순위/태그, pid 출력
      • threadtime : time + thread의 tid 출력
      • long : 모든 메타데이터 필드와 메시지 표시 (각 메시지당 한 줄씩 공백 생성)
//방법 1
adb logcat

//방법 2
adb shell
root@test# logcat

 

-> 로그캣을 종료하지 않으면 실시간으로 계속 출력

안드로이드에서 발생하는 모든 로그는 태그보다 우선수위를 갖는다.

(태그 : 시스템 구성 요소를 나타내는 짧은 문자열, ex.D/dalvikvm : dalvikvm 요소에서 발생한 로그 메시지)

우선순위 : 로그의 가장 앞 1문자
V : verbose (가장 일반적)
D : debug
I : info
W : warning
E : error
F : fatal
S : silent (가장 높은 우선순위)

-> 로그캣 필터링 ㅣ기능

filter expressions - tag:priority로 구성 (우선순위는 최소한위 등급, 공백을 통해 구별 & 여러 개 설정 가능)

adb logcat ActivityManager:I art:I *:S

(*:S는 모든 메시지가 출력되지 않도록 하는 것)

 

bugreport (버그 보고서)

dumpsys, dumpstate, logcat 명령 결과를 한 번에 출력

  • dumpsys : 연결된 장치 정보를 자세히 표시 (ex. adb shell dumpsys meminfo)
    • meminfo, cpuinfo, account, acitivity, window, wifi, pwoer 등
  • dumpstate : 연결된 안드로이드 장치의 모든 상태 정보 출력
  • logcat
adb bugreport

 

Jdwp (프로세스 정보 확인)

안드로이드에서 사용할 수 있는 jdwp(Java Debug Wire Protocol) 프로세스 목록 출력

  •  jdwp : java 애플리케이션의 디버깅에 사용 -> 특정 애플리케이션의 프로세스 번호를 알아내고 디버거에 연결해서 디버깅 수행 (Ctrl^C로 명령 취소) (제일 마지막에 새롭게 추가된 프로세스 번호 = jdwp 프로세스 번호)
  • jwdp 명령 수행 -> 대상 애플리케이션 실행 -> 다시 jdwp 명령 수행 -> 새롭게 추가된 항목 = 대상 pid 확인

 

데이터 기능

  • install : 장치에 원하는 apk 설치
adb install ~.apk
  • uninstall <패키지명> : 장치에 원하는 apk 삭제
//패키지 이름 확인 방법 ex. 인시큐어뱅크
adb shell pm list packages -f | grep insecurebankv2

//apk 삭제
adb uninstall com.android.insecurebankv2

  • adb pull <파일 위치> <저장 위치> : 장치에 저장된 파일을 PC에 복사
adb pull /sdcard/testfile.txt c:\android\testfile.txt
  • adb push <파일 위치> <저장 위치> : pc에 저장된 파일을 장치에 복사
    (저장 위치와 파일명은 권한을 갖고 있을 경우 임의 변경 가능)
adb push c:\android\testfile.txt /sdcard/pulltest.txt

 

포트와 네트워킹 기능

  • forward <호스트> <기기> : 특정 로컬 포트를 안드로이드 장치의 특정 포트와 소켓 통신이 가능하도록 포워딩
    - 단, usb 디버깅 옵션이 활성화되어 있어야 가능
    • tcp:<portnum>
    • local:<UNIX domain socket name>
    • dev:<character device name>
    • jdwp:<pid>
      특정 app을 대상으로 디버깅을 하기 위해 호스트 포트와 jwdp pid 연결
      이후 jdb를 이용해 대상 애플리케이션에 대한 디버깅 활성화
adb forward tcp:7777 tcp:8888

-> 호스트의 7777 포트가 장치의 8888 포트로 전달

adb forward tcp:7888 jdwp:1824

jdb -sourcepath .\src -connect com.sun.jdi.SocketAttach:hostname=localhost.port=7888

 

스크립팅 기능

  • get-serialno : 연결된 장치의 시리얼 번호 문자열로 출력 (adb devices 명령을 수행했을 때 나오는 장치 이름)
  • get-state :연결된 장치의 상태를 문자열로 출력 (adb devices 명령을 수행했을 때 나오는 상태)
  • wait-for-deivce <명령어> : 연결된 장치가 구동될 때까지 adb를 통한 명령 실행을 멈춰놓고, 실행되면 설정된 명령어 실행
adb wait-for-device shell getprop

 

서버 기능

  • set-start : adb 서버 프로세스가 동작하는지 여부 확인 -> 동작하지 않으면 서버 구동
  • kill-server : adb 서버 종료

쉘 기능

  • shell : 기기를 원격 쉘을 사용할 수 있도록 하는 기능
    리눅스와 비슷한 환경에서 대상 장치 제어 가능 (리눅스 기본 명령어, 쉘 환경에서 사용할 수 있는 명령어)
Comments