No estoy seguro de qué quiere decir con "la dirección es de 3 bytes" (a menos que esté en un sistema de 24 bits). :) Las direcciones de memoria son probablemente de 32 bits (4 bytes), pero las direcciones probablemente tienen una Byte nulo en ellos, por lo que desea una forma de introducir un byte nulo en su código de shell.
Lo que puedes hacer es un bit-shift en un registro. Esto, como su nombre lo indica, desplazará los bits a la dirección que desee; Justo en este caso, y rellenar con ceros. (0x11223344 - > 0x00112233)
El siguiente código convertirá EAX en 0x00112233
05 44 33 22 11 add $0x11223344,%eax
c1 e8 08 shr $0x8,%eax
Y como se puede ver en los códigos hexadecimales, no se ha introducido ningún byte nulo en el código de shell.
Alternativamente, puede trabajar con registros inferiores (ax, al, ...) y girar todos los bits alrededor. De usted puede calcular el valor inverso utilizando un NO bit a bit, por ejemplo: 0xffedcba9 es el valor NO a nivel de bit de 0x00123456. O podrías XOR 2 valores para llegar a tu dirección.