Jeomxon's Tech Note

변수 덮어씌우기(modified) - protostar 본문

System/ProtoStar

변수 덮어씌우기(modified) - protostar

저문(jeomxon) 2019. 11. 15. 16:45

이번에 해볼 것은 간단한 변수를 덮어씌우는 시스템에서의 조작이다.

칼리 리눅스를 통해서 진행을 하였다.

 

먼저 코드를 보자.

여기서 보면 ret - ebp - modified - buffer 순으로 스택이 쌓여감을 알 수 있는데 그 이유는 ret ebp 이후 먼저 modified가 선언이 되었고, 그 후에 buffer가 64만큼의 공간이 할당되었기 때문이다.

그리고 위 코드에서 조건문을 보면 if문의 조건이 0이 아니라면 "you have changed the 'modified' variable"이라는 문구를 얻을 수 있는데 위를 얻기 위해서는 modified라는 변수가 조작이 되어야함을 알 수 있다.

 

따라서 modified라는 변수를 덮어씌우기 위해서는 먼저 gets로 받는 부분에서 buffer을 넘어서 입력 값을 주게 된다면 그 아래에 있는 modified라는 값이 덮어씌어질 수 있음도 알 수 있다.

 

stack0.c 파일을 컴파일 하기 위해서는

gcc -z execstack -no-pie -w -o stack0 stack0.c

라는 명령어에 옵션을 추가한 상태로 컴파일 해주어야 한다. ( 스택 공격에 취약한 컴파일 명령어)

// -no-pie 옵션을 주면 pie옵션을 뺄 수 있고 execstack으로 NX옵션을 뺄 수 있다. -w옵션은 warning을 뜨지 않게 해주는 옵션이다. 추후 gcc 컴파일 옵션에 대해 포스팅 할 예정

 

먼저 위처럼 stack0파일을 실행시키고 aaaaaaaa를 그냥 대입해보았다. 역시나 Try again?이라는 문구와 함께 원하는 답이 나오지 않음을 알 수 있다.

 

이처럼 파이썬 코드를 이용해서 a라는 문자를 80개정도 만들어보았다.

만들어진 'a'의 80개를 복사를 해준다.

(위 파이썬코드는 편의를 위해서 사용하였으며 64이상의 공간을 요구하므로 넉넉잡아서 80개의 a를 생성하였다.)

(자세히는 모르겠지만 modified와 buffer사이에 64만 넘는다고 덮어지는 것이 아니라 덤프 값이 운영체제별로 존재할 수 있다고 하므로 넉넉잡아서 80개 정도를 생성해준 것이다.)

 

사실 뭐 이렇게 다시 실행을 시켜주고 a를 80개 대입해주면 modified가 변조되면서 원했던 print문의 메시지가 출력되는 것을 확인할 수 있다.

매우 간단하고 이해하기도 쉬운 변수 덮어씌우기 예제였다.

-추후 gdb를 통해서 자세한 원리를 확인하는 방법도 추가할 예정

'System > ProtoStar' 카테고리의 다른 글

원하는 스택 바꾸기 - protostar  (0) 2019.11.15