graf
정보 수집 본문
요새 학생증이 낡아서 그런가 인식이 잘 안 된다.
그리고 평소에 휴대폰 뒤에 카드를 하나만 꽂고 다니는데
최근에 실수로 카드를 안 바꾸고 학생증을 그대로 꽂고 나가는 바람에
카드가 없어 고생을 좀 했다.
내가 지금 무슨 상황인지가 중요한게 아니다.
난 이 카드를 복제해야겠다.
1. 자료 조사
버스 카드 구조가 어떤 식으로 되어있는지 잘 몰라서 관련 내용을 먼저 조사해봤다.
NFC 교통카드는 대부분 ISO 14443 국제 표준을 따른다고 한다.
모든 카드는 고유한 uid를 반드시 가지고 있으며 이 값으로 각 카드를 구분한다.
교통 카드는 모두 MIFARE 구조를 사용한다는데
그 안에서도 버전이 여러가지가 있다더라.
Classic - sector/block 구조, 취약
Ultralight - 단순 메모리
DESFire - 파일 시스템 + 강한 암호
구조는 크게 이렇게 나눠진다.
Classic은 가장 구형이고 보안에도 취약해서 현재는 거의 사용하지 않고
현재는 거의 대부분 DESFire 방식을 사용한다고 한다.
mifare 구조는 섹터를 여러 개로 나누고 데이터를 관리한다.
데이터를 읽기 위해서는 유효한 키가 있어야하며
단말기는 필요한 섹션의 데이터를 키와 함께 요청한다.
내 학생증은 신용 카드와 선불 교통카드로 사용 가능하다.
이건 추측인데 학교에서는 학생증을 찍을 때마다
버스 카드처럼 인증 정보를 검사하거나
트랜잭션 카운터를 올리지는 않을 것 같다.
선불 교통카드라면 정보의 무결성을 깨는건 현실적으로 어렵겠지만
단순히 인증 정보 복제라면 어렵지 않게 할 수 있을 거다.
학생증은 매번 서버와 통신하며 검증하니
버스카드처럼 복잡한 계산이 들어가지도 않을 거고
단순히 카드에서 어떤 정보가 나가는지만 보면 충분히 가능할 것 같다.

mifare 관련 툴을 찾아봤는데 desfire는 없다.
desfire는 인증을 먼저 수행해야 데이터를 읽을 수 있어 범용 툴이 없다고 한다.
일단 클래식과 울트라 두가지는 깔았다.
이 중에 읽히는게 있나 확인해보자.
2. ultralight 조회
Read mode: tap tag
Read mode: tap tag
=====================
Mode: Read
Tech: [IsoDep, NfcA, NfcA, MifareClassic, NdefFormatable]
UID: 9170F399
Type: Unknown
Pages: 9 (0x00 - 0x8)
9170F3998B2804001C0000000000000000
Pages: 4 (0x00 - 0x3)
=====================
Mode: Scan
Tech: [IsoDep, NfcA, NfcA, MifareClassic, NdefFormatable]
UID: 9170F399
Tech: NFC_A
Type: Unknown
Pages: 9 (0x00 - 0x8)
Waiting for tag to read Counter 1
=====================
Mode: Scan
Tech: [IsoDep, NfcA, NfcA, MifareClassic, NdefFormatable]
UID: 9170F399
Counter command failed. This tag may not support EV1 counters.
=====================
App Instructions:
This App can read and write Magic Mifare Ultralight Tag with full UID.
The Magic Tag must be Direct-Write so it can competible for Android NFC.
Support Tag types:
• Mifare Ultralight UL11
• Mifare Ultralight UL21
• Mifare Ultralight UL-C
• NTAG213
• NTAG215
• NTAG216
=====================
이건 울트라에서 인식한 결과다.
Tech에서 classic으로 나오기도 했고
read count 명령어도 수행을 못하니 울트라는 거의 확실히 아니다.
3. classic 조회

클래식에서 떠버렸다.
총 15개의 섹터가 확인되었다.
클래식 구조는 먼저 섹터 별로 네개의 블록이 있고,
마지막 블록에 트레일러가 들어간다.
Byte 0~5 → Key A
Byte 6~8 → Access Bits (ACs)
Byte 9 → General purpose
Byte 10~15 → Key B
마지막 트레일러는 이렇게 구성된다.
키 두개와 권한 3 바이트까지
구조가 대충 맞는 걸 보면 클래식이 사용된 것으로 보인다.
uid도 4바이트로 끊어지는걸 보면 클래식이 거의 확실해 보이는데
그런데.. 아까 찾아볼 때 클래식 제품은 이제 거의 안 쓴다고 봤었는데 그게 아닌가?


섹터 8과 15는 인식되지 않았다.
몇가지 기본 키로 인식을 시도했고 일치하는 키가 없어 읽어오지 못한 것으로 보인다.
저 두 섹터는 커스텀 키로 보호되고 있다고 봐야겠다.
4. 계획
원래 계획은 통신 프로토콜을 재현해서
하나의 장비가 여러가지 학생증으로 인식될 수 있게 만드는 거였다.
그런데 계획을 바꿔야겠다.
이건 카드 복제가 가능하다.
mifare classic은 crypto1을 사용한다.
이미 기술적으로 깨진 구현이다.
일단 현재 확인된 정보로 추측하자면,
지금 잠겨있는 저 두 섹터는 선불 교통카드가 쓰고 있고
학교에서 학생증을 인증할 때는 기본키로 0번 섹터 uid만 읽어가는 것으로 보인다.
uid 복제는 간단한 단순 작업이 될 거고
만약 내가 이해한게 맞고 클래식의 잠긴 섹터까지 읽을 수 있다면,
카드에 충전된 잔액과 인증 정보까지 복사할 수 있을 거다.
사실상 간이 계좌에서 돈을 빼가는 셈이다.
그리고 counter에 분기가 찍히기 전까지는 클론을 찾을 방법도 없을 거다.
재밌을 것 같다.
시도를 해봐야겠다.
'Proxmark3 > 학생증 복제하기' 카테고리의 다른 글
| 결제 정보 찾기 (2) | 2026.04.18 |
|---|---|
| MIFARE CLASSIC clone 제작 (0) | 2026.04.14 |
| Proxmark3 Easy 환경 구축 (0) | 2026.04.13 |
| MIFARE CLASSIC UID 복사 (0) | 2026.04.10 |
| 장비 구매 (0) | 2026.04.07 |