티몬에서 UHD TV를 싸게 팔고 있어 해피머니 10만원당 93000원에 구매해서 티몬 캐쉬 30만원 충전한뒤 구입하니 더 싸졌다 +_+
<Fig1. 득템>
어쨋든 이놈은 태생이 TV인지라 기본으로 Sharp filter가 적용되어 있기 때문에 모니터로 쓰기엔 가독성이 너무 떨어진다.
구글링을 통해 유출인지 찾은건진 모르겠지만 어떤 능력자가 관리자 모드 (팩토리 모드)를 공개줬다.
(리모콘에서 메뉴 -> 1147 입력)
<Fig2. 팩토리 모드>
팩토리 모드에서 Sharp filter를 끌 수 있지만 재부팅하면 다시 초기화되는 치명적(?) 약점을 가져 아예 펌웨어 분석한 뒤 디폴트로 Sharp를 없애려고 분석을 시작했다.
<Fig3. 왜 찾질 못하니>
펌웨어 파일은 4메가 정도 되며 펌웨어 구조 분석한 문서가 아무것도 없다.
또한 binwalk에도 똥만 가득 출력되서 직접..펌웨어 포맷을 분석하는 방법 밖에 없다....
처음으로 UHD를 샀고.......a/s도 2년 짜리라.........감히 Teardown을 못하겠다......UART를 찾아야 빠른데...... 안돼! a/s받아야돼!!
맨땅에 해딩 ㄱㄱㄱ
<Fig4. UHD로 디아 하면 짱임>
0x22080 부터 file 구조체가 있는 것을 확인할 수 있다. 4byte ADDR, 4byte SIZE, 3byte Type 순으로 기록되어 있는 것을 확인할 수 있다.
<Fig5. Zepa firmware file structure>
구조 파악했으니 얼릉 분리하고 분석 해봐야징 ^^*
<Fig6. Zepa firmware extract>
fig7는 분해된 데이터이며 ZEPA TV 있는 사람이라면 부팅 시 나오는 로고인 DIGITAL LED TV가 00308d10.jpg 파일로 존재하는 것을 확인할 수 있다.
<Fig7. files>
식별 할 수 있는 파일들은 확장자로 구분했다.
해당 TV의 OS는 embedded Linux이며 모든 관리는 커널에서 관리한다.
분석해보니 HDMI 2.0 쓰면 TV에서 알아서 그래픽 모드로 진입해서 SHARP 기능을 끄는 루틴이였다;;
이후 GTX 970 사서 껴보니 Sharp filter가 자동으로 꺼졌다! ㅎ...........
더 상세한 내용은 저작권(?) 문제가 될 수 있으니, 자세한건 여러분이 분석하세요.
펌웨어 수정해서 올리지 마세요. 벽돌 될 수 있습니다. 전 못고치며 모든 책임은 당신에게 있습니다.
얘는 크로마 서브샘플링(Chroma subsampling)을 지원하니 출력색은 ycbcr444으로 하세용^^*
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import struct print "##############################################" print "# Zepa Firmware Extractor v0.01 #" print "# #" print "# hacked by koha <kkoha@msn.com> #" print "##############################################\n" f = open ( "MSD3458_8M.bin" , "rb" ) f.seek( 0x22090 ) addrl = [] sizel = [] for i in range ( 20 ): addr = f.read( 4 ) addrl.append(addr) size = f.read( 4 ) sizel.append(size) unknown = f.read( 3 ) print str (i) + " : " + addr.encode( 'hex' ) + " " + size.encode( 'hex' ) for i in range ( len (addrl)): addr = struct.unpack( '>l' ,addrl[i])[ 0 ] size = struct.unpack( '>l' ,sizel[i])[ 0 ] f.seek(addr) data = f.read(size) fname = addrl[i].encode( 'hex' ) + ".bin" if data[ 0 ] = = "\x5D" : fname = addrl[i].encode( 'hex' ) + ".lzma" if data[: 3 ] = = "\xff\xd8" : fname = addrl[i].encode( 'hex' ) + ".jpg" open (fname, "wb" ).write(data) < / kkoha@msn.com> |