티스토리 뷰

HackerSchool FTZ WARGAME Solution

 

Start : 15.07.03

 

LEVEL16

 

[그림 1]

 

hint 를 확인해 보면 [그림 1]과 같이 출력이 된다. 코드를 분석해보면 shell 함수와 printit 함수가 정의되어 있고, main 함수에서는 void 타입의 call 함수 포인터가 선언되어 있다. 그리고 해당 함수 포인터에는 printit 함수의 포인터가 저장되어 있으며 나중에는 call에 저장된 포인터로 함수를 호출한다. shell 함수에 상위 권한으로의 쉘을 실행시키는 코드가 포함되어 있으므로 우리는 이 shell 함수가 실행되도록 해야한다.

 


[그림 2]

 

gdb로 열어서 info functions 를 입력하면 정의된 함수 정보가 출력이 되는데 그 중 shell 함수의 주소값을 확인한다.

 

[그림 3]

 

이어서 어셈블리를 확인해서 buf 변수의 위치와 call 함수 포인터의 위치를 확인한다. 40byte 만큼의 차이가 나기 때문에 버퍼 오버플로우를 발생시켜 값을 덮어쓸 수 있다.

 

[그림 4]

 

공격에 필요한 파일을 [그림 4]와 같이 만드는데 이 때 덮어쓸 값은 shell 함수의 주소값을 넣으면 된다.

 

[그림 5]

 

버퍼 오버플로우를 진행하면 [그림 5]와 같이 상위 권한으로 쉘이 실행이 된 것을 확인할 수 있다.

신고
댓글
  • 프로필사진 ftz 글 잘 읽었습니다. 궁금한 것이 있어 댓글 남기겠습니다.
    보통 코드를 실행할 때마다 스택 주소가 바뀌게 되는데 이번 문제에서는 printit 함수와 shell 함수의 시작 주소가 계속 고정이 되던데.
    무슨 차이가 있을 까요?
    attackme에 대한 스택 주소는 랜덤하게 바뀌는데 attackme 안에 있는 printit함수와 shell 함수의 주소는 왜 항상 고정되어 있는지 궁금합니다.
    2016.03.30 16:43 신고
댓글쓰기 폼