Définir Bytes Assemblée GCC en ligne dans Dev-C ++ (. Ascii AT & T syntaxe sous Windows)
-
02-10-2019 - |
Question
Le code ci-dessous montre juste une boîte de message à l'écran.
Les adresses sont codées en dur pour faciliter:
int main ()
{
asm("xorl %eax, %eax \n"
"xorl %ebx, %ebx \n"
"xorl %ecx, %ecx \n"
"xorl %edx, %edx \n"
"pushl %ecx \n" //$0x0
"pushl $0x20206c6c \n" //" ll"
"pushl $0x642e3233 \n" //"d.23"
"pushl $0x72657375 \n" //"resu"
"movl %esp, %ecx \n" //store "user32.dll" address in %ecx
"movl $0x7c801d7b, %ebx \n" //store address of LoadLibraryA in %ebx
"pushl %ecx \n"
"call *%ebx \n"
"movl $0xef30675e, %ecx \n"
"addl $0x11111111, %ecx \n"
"pushl %ecx \n"
"pushl $0x42656761 \n"
"pushl $0x7373654d \n"
"movl %esp, %ecx \n"
"pushl %ecx \n"
"pushl %eax \n"
"movl $0x7c80ae40, %ebx \n"
"call *%ebx \n"
"movl %esp, %ecx \n"
"xorl %edx, %edx \n"
"pushl %edx \n"
"pushl %ecx \n"
"pushl %ecx \n"
"pushl %edx \n"
"call *%eax \n"
"xorl %eax, %eax \n"
"pushl %eax \n"
"movl $0x7c81cb12, %eax \n"
"call *%eax \n"
);
}
(je ne l'ai pas fait de commentaires tout le code parce que ma question n'est pas vraiment sur le code)
Ma question est: Est-il possible d'écrire la chaîne « user32.dll » dans l'assemblage en ligne sans pousser manuellement à la pile? Je veux dire comme ça dans MSNA: db 'Hello'
Je sais que dans AT & T syntaxe que je pouvais faire .ascii 'Hello'
ou .string 'Hello'
mais que diriez-vous en ligne gcc?
S'il vous plaît noter que j'utilise Dev-C ++ sous Windows XP SP3
Merci!
La solution
Oui, en utilisant des directives assembleur dans votre assembleur en ligne. L'astuce consiste à mettre la chaîne au bon endroit (la section de données), vous pouvez le faire en passant en utilisant .section .data
, puis passer à nouveau avec .section .text
.
Vous devez donner les données une étiquette afin que vous puissiez s'y référer; Je recommande d'utiliser la syntaxe de l'étiquette locale ici (où l'étiquette est un numéro, par exemple 1:
, et vous référence comme soit 1b
pour la première arrière de l'étiquette de 1:
ou 1f
pour la première étiquette 1:
vers l'avant - voir le documentation assembleur GNU pour plus de détails).
Comme ceci:
int main(void)
{
asm(".section .data \n"
"1: .asciz \"Hello\" \n"
".section .text \n"
"pushl $1b \n"
"call _puts \n"
"add $4, %esp \n"
);
return 0;
}
Je n'ai pas un système Windows à portée de main pour tester ce, mais il compile OK et il semblerait qu'il devrait faire la bonne chose en utilisant un compilateur croisé MinGW sur Linux (je crois que Dev-C ++ est basé sur MinGW) .
Remarque: cette technique est généralement applicable lors de l'utilisation d'un GNU toolchain. Si vous construisez des binaires ELF (par exemple Linux natif), il existe un moyen de plus propre pour revenir à la section de texte, qui consiste à utiliser .previous
, ce qui signifie « quelle que soit la section avant la .section
précédente était ». (L'exemple ci-dessus fonctionne sur Linux si vous changez _puts
à puts
pour tenir compte des différentes conventions préfixer symbole.)