2012-05-02 3 views
3

glibc을 다운로드하여 코드를 수정 한 다음 사용할 수 있습니다. 그래서 그걸 가지고 놀기 위해서, 나는 glibc 의 stdio-common 함수를 변경하여 "나를 볼 수 있니?"라고 출력했습니다.glibc의 변경이 작동하지 않습니다.

int 
__printf (const char *format, ...) 
{ 
    va_list arg; 
    int done; 

    va_start (arg, format); 
    done = vfprintf (stdout, "Can you see me?", arg); 
    va_end (arg); 

    return done; 
} 

그 변화를 한 후 나는 의 glibc를 컴파일하고 PRINTF 를 사용하여 샘플 프로그램을 실행하려면이 의 glibc 디렉토리에 libc.so가 와 LD_PRELOAD를 사용했다. 그러나 나는 여전히 printf 정상적으로 인쇄되는 것을 보았습니다. 즉, 저의 변경 사항이 반영되지 않았습니다. 내가 여기서 실수하고있는거야?

+0

단순히 "hello"또는 뭔가를 인쇄하기 위해 중복 된 행을 변경하십시오. va_list를 두 번 처리하고 있는데 작동하지 않습니다. 첫 번째 호출은 그것을 고갈시킵니다. –

+0

이전에 문자 대신에 문자 + 1을 인쇄하는 다른 변경 작업도 수행했습니다. – MetallicPriest

+0

'ldd./test-program '이 뭐라고 말합니까? 또한 프로그램을 실행하기 전에'export LD_DEBUG = files'를 실행하면 유용한 정보를 얻을 수 있습니다. –

답변

1
그 몇 가지 이유가있을 수 있습니다

는 간단한 당신이 진짜 형식 문자열을 사용하고, 컴파일러가 putsprintf에서 전화를 변경한다는 것입니다 :

printf("hello\n"); 
// becomes: 
puts("hello"); 

시도는 매개 변수를 추가 :

char ex = '!'; 
printf("Hello %c\n", ex); 
+0

여전히 작동하지 않으며, objdump로 코드를 검사합니다. 실제로 puts가 아닌 printf를 사용합니다! – MetallicPriest

+0

@MichaelBurr - 나는 그것을 몰랐다. 감사! – MByD

+1

IIRC printf ("% s", "hello \ n")도 내부적으로 puts ("hello \ n")로 변환됩니다. 이것은 glibc printf()가 꽤 친절하기 때문에 약간의 문제입니다. 그리고 puts()가 segfault를하지 않는 반면에 NULL을 검사하고 적절한 것을 출력 할 것입니다. – Dipstick

관련 문제