侯智晟-meowheckerouo@gmail.com **Outline** [TOC] ARM Simulator https://cpulator.01xz.net/?sys=arm-de1soc ARM -> Advance RISC Machine # Layout 面版 ## Register ![](https://hackmd.io/_uploads/H1PXMqmr3.png) r0 ~ r6 Normal Registers r7 -> systems call ### sp (Stack pointer) Tell us next usable Address (Base on stack memory) ### lr (link register) Invoke function ; 保存子例程調用完成時要返回的地址的寄存器 ### pc (program counter) -> Trace next Instruction 的 memory address ### Stack Memory Stack Memory -> Computer RAM ![圖片](https://hackmd.io/_uploads/Hyr6G67FC.png) Address 1 = 1 Byte Address 0x10 -> 16 Byte ![](https://hackmd.io/_uploads/HJ58VcmSh.png) ### cpsr(current program status register ) 有flag 會標示 數值 正負 ### spsr (save program status register) 要不要進位 是否 overflow # First Program ## Assebbler Language:Basic Syntax ``` lable opcode oprand1, oprand2... #Commands ``` ### Label Address 標記 ### opcode 指令操作碼 ### operand 不同指令則有所不同個operand ![](https://hackmd.io/_uploads/r1-hGoXrh.png) --- ``` mov R1 #1 ``` ## Register 7 ### systems invoke - Manage - input - ouput - process exec - Communication - systems interrupt R7 #1 - systems invoke -> 查 table ->找出對應的Instruction 用法 assign value 給 register 7 ## mov Register Assignment! ``` .global _start _start: MOV R0,#0x01 MOV R7,#1 SWI #0 ``` ![](https://hackmd.io/_uploads/HyoeTq7rn.png) ## SWI(Software Interrupt) Interrupt Process ``` SWI #0 ``` ## Little-Endian ![](https://hackmd.io/_uploads/S1VxyjmHh.png) # Address Model ## Register Immediate Addressing (立即尋址) 表示 能夠立即的賦值 操作 ![](https://hackmd.io/_uploads/H1_b7iQHn.png) ## Register Indirect Addressing 類似 Pointer ![](https://hackmd.io/_uploads/SJiNtjXH3.png) r0 -> stack Address ## Stack 把data 放在 Stack memory 中 ``` .global _start _start: .data list: .word 1,2,3,4,5,-1,-2 ``` .data 定義 Memory 的數據段 list -> Varaiable .word -> 為Data type -> 32 bit ### LDR From Stack to Register Syntax ``` LDR R1 R2(Address), #offset ``` R2 #4 == *(R2) +1 Offest 1 = One Bytes ``` .global _start @ 定义 _start 符号为全局符号 _start: @ 定义 _start 标签 LDR R0,=list @ 把list的地址装载到寄存器R0中 .data @ 定义数据段 list: @ 定义一个名为 list 的符号,用于访问数据段中的数据 .word 1,2,3,4,5,-1,-2 @ 在 list 符号指向的位置定义一些整数值 ``` =list Return memory Address ![](https://hackmd.io/_uploads/BkuDVdOrh.png) ![](https://hackmd.io/_uploads/SkAd4_urh.png) code 2 ``` .global _start _start: LDR R0,=list #=list like list[] LDR R1,[R0] .data list: .word 1,2,3,4,5,-1,-2 ``` [] -> 取value *R0 -> R1 Regitser ![](https://hackmd.io/_uploads/rJeO9udB3.png) ![](https://hackmd.io/_uploads/HyPKq_drh.png) code3 ``` .global _start _start: LDR R0,=list @ RO = *(list[]); LDR R1,[R0] @ *R1=*(R0); LDR R2,[R0,#4] @ *(R2)=*(R1+1) .data list: .word 1,2,3,4,5,-1,-2 ``` ![](https://hackmd.io/_uploads/By6Pj_dSh.png) ![](https://hackmd.io/_uploads/SkmFsduS2.png) ### Pre Increase syntax ``` LDR R2, [R0 #4]! ``` 先對 R0 做偏移取值 再存到R2這個 Register ![](https://hackmd.io/_uploads/Sk7N6d_B2.png) ![](https://hackmd.io/_uploads/HkiE6_urn.png) ### Post Increase syntax ``` LDR R2,[R0],# ``` ``` .global _start _start: LDR R0,=list @ RO = *(list[]); LDR R1,[R0] @ *R1=*(R0); LDR R2,[R0],#4 @ *(R2)=*(R1+1); .data list: .word 1,2,3,4,5,-1,-2 ``` ![](https://hackmd.io/_uploads/SyiYC_dBh.png) ![](https://hackmd.io/_uploads/Skj_RO_rh.png) # Arithmetic CPSR (Current programe status register ) ``` .global _start _start: MOV R0,#6 MOV R1,#9 ADD R2,R1,R0 SUB R3,R1,R2 @-3 MOV R4,#-3 MOV R5,#0xffffffff ``` ## CPSR CPST -> 4 bit - negative - zero - carry - overflow ![](https://hackmd.io/_uploads/HJPNBYdSh.png) ### Negative flag ![](https://hackmd.io/_uploads/H1Qj4KuB2.png) 當有 SUB command -> N flag 會根據計算結果來設定flag ![](https://hackmd.io/_uploads/ry6zBF_Bn.png) ### Zero flag ![](https://hackmd.io/_uploads/ByxslUYOr3.png) ### Carry flag 0xffffffff + 0x00000000a = 1(carry -> carry flag set 1 ) + 0x000000009 ![](https://hackmd.io/_uploads/ByTD8Furh.png) ### ADC ADD oprand + carray 操作 ![](https://hackmd.io/_uploads/Hk9noKurn.png) # Logical Operation ## And Operation ``` .global _start _start MOV R0, #0xffffffff MOV R1, #0x21 AND R2, R0, R1 ``` R2 -> 0x21 ![](https://hackmd.io/_uploads/rJlUlTF_H2.png) ## OR Operation ![](https://hackmd.io/_uploads/BkSBhFuBn.png) ## EOR Operation Exclusive OR 1 0 -> 1 0 1 -> 1 0 0 -> 0 1 1 -> 0 ![](https://hackmd.io/_uploads/Hk-V6K_H3.png) ## MVN Move Negative 0x000000ff --Negative--> 0xffffff00 255 -> -256 --- -256 原因 0x80000100 -> remote 符號未 再取補數 ->0xfffffEff-> 補數+1 ->0xffffff00 (逆推) ![](https://hackmd.io/_uploads/BJlq1cdS2.png) ![](https://hackmd.io/_uploads/Hy-F15uH3.png) ## Remove 特定的Bit(And operation) And Op Remote bit -> set 0 reserve bit -> set 1 # Logical Shift/Rotaion ## Shfit ``` .global _start _start: @logical shifting @left MOV R0,#10 LSL R0,#1 //R0*2 @right MOV R1,#10 LSR R1,#1 //R1/2 ``` ### LSL (logical shift left) value * 2 00000101 -> 0001010 5 -> 10 ``` MOV R0,#10 MOV R1,R0,LSR #1 //R1 = R0/2 ``` ### LSR (logical shift right) value / 2 00000101 -> 00000010 5 -> 2.5 -> 2 00000011 -> 00000001 3 - > 1.5 -> 1 ## Rotation ![](https://hackmd.io/_uploads/B1L2u5OSh.png) LSR 最小的bit 有消失的問題 ### ROR ``` .global _start _start: MOV R0,#0x0f ROR R0,#1 ``` # Condiction and Branch ## CMP compare 但不跳轉 (條件句大哥) syntax ``` CMP R0, R1 ``` (R0 - R1) -> 如果為 Negative -> CPSR: N flag = 1 ## Cmpare and Jump to Branch 會去看 CPSR flag 來去執行其他操作 ### BGT (Branch if greater than) ">" ``` .global _start _start: MOV R0,#3 MOV R1,#2 CMP R0,R1 //R0-R1 BGT greater MOV R2,#2 greater: MOV R2,#1 ``` 如果 jump 到 greater label(Branch) -> MOV R2, #2 會被skip掉 ![](https://hackmd.io/_uploads/Bye3ZjdB2.png) ### BLT (Branch if less than ) "<" ### BLE "<=" ### BEQ "=" ### BNE "!=" ## Jump to Branch ### BAL (branch and link) Notice: 他不會把 Next instruction Address 純在LR 裡面 ![](https://hackmd.io/_uploads/ryrPGj_r2.png) ![](https://hackmd.io/_uploads/ByAdfs_Hn.png) # Loop And Branch ## BAL ``` .global _start _start: LDR R0,=list @Ro == list 入口 .data list: .word 1,2,3,4,5,6,7 ``` ![](https://hackmd.io/_uploads/SJXOXs3r3.png) 類似於 C Language "\n" ``` .equ endlist 0xaaaaaaaa ``` ![](https://hackmd.io/_uploads/S1Ir4ohS2.png) C language ![](https://hackmd.io/_uploads/r1XnNj2r3.png) ``` for (int i =0; i< array/size of (int);i++){ if (array[i] != "\0"){ a=a+i; i++; } } ``` ARM ``` .global _start .equ EOF, 0xaaaaaaaa //save in the memory _start: LDR R0,=list LDR R3,=EOF LDR R1,[R0] ADD R2,R2,R1 loop: LDR R1,[R0,#4]! @gat memory value CMP R1,R3 BEQ exit ADD R2,R2,R1 BAL loop exit: .data list: .word 1,2,3,4,5,6,7,8,9,10 ``` ![](https://hackmd.io/_uploads/HydlIo3Bh.png) # Condiction Instriction Execution c Laguage ``` if(a<b){ add(a,b) } ``` ``` .global _start .equ EOF, 0xaaaaaaaa //save in the memory _start: MOV R0,#10 MOV R1,#9 CMP R0,R1 BLT addR1R2 BAL exit addR1R2: ADD R3,R2,R1 exit: ``` # Branch with Link Register and Return ## Function BL 跟 BX (Return 一個 Address ) ## BL (Branch Link 在跳轉到另一個Branch時 會記錄下一個 Instruction Address 直接存到 Link Register (但她不會直接回去) ``` .global _start _start: MOV R0,#1 MOV R1,#1 BL add2 MOV R5,#9 add2: ADD R2,R0,R1 ``` ![](https://hackmd.io/_uploads/B1KspanB3.png) ## BX (Branch Return) 回到LR存的Address ``` .global _start _start: MOV R0,#1 MOV R1,#1 BL add2 MOV R5,#9 add2: ADD R2,R0,R1 BX lr ``` BX -> LR 有點像 Pointer , BX oprand 就會讓 Instruction 回到LR 的位置 ![](https://hackmd.io/_uploads/Syk_RT2B3.png) # Preserving and Retrieving Data from Stack Memory 保留和取出 data From Stack Memory ## Stack Memory Compiler 會去 Register assign (Register 的賦值 由compiler 分配) Push 跟 PoP value -> 要考慮 stack 結構 (FILO) ## link Register BL (branch link) LR - recording Next instruction and waiting function invoke finishing ## Local Register ![](https://hackmd.io/_uploads/rkb76OyLn.png) ## Push Preserving Data into Stack ``` .global _start _start: MOV R0,#1 MOV R1,#1 PUSH {R0,R1} BL add2 POP {R0,R1} BL end add2: MOV R0,#5 MOV R1,#6 ADD R2,R1,R2 BX lr end: ``` ![](https://hackmd.io/_uploads/BJXYKuyIh.png) push -> register value -> stack 裡面 push 完 sp(Stack Pointer) 會指向 push 進去的Initial Address ## PoP Getting Register value form stack Memory ``` .global _start _start: MOV R0,#1 MOV R1,#1 PUSH {R0,R1} BL add2 POP {R0,R1} BL end add2: MOV R0,#5 MOV R1,#6 ADD R2,R1,R2 BX lr end: ``` ## Function Return 利用stack -> 來 implement Function ```arm .global _start _start: MOV R0,#1 MOV R1,#1 PUSH {R0,R1} BL add2 POP {R9} @R9 = function return value POP {R0,R1} MOV R3,R9 B end add2: MOV R0,#5 MOV R1,#6 ADD R2,R0,R1 PUSH {R2} @return value BX lr end: ``` ![](https://hackmd.io/_uploads/Sk9zCdJL3.png) ### Observe stack address 越push -> (sp) Address 愈小 ![](https://hackmd.io/_uploads/rkDuROk82.png) # Hardware Interactions Arm CPU 與 Device ![](https://hackmd.io/_uploads/Hy8QeY1Ln.png) ## Switch CPU 可以透過 Switch (Device) 取得 Value 可以放到 Register 中 ### .equ 用於定位 可以想成 Declare Pointer ``` .equ switchAddress, 0xff20040 .global _start _start: LDR R1,=switchAddress ``` ![](https://hackmd.io/_uploads/BkJREteU2.png) 根據上圖 可以知道Switches Device Address 是多少 ![](https://hackmd.io/_uploads/HJlfrKlLh.png) ``` .equ switchAddress, 0xff200040 .global _start _start: LDR R0,=switchAddress LDR R1,[R0] @ *(RO) ``` ![](https://hackmd.io/_uploads/HJo6BFg8n.png) ![](https://hackmd.io/_uploads/r1txUYeUn.png) RO -> switch Address ## LED Device ### STR 將src Register 32 bit value 送到 處存器的Address syntax ``` STR srcR [Raddress] ``` ``` .equ switchAddress, 0xff200040 @switch pointer .equ ledAddress ,0xff200000 @led pointer .global _start _start: LDR R0,=switchAddress LDR R1,[R0] @ value 1111 LDR R0,=ledAddress STR R1,[R0] @STR "register value -> led" ``` ![](https://hackmd.io/_uploads/HJ31iFgI2.png) # Setting up Qemu for ARM Programming ## Raspberrypi ->Run ARM program Part 1 http://downloads.raspberrypi.org/raspbian/images/raspbian-2017-04-10/ ![](https://hackmd.io/_uploads/BJ-QFTxrh.png) 模擬操作系統 -> 模擬 Raspberrypi systems Part 2 Install operating systems kernel https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/kernel-qemu-4.4.34-jessie --- ## Install QEMU QEMU(quick Emulator) 允許了為一種架構編譯的程式在另外一種架構上面執行 ![](https://hackmd.io/_uploads/SyyD5gZB3.png) ``` root@ubuntu:/home/user/Desktop/arm # sudo apt install qemu-system ``` ## RUN Raspberrypi on the qume Setting.sh ``` qemu-system-arm -kernel kernel-qemu-4.4.34-jessie -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2017-04-10-raspbian-jessie.img -nic user,hostfwd=tcp::5022-:22 -no-reboot ``` cup -> arm1176 m -> virtual RAM (allocate memory size) M -> Machine type -append "root=/dev/sda2 rootfstype=ext4 rw" -> 建立file systems -hda 讓東西? 指向 raspberrypi -nic user,hostfwd=tcp::5022-:22 -no-reboot -> 透過SSH 進入 我們虛擬的機器 port 5022 -> port 22 ## Using ssh connect to raspberry pi ![](https://hackmd.io/_uploads/rkE2BbGB2.png) ``` sudo service ssh start ``` Ubuntu 登入 ``` ssh pi@localhost -p 5022 ``` password: raspberry # Print String to Terminal (On Raspberry pi) ```arm .global _start _start: MOV R0,#1 @standard in -> out put on terminal LDR R1,=message @memory Address LDR R2,=stringLen @data length MOV R7,#7 @tell to os system out put result on the screen SWI 0 @interrupt os systems MOV R7,#1 @interrupte process SWI 0 @interrupte os systems .data message: .asciz "Meowhecker \n" stringLen =.-message ``` .asciz 會自動加上 控字符串 (類似 /0 符號) 定義 他為一個string 也可以寫成 .string ## Main() 1. Define 讓 message 要寫到哪 2. 要有一個reference Address (找到欲輸出位置) 3. 定義 輸出長度 4. 告訴Computer 把 內容印到銀幕上 ## R7 Register R7 -> 中斷process execute 讓 OS systems 接管執行 interrupt -4 輸出到Screen 上 -1 ENd proccess ## SWI SWI 0 -> 中斷 OS Systems, Back to the process END process R7,#1 靠訴OS 中斷 process SWI 0 -> interrupt OS ## Assamble --> Object code --> loader --> program --> process ``` root@raspberrypi:/home/pi# as meowhecker.s -o meowhecker.o root@raspberrypi:/home/pi# ld meowhecker.o -o meowhecker root@raspberrypi:/home/pi# ./meowhecker Meowhecker ``` as 組裝 ld -> loader # Debugging ARM programs with GDB ``` root@raspberrypi:/home/pi# gdb meowhecker ``` ## Break point syntax ``` break "lable" ``` 我們可以設置break point 來分析 program ``` (gdb) break _start Breakpoint 1 at 0x10074 ``` ## Run the Program Aftter Setting break poing finished, we could run the program ``` (gdb) run Starting program: /home/pi/meowhecker Breakpoint 1, 0x00010074 in _start () ``` ## layout We will through layout the know the program info 打開GDB layout ``` layout asm ``` ![](https://hackmd.io/_uploads/B1Loxa-vh.png) Switch layout Noting : (ctrl + x)幹要先按 + o 可以切換Layout ### Register 查看register 方法 Way 1 ``` (gdb) info register r0 r0 0x0 0 ``` Way 2 直接打開Register layout ``` (gdb) layout regs ``` ![](https://hackmd.io/_uploads/Hk_kfaWw3.png) ## Next Instruction ![](https://hackmd.io/_uploads/SyKHEabP2.png) Stack 中 Message Address 已經load 進去R1 Register ![](https://hackmd.io/_uploads/ryMjV6WPh.png) ## Analysis Memory (查看stack) 查看 Stack Memory slot (32-bit) Syntax ``` x/[memory slot數量xdcu ] [initial Address] ``` x -> 16 d -> 10 d -> char 16(hexadecimal) message -> ascii 會看不出來在幹嘛 ``` (gdb) x/10x $r1 0x20098: 0x776f654d 0x6b636568 0x0a207265 0x00134100 0x200a8: 0x65610000 0x00696261 0x00000901 0x08010600 0x200b8: 0x732e0001 0x61746d79 ``` x -> exam (檢查) ``` (gdb) x/15c $r1 0x20098: 77 'M' 101 'e' 111 'o' 119 'w' 104 'h' 101 'e' 99 'c' 107 'k' 0x200a0: 101 'e' 114 'r' 32 ' ' 10 '\n' 0 '\000' 65 'A' 19 '\02 3' ``` \000 -> null string # Firmware Analysis & IoT Reverse Engineering Reference https://www.youtube.com/watch?v=zs86OYea8Wk Target Firemware :**TP-Link TL-WR1042NDv1** (路由器) ## Download **TP-Link TL-WR1042NDv1** ```bash ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis] └─# wget http://www.tp-link.com/resources/software/TL-WR1042ND_V1_130923.zip ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis] └─# mv wr1042nv1_en_3_15_7_up_boot\(130923\).bin routerFirmware.bin ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis] └─# ls routerFirmware.bin TL-WR1042ND_V1_130923.zip ``` ## Analyzing the firmware ### file ``` ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis] └─# file routerFirmware.bin routerFirmware.bin: firmware 1042 v1 TP-LINK Technologies ver. 1.0, version 3.15.7, 8258048 bytes or less, at 0x200 998400 bytes , at 0x100000 7077888 bytes ``` ## Binwalk (Automatic Reverse Tools) Binwalk could be used to serach binary file and extract the file systems or code - \- e Automatically extract important files. ``` ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis] └─# binwalk -e routerFirmware.bin --run-as=root DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 TP-Link firmware header, firmware version: 0.25336.3, image version: "", product ID: 0x0, product version: 272760833, kernel load address: 0x0, kernel entry point: 0x20000, kernel offset: 8258048, kernel length: 512, rootfs offset: 998400, rootfs length: 1048576, bootloader offset: 7077888, bootloader length: 0 5824 0x16C0 LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 72992 bytes 131584 0x20200 TP-Link firmware header, firmware version: 0.0.3, image version: "", product ID: 0x0, product version: 272760833, kernel load address: 0x0, kernel entry point: 0x20000, kernel offset: 8126464, kernel length: 512, rootfs offset: 998400, rootfs length: 1048576, bootloader offset: 7077888, bootloader length: 0 142344 0x22C08 LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 3100784 bytes .... WARNING: Symlink points outside of the extraction directory: /home/meowhecker/firmwareAnalysis/_routerFirmware.bin.extracted/squashfs-root/etc/passwd -> /tmp/passwd; changing link target to /dev/null for security purposes. 1180160 0x120200 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 2722564 bytes, 763 inodes, blocksize: 131072 bytes, created: 2013-09-23 07:39:23 ``` info - TP-Link firmware header - LZMA compressed data - Squashfs 文件系統 1180160 0x120200 Squashfs 文件系統,little endian,版本 4.0,壓縮:lzma,大小:2722564 字節,763 個 inode,塊大小:131072 字節,創建時間:2013-09-23 07:39:23 ## Access file systems ``` ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis] └─# cd _routerFirmware.bin.extracted ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis/_routerFirmware.bin.extracted] └─# ls 120200.squashfs 16C0 16C0.7z 22C08 22C08.7z squashfs-root ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis/_routerFirmware.bin.extracted] └─# cd squashfs-root ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis/_routerFirmware.bin.extracted/squashfs-root] └─# ls bin dev etc home init lib linuxrc mnt proc sbin sys tmp usr var web ``` 透過進入file systems 可以研究 一些 Default setting e.g. - Default credential - Remote configuration (telnet, ssh ) ``` ┌──(root㉿Meowhecker)-[/home/…/firmwareAnalysis/_routerFirmware.bin.extracted/squashfs-root/etc] └─# cat shadow root:$1$$zdlNHiCDxYDfeF4MZL.H3/:10933:0:99999:7::: Admin:$1$$zdlNHiCDxYDfeF4MZL.H3/:10933:0:99999:7::: john --wordlist=/home/meowhecker/wordlists/rockyou.txt ``` ## Enumerate File systems ### / ``` ┌──(root㉿Meowhecker)-[/home/meowhecker/firmwareAnalysis/_routerFirmware.bin.extracted/squashfs-root] └─# ls -la 總用量 60 drwxrwxr-x 15 501 502 4096 9月 23 2013 . drwxr-xr-x 3 root root 4096 6月 11 13:42 .. drwxrwxr-x 2 501 502 4096 9月 23 2013 bin drwxrwxr-x 5 501 502 4096 6月 11 13:42 dev drwxrwxr-x 4 501 502 4096 6月 11 14:00 etc drwxrwxr-x 2 501 502 4096 9月 23 2013 home lrwxrwxrwx 1 501 502 11 9月 23 2013 init -> bin/busybox drwxrwxr-x 3 501 502 4096 9月 23 2013 lib lrwxrwxrwx 1 501 502 11 9月 23 2013 linuxrc -> bin/busybox drwxrwxr-x 2 501 502 4096 9月 23 2013 mnt drwxrwxr-x 2 501 502 4096 9月 23 2013 proc drwxrwxr-x 2 501 502 4096 9月 23 2013 sbin drwxrwxr-x 2 501 502 4096 9月 23 2013 sys drwxrwxr-x 2 501 502 4096 9月 23 2013 tmp drwxrwxr-x 5 501 502 4096 9月 23 2013 usr drwxrwxr-x 2 501 502 4096 9月 23 2013 var drwxrwxr-x 9 501 502 4096 9月 23 2013 web ``` lrwxrwxrwx 1 501 502 11 9月 23 2013 linuxrc -> bin/busybox ### Linuxrc In embedded operating systems, /linuxrc is commonly designated as the init process. ### /bin ``` ┌──(root㉿Meowhecker)-[/home/…/firmwareAnalysis/_routerFirmware.bin.extracted/squashfs-root/bin] └─# ls acltd chmod egrep grep iptables iwpriv ls ob ping setmib true auth date false iapp irf kill mount od ps sh umount busybox df fgrep ib iw lld2d msh orf rm sleep wscd cat echo getmib idd iwcontrol login ntfs-3g ow rssi tc ```