본문 바로가기

Kitri_NCS3기 보안과정/시스템 해킹

170518 환경변수 변조 (export LD_PRELOAD)

1. LD_PRELOAD 사용 



명령어 

$env 

 현재 설정되어 있는 환경 변수들 확인

 $env | grep PATH

 환경변수중 PATH 확인

 LD_PRELOAD

 환경변수로 프로그램 실행시 로딩하는 라이브러리를 추가 할 수 있음. 동일한 이름의 함수의 경우 LD_PRELOAD에서 설정한 것이 우선순위가 더 높다



<slep.c>


#include<stdio.h>


main(){

sleep(1000);  → 실행하면 잠시 멈춘다 

}



sleep는 정해진 시간동안 잠시 멈추는 기능을 한다. sleep와 같은 이름의 함수를만들어서 LD_PRELOAD 에 추가하여 우선순위를 높이고 우리가 만든 sleep가 실행되도록 해보자.


sleep(){

system("ls -al");

}


"ls -al" 의 명령을 실행하도록 sleep() 을 만들었다. 라이브러리 파일로 만들어주자 

gcc -shared -fPIC -o 파일.so 파일.c






export LD_PRELOAD로 라이브러리 추가해주고 env 로 확인해 보니 할당이 된 모습을 확인 할 수 있었다.

이제 다시 실행시켜 보자



system("ls -al")이 실행되었다. sleep라이브러리를 불러올때 우리가 만든 라이브러리가 불러와진걸 확인 할 수 있었다.


2. 환경변수값을 이용한 오버플로우


C 코드를 알 수 없고 실행파일로만으로 분석을 해보았다.

실행시켜보니 환경변수를 셋팅해야 할 듯 하다. 


gdb로 살펴보자 



살펴보니 getenv를 호출하는 모습

cmp에서  0xd0a0d0a와 비교하여 분기되는것을 찾을 수 있다. 


main+72에서 비교전에 뽑아오는 인자부분에 0xd0a0d0a가 되는것이핵심이다. 

버퍼의 크기는 main+61에서 0x48만큼 esp를 이동시키는것이 보인다. 

72의 버퍼가 확보되고, cmp로 들어가는 비교값은 ebp-0x8에 있어야 하므로 0x48-0x8 = 0x40 = 64만큼의 크기라는걸 알 수 있다.



 

 

buff [64]

↖esp-0x48
 





비교값(0xd0a0d0a)

 ↖ebp-0x8


0

 

 SFP


 ret

 

 

 



getenv 를 먼저 분석해보자. 환경변수의 값을 불러오는 함수이다.

무엇의 환경변수를 불러오는지 알아보기위해 비교문 전에 esp의 위치를 받아서 두개의 인자를 확인해보았다.

호출하려는 환경변수의 이름이 GREENIE임을 알 수 있다.


GREENIE의 환경변수 값으로 더미값과 0xd0a0d0a를 환경변수에 넣어주면된다 .