Domanda:
Come posso modificare i flag di lettura / scrittura / esecuzione su un segmento in IDA?
Peter Andersson
2013-07-02 10:53:22 UTC
view on stackexchange narkive permalink

A volte, quando carichi manualmente un binario in IDA, ti ritrovi con segmenti che hanno flag di lettura, scrittura ed esecuzione sconosciuti. Puoi vederli nella sottoview Segmenti ( Maiusc + F7 ). C'è un modo per cambiare questi flag dall'interno della GUI di IDA senza eseguire uno script e modificarli?

Sembra una funzionalità di base che è molto importante per il corretto funzionamento del decompilatore Hex Rays. Ho usato la classe per esprimere i diritti di segmento che sembra sbagliato considerando che esistono questi flag.

Anche se apprezzerei la risposta alla domanda nel caso generale, in questo caso particolare ho a che fare con flat file binari ARM con codice e dati mescolati. Tutti i permessi a livello di pagina vengono impostati dal software durante il caricamento mappandoli direttamente tramite la MMU.

Quattro risposte:
Jason Geffner
2013-07-02 20:01:43 UTC
view on stackexchange narkive permalink

Non conosco nulla di nativamente integrato nella GUI che ti consenta di modificare i permessi del segmento, ma puoi facilmente modificare i permessi del segmento con IDC.

Dal file della guida di IDA:

  SetSegmentAttr ****************************************** ******* imposta gli argomenti dell'attributo del segmento: segea - qualsiasi indirizzo all'interno del segmento attr - uno dei valori delle costanti SEGATTR _... - il nuovo valore dell'attributo successo SetSegmentAttr (long segea, long attr, long value); SEGATTR_ALIGN alignmentSEGATTR_COMB combinationSEGATTR_PERM autorizzazioniSEGATTR_FLAGS flag segmentoSEGATTR_SEL selettore segmentoSEGATTR_ES valore ES predefinitoSEGATTR_CS valore CS predefinitoSEGATTR_SS valore SS predefinitoSEGATTR_DS valore DS predefinitoSEGATTR_FS valore FS predefinitoSEGATTR_GS valore GS predefinitoSEGATTR_TYPE tipo segmentoSEGATTR_COLOR colore del segmento  

Da segment.hpp:

  / * 22 * ​​/ uchar perm; // Permessi del segmento (0-nessuna informazione) #define SEGPERM_EXEC 1 // Esegui # definisci SEGPERM_WRITE 2 // Scrivi # definisci SEGPERM_READ 4 // Leggi  

Come tale, se vuoi impostare le autorizzazioni di un segmento che inizia da VA 0x00400000 sia in lettura che in esecuzione, è possibile eseguire semplicemente il seguente comando IDC:

SetSegmentAttr (0x00400000, SEGATTR_PERM, 4 | 1);

In alternativa, se stai solo cercando di gestire gli avvisi di Hex-Rays, potrebbe essere sufficiente utilizzare la vista Segmenti nella GUI per cambia la classe di un segmento da CODE a DATA .

Soluzione molto ellegante.
Grazie, sono a conoscenza delle soluzioni di scripting e scrivo al tuo importatore. Per quanto riguarda la tua seconda soluzione (che è quella che sto attualmente utilizzando), questo non è correlato agli avvisi. Ha a che fare con dati e codice che vengono mescolati. Hex Rays ha problemi con i pool costanti incorporati in determinati tipi di segmenti che hanno un impatto negativo significativo sulla decompilazione quando si tratta di software di basso livello. Sono propenso al fatto che non ci sia nulla di integrato in IDA e che la soluzione di scripting mappata su un tasto di scelta rapida sia la più semplice.
È ora di scrivere un plug-in = DI ricordo vagamente contattato Ilfak con questo per una questione di supporto mentre RCE-ing un'applicazione Symbian. Ricordo che ho dovuto rimuovere i segmenti e ricostruirli.
Un'altra soluzione sarebbe cambiare direttamente il membro `.perm` di una struttura` segment_t` che rappresenta il segmento.
PSS
2013-07-02 19:32:16 UTC
view on stackexchange narkive permalink

Questi cosiddetti flag vengono importati da binario. Prendiamo ad esempio il formato binario Microsoft PE / COFF. Questo è il layout di base di PE:

PE/COFF Layout

Ogni segmento che vedi in IDA è caricato secondo la struttura IMAGE_SECTION_HEADER della sezione specifica /segmento. La struttura ha il seguente formato:

  typedef struct _IMAGE_SECTION_HEADER {BYTE Name [IMAGE_SIZEOF_SHORT_NAME]; unione {DWORD PhysicalAddress; DWORD VirtualSize; } Varie; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics;} IMAGE_SECTION_HEADER, * PIMAGE_SECTION_HEADER;  

DDWORD Characteristics membro della struttura contiene flag che indicano i livelli di autorizzazione per la sezione / segmento. Sono disponibili molti flag diversi, ma per citarne alcuni: IMAGE_SCN_MEM_READ , IMAGE_SCN_MEM_WRITE e IMAGE_SCN_MEM_EXECUTE .

Mentre IDA carica l'eseguibile, tutto il lavoro successivo viene svolto all'interno del database. Non vengono apportate modifiche all'eseguibile da IDA. Credo che dovrai patchare il tuo eseguibile per modificare i permessi di lettura / scrittura / esecuzione su un segmento in modo permanente. A meno che non ci sia uno script o un plug-in per farlo.

In questo caso il binario non utilizza un formato standard. Viene importato da un file binario semplice. Il file è in codice ARM e alcuni dati dall'inizio alla fine. È un caricatore di basso livello che mappa il proprio segmento direttamente modificando le mappature e le autorizzazioni della MMU.
@PeterAndersson "... un caricatore di basso livello che mappa il proprio segmento direttamente modificando le mappature e le autorizzazioni della MMU." È possibile applicare una patch al binario per modificare le autorizzazioni necessarie durante il processo di mappatura?
è più un problema con il modo in cui il decompilatore Hex Rays tratta i vari tipi di segmenti e flag in questo caso particolare, ma la domanda è davvero più generale. Quando si importa per la prima volta il binario, i flag RWX sono in uno stato sconosciuto, mentre si decodifica si scoprono i loro veri attributi quando il segmento viene mappato dalla MMU. In effetti non penso che ci sia nemmeno un modo per importare un file flat binario come segmento e impostare i flag.
tmr232
2015-07-01 21:33:46 UTC
view on stackexchange narkive permalink

Puoi farlo utilizzando Sark ( code, docs):

  import sark # Ottieni il segmentegment = sark.Segment ( ea = 0x00400000) # Imposta autorizzazionisegment.permissions.write = True  

Dichiarazione di non responsabilità: sono l'autore di Sark.

nettrino
2015-06-29 19:33:24 UTC
view on stackexchange narkive permalink

Aggiungendo alle risposte precedenti, puoi copiare attributi da un altro segmento tramite uno script python:

  try: attributes = [SEGATTR_ALIGN, SEGATTR_PERM, SEGATTR_BITNESS, SEGATTR_FLAGS, SEGATTR_SEL, SEGATTR_TYPE] from_seg_ea = list (Segments ()) [SegByName (attrs_from)] if from_seg_ea == BADADDR: print "Error in copying attributes" per attr negli attributi: SetSegmentAttr (startea, attr, GetSegmentAttr (from_seg_ea, attr)) tranne Eccezione come e: print e SegDelete (startea, 1)  

@startea è l'indirizzo iniziale del tuo segmento, @ attrs_from è una stringa che rappresenta il segmento da cui vuoi copiare gli attributi (ad esempio, ".text")



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...