Non sono sicuro di cosa intendi con "l'indirizzo è 3 byte" (a meno che tu non sia su un sistema a 24 bit?) :) Gli indirizzi di memoria sono probabilmente a 32 bit (4 byte), ma gli indirizzi hanno probabilmente un byte null in loro, quindi vuoi un modo per introdurre un byte null nel tuo shellcode.
Quello che puoi fare è un spostamento di bit su un registro. Questo - come suggerisce il nome - sposterà i bit nella direzione desiderata; proprio in questo caso, e riempire con zeri. (0x11223344 - > 0x00112233)
Il codice seguente renderà EAX in 0x00112233
05 44 33 22 11 add $0x11223344,%eax
c1 e8 08 shr $0x8,%eax
E come puoi vedere nei codici esadecimali, non è stato introdotto alcun byte null nello shellcode.
In alternativa, puoi lavorare con registri inferiori (ax, al, ...) e ruotare tutti i bit in giro. Di voi è possibile calcolare il valore inverso utilizzando un NOT bit a bit, ad esempio: 0xffedcba9 è il valore NOT bit a bit di 0x00123456. Oppure potresti inserire i valori XOR 2 per raggiungere il tuo indirizzo.