지돌이의 블로그 입니다!

2014.03.09. 22:13



 infomark 홈페이지에 보면 콤펙트 에그가 USB RNDIS을 지원한다고 써져있습니다.

하지만 USB을 컴퓨터에 연결하면 아무것도 나타나지 않죠...

문의해보니 해외용 제품만 지원한다고 합니다.

하지만 알아냈습니다!

 

시리얼 콘솔 접속한 뒤

root로그인 한 후

 

/etc/init.d/script/rndis.sh start

을 하면 rndis서비스가 시작되어서 USB로도 인터넷 접속을 할 수 있습니다.

저는 /system/etc/sysconfig/wimax/wimax.sh에 스크립트를 추가해서

자동으로 시작되게 해놨습니다.

 

그리고 /etc/RNDISInst.exe 에 RNDIS 드라이버 설치파일이 있습니다.

펌웨어 푼 파일에서 RNDISInst.exe을 추출해서 얻었습니다.

이 파일은 첨부파일에서도 다운받을 수 있습니다.

rndis.iso 파일도 있는데 CD파일이네요.

대충 시스템을 보니 USB을 CD-ROM으로 인식하게 할수도 있는거 같습니다.

그럼 rndis.iso가 나타나구요. 

Comment +0

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

2014.03.01. 21:51



 오늘 하루종일간의 우여곡절끝에!!! 성공했습니다! 

 

우선 OpenSource으로 배포되는 소스를 i386으로 컴파일에서 VMWare에서 사용해볼려고 했는데

실패했었습니다. 커널 패닉이 나더군요.

아무래도 Embedded용으로 축소된 커널이라 그랬나 봅니다.

(여기서 잠깐! 커널 menuconfig으로 보니 이런게 있네요~)

File system -> Miscellaneous filesystem -> SquashFS 2.2 의 서브메뉴를 보면 

 Image has a dummy cramfs header (8bytes) 요로코롬 어제 cramfs로 오인하게한 주범이 있었네요~ㅋ

 

 

그래서 비슷한 버젼의 커널을 다운받아서 squashfs파일을 을 복사하고 좀 수정하고 컴파일 한 뒤 

VMWare에서 실행해보니 잘~ 됩니다.

그런데.. 문제가 생겼습니다. 

마운트를 하려는데... 

squashfs version이 0x0002, 0x0001 이어야 하는데 60(0x003c), 17717(0x4535)라고 하면서 마운트가 

되지 않는겁니다!... 

그래서 HexEditor으로 확인해봤더니 원래 있어야 할 버젼 위치에 00 02 00 01이 있었습니다.

맞는데... 이상하다.... 했는데 보니깐 8Bytes앞의 내용이 00 03 45 35이더군요. 8bytes라.. 어디서 많이 본거같지 않나요??

바로 dummy cramfs header입니다!

그런데 왜 오류가 나지?? 생각했습니다. 분명히 이건 잘 작동하는 커널일텐데...

커널 소스를 보기 시작했죠.

구조체도 문제 없었습니다. 커널설정에서 Image has a dummy cramfs header을 체크하면

구조체 앞에 8bytes만큼 cramfs 헤더가 생겼습니다.

 

inode.c 에

s_magic을 SQUASHFS_MAGIC랑 비교해서 안되면 SQUASHFS_MAGIC_SWAP와 비교하는 루틴이 있습니다.

SQUASHFS_MAGIC랑 같으면 System 이랑 같은 Endian이고,

SQUASHFS_MAGIC_SWAP랑 맞으면 System이랑 다른 Endian이란거죠.

 

저는 당연히 Little Endian 플랫폼에서 컴파일을 했으니 마운트하려고 하면 SQUASHFS_MAGIC_SWAP랑 맞아서

다른 Endian이라고 인식했겠죠.  분명히 다른 Endian에서 문제가 생길것이다.. 생각하고..

(1차에서 보시면 아시겠지만 GDM7205K는 Big endian이라서 문제가 생기지 않았던 겁니다.)

봤더니 바로 아래 SQUASHFS_SWAP_SUPER_BLOCK(&sblk, sBlk); 란게 있더군요.

Endian에 맞게 구조체에 반영하는 함수(사실은 Define입니다)입니다.

 

또 이걸 찾아보니...

#define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\

 SQUASHFS_MEMSET(s, d, sizeof(squashfs_super_block));\

 SQUASHFS_SWAP((s)->smagic, d, 0, 32); \

 SQUASHFS_SWAP((s)->inodes, d, 32, 32); \

.....

딱 보면 아시겠지만 SQUASHFS_SWAP(대상, 원본, 원본offset(bits수), 크기(bits수)) 입니다.

좀 이상하지 않나요?? Dummy cramfs header환경 에서는 8bytes(64bit)가 앞에 있어서 더해줘야 하는데...

하고 CONFIG_SQUASHFS_CRAMFS_MAGIC 가 설정되어 있으면 오프셋에 64을 더하게 수정하려다가...

그냥 inode.c에서

SQUASHFS_SWAP_SUPER_BLOCK(&sblk, sBlk); 이걸

SQUASHFS_SWAP_SUPER_BLOCK(&sblk, (void*)(((uint8_t*)sBlk)+8));

으로 바꿔줬습니다.

다시 컴파일한뒤 입혀보니...

 

mount -o loop -t squashfs rootfs.img ./mnt

을 하니.... 됩니다~~~~~~!!!!!!!!!!!!!!!~~~~~~~~~~!!!!!!!!!! 이렇게 기쁠수가!!ㅋㅋㅎㅎ

mnt을 보니.... 있습니다~~!!!!!! 파일들이!!!!

커널패닉도 안나여~!!

 

 bin   etc     init   lib       mnt    rom  sbin  system  usr

 dev  home  jffs2  linuxrc  proc  root  sys   tmp       var

 

 

이렇게 rootfs보는게 기쁠수가!!!

 

콤펙트에그 내부를 보면 RXD ,TXD UART핀이 있습니다.

그걸 터미널로 보면 부팅이 된 뒤 엔터를 누르면 login화면이 나타납니다.

그런데 root비밀번호를 몰라서 접속을 못했었죠..ㅠㅠ

 

바로 /etc/passwd부터 확인했습니다.

root:$1$P4IGnq8m$mgWoT4ccaDsJQdCPSAdyc1:0:0:root:/root:/bin/sh
nobody:$1$SUEXw8JF$hVyihRpBCrZDRiyTYLiQo/:503:1:Linux User,,,:/home/nobody:/bin/sh
guest:$1$ZnJXP0iT$4q5wTYt4tp4FOhg0LBVQL1:504:1:Linux User,,,:/home/guest:/bin/sh
httpd:$1$Go9d2VDh$hdugAVl/aSXpKyhN95LPZ1:505:0:Linux User,,,:/home/httpd:/bin/sh

오호~ 비번이!

물론 암호화되서 원래 비번을 알진 못하지만... 알아낸다면 shell에 접속할 수 있을겁니다!!

 

펌웨어 분석 COMPLETED!!!  

 

 

KWF-B2700 (콤펙트에그) 펌웨어 분석... 1차 보기 : http://ablog.jichanng.pe.kr/90191276386 

 

 

혹시 i386으로 컴파일된 커널모듈과 이미지가 필요하심 요청하시면 보내드리겠습니다.

2.6.34.15 squashfs수정한 커널소스 / 컴파일된 Image, 모듈 / VMWare이미지

Comment +4

  • 질문자 2018.07.19 12:43

    안녕하세요
    펌웨어 분석하다가 문의드립니다.
    Infomark최신 에그장비 펌웨어를보면 Squashfs 4.0버전, xz압축 포맷을 사용하고 있어 해당 버전과 압축 포맷에 맞게 squashfs-tools를 재컴파일해서 풀어보려고하는데 잘안되네요... 혹시해보셨거나 참고할 부분이 있을가요?

2014.02.28. 19:26


KWF-B2700펌웨어를 분석하는데... 일부러 분석하기 어렵게 그런건지 아닌건진 모르겠지만.. 

구조가 좀 웃기다;;

 

> binwalk KWF-B2700.bin

DECIMAL    HEX        DESCRIPTION

-------------------------------------------------------------------------------------------------------------------

14944      0x3A60     LZMA compressed data, properties: 0x6D, dictionary size: 8388608 bytes, uncompressed size: -1 bytes

854644     0xD0A74    CramFS filesystem, little endian size 3964928 version #2 sorted_dirs CRC 0x8c5a3c00, edition 16777728, 268466059 blocks, 1358954816 files

 

여기서 CramFS라고 나오지만.. 이것은 뻥이다.

firmware-mod-kit 으로 분리된 rootfs.img 파일의 0x00번부터의 내용이다.

45 3D CD 28 00 80 3C 00 73 71 73 68 00 00 03 E9   E=I(.€<. sqsh...e

....

cramfs의 헤더구조는

 

struct cramfs_super {

        u32 magic;              /* 0x28cd3d45 - random number */

        u32 size;               /* Not used.  mkcramfs currently

                                   writes a constant 1<<16 here. */

        u32 flags;              /* 0 */

        u32 future;             /* 0 */

        u8 signature[16];       /* "Compressed ROMFS" */

        u8 fsid[16];            /* random number */

        u8 name[16];            /* user-defined name */

        struct cramfs_inode root;       /* Root inode data */

};

이렇다.

 

처음 45 3d cd 28 (0x28cd3d45) 는 CramFS의 magic와 일치하다.

하지만 uncramfs으로 unpack하려고 시도했더니 flags 을 체크하는 부분에서 오류를 뱉어버린다.

그래서 Hex을 보았더니... sqsh 란 저 네 글자가 떡! 하니 보이는게 아닌가!

...처음부터 Hex으로 봤으면 cramfs에 대해 삽질하지 않았을 텐데...ㅠㅠ

 

쨋든.. 앞의 8bytes을 버리고 binwalk으로 다시 확인해 보았다.

> binwalk rootfs_sqsh.img

DECIMAL    HEX        DESCRIPTION

-------------------------------------------------------------------------------------------------------------------

0          0x0        Squashfs filesystem, big endian, version 2.1, size: 3962795 bytes, 1001 inodes, blocksize: 65536 bytes, created: Wed Feb 13 17:33:35 2013

 

참고로 KWF-B2700의 SoC는 WiMAX가 내장된 GDM7205K 칩셋을 사용한다.

ARM926E RISC CPU에 160MHz 드리고 Big Endian

http://www.gctsemi.com/html/WiMax.html 에서 GDM7205 Product Brief 을 보면 좀더 자세히 나와있다.

 

버젼을 보니 2.1이라서 squashfs-2.1 unsquashfs으로 풀어볼려고 했더니

Reading a different endian SQUASHFS filesystem on rootfs_sqsh.img

zlib::uncompress failed, unknown error -3

세그멘테이션 오류 (core dumped)

 

오류가;;

http://infomark.co.kr/oss/lgpl.html 여기에서 커널 소스를 다운받아 보았더니 Squashfs 2.2을 사용한다.

그레서 2.2로 풀려고 했는데...

Reading a different endian SQUASHFS filesystem on rootfs2_sqsh.img

세그멘테이션 오류 (core dumped)

 

그넘의 세그멘테이션 오류...ㅠㅠ

아무래도 Non-Standard방식의 Squashfs을 사용하나 보다.

 

... 여기서 마무리..

더이상 파고 들어가기엔 힘들다..ㅠㅠ

커널소스를 분석하던지 해야 할텐데... 거기까진..ㅠㅠ

Comment +0