Originariamente Scritto da
cirowner
Ok, tutto chiaro, praticamente falsifica gli output per le richieste di zone di memoria>=0xF010.
L'insieme di queste falsificazioni servono per generare una response corretta per la challenge inviata quindi?
Esattamente, in pratica nasconde le modifiche che sono state fatte al firmware. Quella parte li e' quella piu' semplice e gestisce le zone di memoria >= 0xF010 che nel firmware originale sono tutte 0xFF (basta quindi un semplice confronto per nascondere quasi 4KB di codice aggiuntivo).
Continuando il disassembly all'indirizzo 0xF01D trovi invece altri confronti :
Codice:
code:0000F01D mov A, RAM_56
code:0000F01F mov R7, A
code:0000F020 xrl A, #0x44
code:0000F022 jz code_F037
code:0000F024 mov A, R7
code:0000F025 xrl A, #0x4B
code:0000F027 jz code_F037
code:0000F029 mov A, R7
code:0000F02A xrl A, #0x65
code:0000F02C jz code_F037
code:0000F02E mov DPL, RAM_57 ; Data Pointer, Low Byte
code:0000F031 mov DPH, R7 ; Data Pointer, High Byte
code:0000F033 clr A
code:0000F034 movc A, @A+DPTR
code:0000F035 ret
Visto che come dicevamo inizialmente, in RAM_56 e' presente il byte alto dell'indirizzo a 16bit controllato, questa parte di codice controlla se si sta tentando di accedere agli indirizzi 0x44nn, 0x4Bnn o 0x65nn e in caso positivo il programma continua a code_F037, dove inizia una scansione di una tabella per recuperare i dati originali. In caso contrario si tratta di zone del firmware che non sono state modificate e la parte a code_F034 legge il valore attualmente presente.
Se vuoi vedere esattamente dove sono state fatte le modifiche, basta aprirsi con un editor esadecimale il firmware originale (es. Orig-0225.bin) e quello ixtreme (es. LTPlus-0225-v3.0.bin).
Se vai all'offset 0x344b0 vedrai che due bytes sono stati modificati rispetto al fw originale e questa e' la modifica che il primo confronto per il range 0x44nn cerca di nascondere.
Stessa cosa per l'offset 0x34b46 (3 bytes) e 0x365f6 (6 bytes). Queste modifiche sono in una zona del firmware cryptata quindi non si sa esattamente che modifiche siano (anche se per le prime due, da 2 e 3 bytes, si tratta quasi sicuramente di un jmp o una call inserita o reindirizzata per prendere il controllo in un certo punto del firmware).
P.S.:Penso proprio che IDA permetta al caricamento di specificare start e stop address per isolare una sezione di codice, sapresti dirmi come configurarlo?
Non ci avevo neanche mai fatto caso, ma hai ragione. Dove dice file offset, inserisci 0x30000 e lui ti carica solamente gli ultimi 0x10000 bytes. A quel punto se vai all'indirizzo code_F010 dovresti notare che continua a disassemblare anche il resto (se non lo fa in automatico, spostati sull'indirizzo con il cursore e premi 'c').
Segnalibri