Détection de moufleurs.
Toi aussi, tu en as marre d'embaucher des moufleurs professionnels ? Voici la solution... des questions C bourrées de gros toupper("poils"[4]).
À la fin du questionnaire, on a un programme phouny:
void foo(void);
int main (void)
{
int i=2;
foo();
printf ("%d\n",i);
return EXIT_SUCCESS;
}
void foo(void)
{
// add code so that printf above prints different value of i (i.e. not 2)
}
Le but du jeu c'est d'afficher autre chose que 2 rien qu'en ajoutant du codaze dans foo(). Leur réponse est simple:
No, there is no portable, standard compliant way to modify main's "i" from foo
Bon... leur réponse est correcte, si vous devez faire ça dans un vrai projet alors changez de langage de codaze... Mais pour le fun, si jamais vous tombez sur une queston du genre en entretien, vous pouvez dire que c'est possible en parsant la stack depuis foo pour remonter jusqu'a i ou en __asm__ en récupérant l'ebp sauvé sur la pile et en faisant en movl sur (ebp) avec l'offset qui va bien pour tapper dans i. Ces deux solutions sont super dépendantes de l'archi (x86 ici).
La première solution donne:
void foo(void);
int main (void)
{
int i=2;
foo();
printf ("%d\n",i);
return EXIT_SUCCESS;
}
void foo(void)
{
int *t = &t + 11;
*t = 1337;
}
[clem1@toop tmp]$ gcc -o coin coin.c && ./coin
1337
D'autres solutions les barbus ?
PS: En une semaine je viens de remplir mon quota de billets pour les deux années à venir. :-)
À la fin du questionnaire, on a un programme phouny:
void foo(void);
int main (void)
{
int i=2;
foo();
printf ("%d\n",i);
return EXIT_SUCCESS;
}
void foo(void)
{
// add code so that printf above prints different value of i (i.e. not 2)
}
Le but du jeu c'est d'afficher autre chose que 2 rien qu'en ajoutant du codaze dans foo(). Leur réponse est simple:
No, there is no portable, standard compliant way to modify main's "i" from foo
Bon... leur réponse est correcte, si vous devez faire ça dans un vrai projet alors changez de langage de codaze... Mais pour le fun, si jamais vous tombez sur une queston du genre en entretien, vous pouvez dire que c'est possible en parsant la stack depuis foo pour remonter jusqu'a i ou en __asm__ en récupérant l'ebp sauvé sur la pile et en faisant en movl sur (ebp) avec l'offset qui va bien pour tapper dans i. Ces deux solutions sont super dépendantes de l'archi (x86 ici).
La première solution donne:
void foo(void);
int main (void)
{
int i=2;
foo();
printf ("%d\n",i);
return EXIT_SUCCESS;
}
void foo(void)
{
int *t = &t + 11;
*t = 1337;
}
[clem1@toop tmp]$ gcc -o coin coin.c && ./coin
1337
D'autres solutions les barbus ?
PS: En une semaine je viens de remplir mon quota de billets pour les deux années à venir. :-)