감자 텃밭

[시스템] Memory-leak 메모리 누수 본문

System/System Theory Information

[시스템] Memory-leak 메모리 누수

g2h 2021. 11. 22. 20:51

우리가 주로 익스플로잇을 하기위해 "leak"한다. 라는말을 들어봤을 것이다.

 

우선 Memort-leak 즉 leak라 부르는 행위는

메모리의 주소값을 유출시키는 행위이다. 

 

특정한 메모리의 주소를 유출시킬 수 있으며, 인접한 영역의 메모리도 유출시킬 수 있다.

 

특정 주소의 실제 메모리주소를 알아내어 원하고자 하는 함수의 주소를 얻기위해 사용되며

보통 실제 주소를 얻었을 경우 해당 주소의 offset을 빼서

libc_base 주소를 구해 해당 libc_base 주소에 원하는 함수의 offset주소를 더해 

원하고자 하는 함수의 실제 주소를 얻게 된다.

 

두 가지의 방법이 존재하며.

1. Buffer Overflow를 이용하여, 변수들 사이의 값을 NULL값을 덮어씌워 인접 메모리를 유출시키는 방법

2. Return-to-Libc 기법을 통해 특정 주소의 값을 유출 시키는 방법.

 

1번의 방식은 프로그램을 실행시키면 출력함수들은 NULL값을 만날때 까지 출력시킨다.

EX) printf()함수는 null값을 만날때까지 출력

즉 특정 변수의 null값을 다른 값으로 덮어 인접한 메모리의 값 까지 출력시키도록 할 수 있다.

하지만 strcpy, fgets, scanf등의 입력함수는 입력이 종료되면 자동으로 null값을 삽입하기에

read, recv등의 함수를 사용할때 사용한다.

2번은 가장 많이 사용하는 방법이다.

2번을 통해 leak를 사용하는 방법은.

출력함수, ex)write() 함수등을 사용하여 원하는 함수의 got값을 출력시킨다.

 

아래 사진들은 ROP기법을 통해 메모리를 leak하여 메모리 주소값을 츄울시키는 사진이다.

puts()함수를 이용하여 puts()함수의 got값을 출력시킨다.

 

그 후 출력시킨 puts함수의 실제주소(got)의 값에서 offset값을 빼 libc_base주소를 구하고

원하는 값의 offset를 더 해 원하는 실제 주소를 얻을 수 있으며, 

 

이렇게 원하고자하는 함수들의 실제 주소를 유출시킬 수 있다.

 

이렇게 Memory leak는 정말 많은 기법에서 사용되는 방법이다. 정말 유용하고 exploit에 큰 역할을 한다.

 

참고자료
https://9oat.tistory.com/4

※ 내용이 이상하거나 문제가 있을경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.