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를 환경변수에 넣어주면된다 .
'Kitri_NCS3기 보안과정 > 시스템 해킹' 카테고리의 다른 글
[Reverse Engineering]PE-PE Header (0) | 2017.05.23 |
---|---|
[Reverse Engineering]PE-DOS Header (0) | 2017.05.21 |
170519 힙영역 오버플로우 (0) | 2017.05.19 |
170516 오버플로우를 이용한 RET 변조 (0) | 2017.05.16 |
170515 시스템 해킹, 디버거(GDB)-오버플로우 이해하기 (0) | 2017.05.15 |