웹 · 앱 보안 실습

2026. 8. 3. 19:26·웹 · 앱

목차

  1. [[#1. APK 내부 구조]]
  2. [[#2. Act 1 - APK 파일 분해 (apktool)]]
  3. [[#3. Act 2 - ADB 실습]]
  4. [[#4. 안드로이드 디렉토리 트리 꿀팁]]

1. APK 내부 구조

APK는 사실 ZIP 압축 포맷을 그대로 사용한다. 확장자만 다를 뿐 .docx, .xlsx, .jar 등과 같은 원리다.

주요 구성 요소

구성 설명
AndroidManifest.xml 앱의 설정 파일. 패키지명, 권한(permission), 액티비티/서비스 목록, 최소 SDK 버전 등 앱의 모든 메타 정보가 담긴 가장 중요한 파일
classes.dex Java/Kotlin 소스코드가 컴파일되어 안드로이드 런타임(ART/Dalvik)이 실행 가능한 바이트코드로 변환된 파일. 실제 앱 로직이 담긴 실행 파일
resources.arsc 컴파일된 리소스 인덱스 파일. res/ 안의 문자열·이미지 등을 앱 코드에서 ID로 참조할 수 있게 매핑해주는 바이너리
res/ 리소스 원본 저장 디렉토리
lib/ 네이티브 라이브러리(.so) 저장 디렉토리. C/C++로 작성된 코드 — 주로 게임 엔진, 암호화/보안 로직에 사용되어 리버싱 난이도가 높은 영역
assets/ 코드에서 직접 파일 경로로 접근하는 원본 파일 저장소 (동영상, 폰트, DB 파일 등). res/와 달리 컴파일되지 않고 그대로 포함됨
META-INF/ 앱 서명(인증) 정보 저장 디렉토리

res/ 하위 디렉토리

디렉토리 내용
layout/ 화면 레이아웃 XML
drawable/ 이미지·아이콘 리소스
values/ 문자열, 색상, 스타일 등 값 정의

lib/ 하위 - CPU 아키텍처별 폴더

폴더 대상
arm64-v8a/ 최신 64비트 ARM (대부분의 실제 기기)
armeabi-v7a/ 구형 32비트 ARM
x86/ 32비트 인텔 (일부 에뮬레이터)
x86_64/ 64비트 인텔 (일부 에뮬레이터)

META-INF/ 상세

파일 역할
MANIFEST.MF 패키지 내 각 파일의 해시값 목록
CERT.SF MANIFEST.MF에 대한 서명값
CERT.RSA (또는 .DSA) 개발자의 실제 인증서(서명) 정보

2. Act 1 - APK 파일 분해 (apktool)

실습 순서

bash

# 1. 실습용 APK 준비
# InjuredAndroid_oldversion.apk

# 2. 작업용 폴더 생성 후 apk 파일 이동
mkdir bbb
mv InjuredAndroid_oldversion.apk bbb/
cd bbb

# 3. apktool로 디컴파일
apktool d InjuredAndroid_oldversion.apk

AndroidManifest.xml 확인

압축만 풀었을 때는 바이너리라 열리지 않던 AndroidManifest.xml이, apktool로 디컴파일한 후XML 텍스트로 변환되어 내용을 확인할 수 있다.

classes.dex → smali 변환

디컴파일 폴더/
├── AndroidManifest.xml   ← 읽을 수 있는 XML로 복원됨
├── res/
├── lib/
├── assets/
└── smali/                ← classes.dex가 역어셈블된 결과물

3. Act 2 - ADB 실습

ADB(Android Debug Bridge)는 PC에서 안드로이드 기기(또는 에뮬레이터)를 명령어로 제어하는 도구.

기본 명령어 정리

명령어 설명
adb devices 연결된 기기/에뮬레이터 목록 확인
adb shell 기기 내부 쉘 접속
whoami (쉘 안에서) 현재 접속 계정 확인
pm list packages 설치된 앱 패키지 목록 전체 조회
pm list packages -f 패키지명과 APK 경로를 함께 조회
pm path <package_name> 특정 패키지의 APK 설치 경로 확인
adb pull <기기경로> <로컬경로> 기기 내 파일을 PC로 추출
adb push <로컬경로> <기기경로> PC 파일을 기기로 전송
adb install <apk경로> APK 설치
adb root adb 데몬을 루트 권한으로 재시작 (에뮬레이터/루팅 기기에서 가능)
adb unroot 루트 권한 취소, 일반 권한으로 복귀

실전 흐름 - 설치된 앱의 APK 추출하기

bash

# 1. 패키지명 확인
adb shell pm list packages | grep injured

# 2. 해당 패키지의 실제 설치 경로 확인
adb shell pm path com.injuredandroid

# 출력 예: package:/data/app/com.injuredandroid-1/base.apk

# 3. 해당 경로의 apk를 PC로 추출
adb pull /data/app/com.injuredandroid-1/base.apk ./extracted.apk

4. 안드로이드 디렉토리 트리 꿀팁

외부 저장소(SD카드) 경로 별칭

아래 세 경로는 모두 같은 위치를 가리킨다 (심볼릭 링크로 연결됨).

/mnt/sdcard  ==  /sdcard  ==  /storage/emulated/0

5. ACT 3 - ADB 실습

설치된 패키지 제거
adb uninstall <설치 패키지 이름>

로그 확인
adb logcat
ㄴ 중요 정보 노출되는지 정규화 포맷 적용해서 확인 가능함

adb shell ls

adb shell ps -A
ㄴ 현재 접속한 쉘 계정 내 동작하는 프로세스 정보 확인(UID)

pm -- 명령어 > 패키지
am -- activity 컴포넌트 관련 명령어

'웹 · 앱' 카테고리의 다른 글

웹 애플리케이션 보안 취약점  (1) 2026.09.12
DVWA  (0) 2026.09.11
딥링크(Deep Link) 개념  (0) 2026.08.15
Burp Suite로 HTTP 기초 세우기  (0) 2026.08.04
웹 보안  (0) 2026.08.03
'웹 · 앱' 카테고리의 다른 글
  • DVWA
  • 딥링크(Deep Link) 개념
  • Burp Suite로 HTTP 기초 세우기
  • 웹 보안
돌아온무니
돌아온무니
게임 개발 육성 모험 RPG...!
  • 돌아온무니
    무니의 개발일지
    돌아온무니
  • 전체
    오늘
    어제
    • 분류 전체보기 (91) N
      • C++ (16)
        • STL (3)
      • 자료구조 (3)
      • 알고리즘 (13)
        • DFS (1)
        • BFS (1)
      • 깨알 지식 (7)
        • 암호화 (4)
      • 코테 스터디 (2)
      • 운영체제 (8)
        • 공룡책 (4)
      • 악성코드 (3)
        • 스텍 프레임 변조 (3)
      • 네트워크 (2)
      • 게임수학 (8)
        • CK소프트렌더러 (4)
      • Unity (3)
        • Spine-unity (1)
      • Unreal Engine (3)
      • 웹 · 앱 (7)
      • 데이터베이스 (6)
      • Ansible (4)
      • Docker (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

돌아온무니
웹 · 앱 보안 실습
상단으로

티스토리툴바