2016-09-27 1 views
0

LD_PRELOAD을 사용하여 Linux 커널 함수 중 하나를 재정의 할 수 있습니까?커널 수준 함수에서 LD_PRELOAD 사용

예를 들어, cookie_hash 함수를 의 청취 소켓에 대해 Linux/net/ipv4/syncookie.c에서 변경하려고합니다. LD_PRELOAD를 사용하여이를 수행 할 수 있습니까? 아니면 커널을 다시 컴파일해야합니까?

다른 옵션이 있습니까?

감사합니다,

+1

LD_PRELOAD 트릭 작동합니다 동적으로 링크 된 라이브러리에만 해당됩니다. 당신이 말하는 전자 코드는 정적으로 연결된 것 같습니다. 운이 좋다면 적재 가능 모듈에 앉아 있어야합니다. 이 경우 모듈을 교체 할 수 있습니다. –

+0

@EugeneSh .: 사용자가 쉽게 커널 기능을 대체 할 수 있다면 심각한 보안 문제는 보이지 않습니까? – Olaf

+0

악성 코드 제외 : 왜이 ​​작업을 수행 하시겠습니까? – Olaf

답변

2

아니, 커널의 기능을 대체하는 LD_PRELOAD를 사용할 수 없습니다.

커널을 다시 컴파일해야합니다.

커널 모듈에 함수가있는 경우 커널을 다시 시작하지 않고도 모듈을 언로드하고 다시 컴파일하고 다시로드 할 수 있습니다.

자주하는 일이라면 두 번째 컴퓨터 또는 가상 컴퓨터를 사용하여 프로그래밍중인 컴퓨터를 계속 다시 시작하지 않아도됩니다.

0

커널 기능을 무시하려면 kprobes 또는 systemtap을 사용해야합니다. 다시 컴파일 할 필요는 없습니다.

0

Linux Kernel에서 비슷한 기능을 수행 할 수 있습니다. 간단한 작업은 아니지만 다음 작업은 수행해야합니다.

  1. 바꿀 기능의 주소를 찾으십시오. 주소를 얻는 방법에는 여러 가지가 있습니다. 가장 간단한 것은 'cat/proc/kallsyms | 그렙 cookie_hash. "모듈에서
  2. , 당신은 주소의 내용을 저장합니다. 그것은 원래 'cookie_hash'기능입니다.
  3. 을이 주소 속으로, 당신은 당신의 기능 'my_cookie_hash'의 주소를 넣습니다.
  4. 에서 함수 'my_cookie_hash'의 끝, 당신은. 많은 숨겨진 함정과 잠재적 인 충돌이 발생하지만,이 있습니다. 을

를 원래의 함수 'cookie_hash'를 호출하지만 일반적으로,이 방법은 작동합니다.