Reverse_engineering/이론

GOT Over Write 실습

KSJ._.seven11 2023. 3. 26. 18:04

 

최근 기초 이론에 대해서 너무 부족하다 느껴서 차근차근 하나씩 다시 배워나가고 있다.

 

 그중 중심은 GOT Over Write 공격 기법인데 이론은 100% 이해를 했지만 GDB로 직접 덮어씌우면서 실습을 하지는 않았기에 이번기회에 해서 정리하기로 했다.

 

일단 소스코드는 다음과 같다.

 

#gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack -no-pie -fno-pie -o got test.c

#include <stdio.h>

int main (){

	printf("/bin/sh");
}

메인에 BP 를 걸고 실행후 디스어셈블로 확인하면 0x8049040 가 printf 주소인것을 확인할 수 있다.

 

 해당 부분을 디스어셈블리 하면 저렇게 나오는데 이중 jmp 0x804c004 를 통해 GOT 주소를 참조해 함수를 실행하는 원리다.

 

 해당 부분을 다시 디스어셈블 해보자.

 

printf의 GOT 주소인 것을 확인할 수 있다.

 

이후

 system 함수의 주소를 출력하고 해당 got 주소를 덮어 씌운다.

 

 

해당 부분을 OverWrite 하면 함수는 아래와 같이 변경된다.

 


pirntf("/bin/sh")

-->>

system('/bin/sh')

 plt 부분에서는 printf 함수가 실행되는 거와 같지만 got 주소가 변경되어 

 

jmp 0x804c004 가 jmp 0xf7c4c800 로 변경되어 system('/bin/sh') 함수가 실행되는거와 같은 효과를 불러일으킬 수 있다.

 

그렇게 작동을 시키면 

 

 

쉘이 실행된다.

 

끝 !