String literal en el progtwig C, ¿se puede encontrar en binario?

Por ejemplo:

int main(int argc, char *argv[]) { if (strncmp(argv[1], "password")) { printf("Incorrect password\n"); } return 0; } 

¿Puedo desmontar el binario para este progtwig comstackdo y ver la cadena “contraseña” en algún lugar del binario o es solo visible durante el tiempo de ejecución?

Típicamente, sí. Además, no es necesario “desmontar” nada. La mayoría de las veces podrás verlo directamente en el binario comstackdo abriéndolo en un editor de texto o hexadecimal.

Las cadenas ASCII no se someten a ninguna encoding / deencoding especial, por lo que aparecen literalmente en el binario y aparecerán cuando el binario se interprete como un archivo ASCII (en su mayoría con aspecto de basura). Si lo piensa más a fondo, la única alternativa sistemática para almacenarlos en el binario sería un horrible registro central de todo el sistema operativo de todas las cadenas para todos los progtwigs. Si estuvieran almacenados en un archivo separado, podrían separarse del binario.

Sin embargo, el OP parece plantear una pregunta más amplia sobre el diseño del código y qué comstackción hace con los datos de solo lectura, como las cadenas. Una forma más educativa de “encontrar” la cadena es ver la etapa de comstackción intermedia de un conjunto legible por humanos, donde la cadena se colocará y se hará referencia mediante una etiqueta. El enlazador (siguiente etapa de comstackción) luego resolverá la etiqueta a un desplazamiento numérico desde el principio del binario. Tenga en cuenta la .rodata (“sección de datos de solo lectura”) a continuación.

Desde la página de manual de gcc: -S Detente después de la etapa de comstackción propiamente dicha; no montar La salida tiene la forma de un archivo de código de ensamblador para cada archivo de entrada no ensamblador especificado.

Resultados:

  .file "foo.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "password" .LC1: .string "Incorrect password" .section .text.startup,"ax",@progbits .p2align 4,,15 .globl main .type main, @function main: 

[Siguen las instrucciones en lenguaje ensamblador]