본문으로 바로가기

[Protostar] Stack5 풀이, write-up

category Wargame/Protostar 2019. 1. 12. 22:12

Protostar --- Stack5



Stack5의 내용이다.


Stack5 is a standard buffer overflow, this time introducing shellcode.


Stack5의 내용을 해석해보면 다음과 같다.


Stack5는 기초적인 BOF이다, 이번엔 shellcode에 대해 소개한다.



Stack5의 Hint 내용이다.


At this point in time, it might be easier to use someone elses shellcode.

If debugging the shellcode, use \xcc(int3) to stop the program executing and return to the debugger remove the int3 once your shellcode is done.


Stack5의 Hint를 해석해보면 아래와 같다.


이번엔, 다른 사람의 shellcode를 이용하는것이 더 쉬울것이다.

만약 shellcode를 디버깅한다면, 실행되고 있는 프로그램을 종료시키기 위해 \xcc(int3)를 사용해라.

shellcode가 완료 되었으면 \xcc(int3)를 제거해도 된다.



stack.5의 소스를 분석해보자.



1
2
3
4
5
6
7
8
9
10
11
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
 
int main(int argc, char **argv)                                                        
{
  char buffer[64];
 
  gets(buffer);
}
cs



char type 64 byte array buffer를 선언한다.

gets() 함수를 이용해 user로부터 입력을 받아 buffer에 저장한다.


stack5.c의 내용은 정말 간단하다. 다만 이번에는 shell을 띄우는것을 목적으로 한다.


stack5가 어떤 stack 구조를 가지고 있는지 확인하기 위해서, gdb를 통해 분석을 진행해보자.





이를 바탕으로 stack 구조를 그려보면 아래와 같이 그려볼 수 있다.





stack5를 분석한 내용을 바탕으로 shellcode를 띄우기 위한 방법에 대해 공부해보자.



이 문제를 풀기위한 방법은 크게 2가지로 정리하겠다.


1. buffer에 쉘코드 삽입 후 RET overwriting.

2. RET 하단(주소가 더 높은쪽)에 쉘코드를 삽입 후 RET overwriting.



1. buffer에 쉘코드 삽입 후 RET overwriting.


1번을 이용하기 위해서 우리가 알아야할 정보는 다음과 같다.


1) shellcode

2) buffer부터 RET까지의 거리

3) buffer의 주소



1)은 구글링을 통해 27 byte shellcode를 얻었고,
2)은 stack 구조 분석을 통해 72 byte의 패딩을 이용해 RET에 접근할 수 있다는것을 안다.

3)을 알기 위해 gdb를 통해 buffer의 주소를 찾아보자.





3) buffer의 주소가 아마 0x7fffffffe160이라는것을 알 수 있다.

 


실제로 0x7fffffffe160를 RET에 overwriting하면 성공해야하지만, Segmentation fault (core dumped)가 뜨는것을 확인할 수 있다.

gdb를 통해 분석한 buffer의 주소가 실제 buffer의 주소와 다를 수 있기 때문에 core dumped 된 파일을 분석했다.





buffer의 시작주소가 0x7fffffffe1c0로 바뀐것을 확인할 수 있다.

RET를  0x7fffffffe1c0로 overwriting하면 아래와 같이 shell을 획득할 수 있다.






2. RET 하단(주소가 더 높은쪽)에 쉘코드를 삽입 후 RET overwriting.



2번을 이용하기 위해서 우리가 알아야할 정보는 다음과 같다.


1) shellcode

2) buffer부터 RET까지의 거리

3) RET 하단(주소가 높은 부분)의 주소(shellcode가 시작되는 주소)


1) shellcode는 27 byte이고 ,2)는 1번을 통해 72 byte라는 것을 알았고,

3) shellcode가 시작되는 주소는 RET의 바로 아래 부분으로 맞출 것이다. 





shellcode의 시작 주소는 0x7fffffffe1b0가 될 것이다.


이를 바탕으로 payload를 작성하면 다음과 같다.





하지만 Segmentation fault (core dumped)가 뜨는것을 확인할 수 있다.

core를 분석하면 shellcode의 시작주소가, 0x7fffffffe210으로 변경된것을 확인할 수 있다.

이를 바탕으로 payload를 재작성하면 아래와 같은 결과를 얻을 수 있다.










'Wargame > Protostar' 카테고리의 다른 글

[Protostar] Stack6 풀이, write-up  (0) 2019.01.16
[Protostar] Stack4 풀이, write-up  (0) 2019.01.09
[Protostar] Stack3 풀이, write-up  (1) 2019.01.08
[Protostar] Stack2 풀이, write-up  (0) 2019.01.07
[Protostar] Stack1 풀이, write-up  (0) 2019.01.06