2014-12-01 7 views
2

일부 오래된 Linux 버전에서 프로그램을 실행 가능하게하려고합니다. 이것을 막는 일반적인 import는 __longjmp_chk이며 glibc 2.11에 추가되었지만 이전 버전에서는 빠져 있습니다. 하나의 "솔루션"은 -D_FORTIFY_SOURCE=0을 사용하지만 대상 libc에있는 다른 강화 기능 (__printf_chk 등)을 끕니다. libc.so.6에서 함수를 사용하는 "약한 가져 오기"를 __longjmp_chk으로 만드는 방법이 있습니까? 그렇다면 로컬 스텁으로 폴백 하시겠습니까?ELF 약식 가져 오기/glibc 기능을위한 대체 스텁

답변

0

일부 구형 Linux 버전에서 프로그램을 실행 가능하게하려고합니다.

이 작업을 수행하는 데는 몇 가지 방법 만 있으며 대부분은 here입니다.

__longjmp_chk을 "약한 가져 오기"로 만드는 방법이 있습니까?

번호

1

__longjmp_chk있는 경우 libc.so.6에서 기능을 사용하고 있지 않은 경우 지역 스텁 다시 떨어질 것 "약한 가져 오기를"만들 수있는 방법이 있나요?

내가 __longjmp_chk를 확인하기 위해 dlsym()을 사용하고 그에 따라 행동, 예 ​​말할 것 :

/* cc -ldl */ 
#define _GNU_SOURCE 
#include <setjmp.h> 
#include <stdio.h> 
#include <dlfcn.h> 

void __longjmp_chk(sigjmp_buf env, int val) 
{ 
    void (*p)(sigjmp_buf, int) = dlsym(RTLD_NEXT, "__longjmp_chk"); 
    if (p) 
     printf("use the function from libc\n"), 
     p(env, val); 
    else 
    { 
     printf("falling back to local stub\n"); 
     /* local stub - whatever that may be */ 
    } 
} 

main() 
{ // try it 
    sigjmp_buf env; 
    while (!setjmp(env)) __longjmp_chk(env, 1); 
    return 0; 
}