Mais um blog inútil.

Agosto 25, 2009

printf(“oi lindinhos!\n”);

Filed under: Assembly,Coding,Cracking,Useless — charlie-lindinho @ 21:06

há mil dias li um post do *xorl* intitulado de "Funny C programming interview questions", achei uma certa piada ao raio do post e resolvi escrever aqui sobre isso.

no post o xorl apresenta a solução para uma das questões colocadas neste *site*, no qual nos é questionado se é possível fazer com que a variável "i" apresente outro valor, senão "2", apenas adicionando código à função foo().

#include <stdio.h>
#include <stdlib.h>

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)
} 

a primeira coisa que me ocorreu (em mil milésimos de segundo) foi modificar directamente o valor de "i" através da função "printf" e então fiz o seguinte :

#include <stdio.h>
#include <stdlib.h>

void foo(void);

int main(void)
{
	int i = 2;
	foo();
	printf("%d\n", i);
	return EXIT_SUCCESS;
}

void foo(void)
{
	unsigned long addr;
	__asm("movl %%ebp, %0" : : "m"(addr));
	printf("%1$n", addr += 24);
}

o que fiz aqui foi calcular o endereço da variável "i" apartir do base pointer (EBP) e fazer com que a funçao printf escrevesse 0 bytes no endereço da mesma através do especificador de formato "%n".

bash-3.1# gcc -o printf printf.c
bash-3.1# ./printf
0
bash-3.1# 

ainda assim existe outra solução óbvia da qual me lembrei também, que consiste em fechar o file descriptor utilizado pela função printf ( stdout ) depois da função foo().

void foo(void)
{
	fprintf(stderr, "%d\n", 0);
	close(1);
}

queria dedicar este post inútil ao cavalo que morreu hoje atropelado no brasil.

Comentar

widgeon
widgeon
widgeon
widgeon