반응형

Stack 기본 개념

====================================================================

Data segment에는 초기화된 전역변수가 들어가고, BSS segment에는 정적변수, 초기화되지 않은 전역변수가 들어간다. (BSS = Block Started by Symbol)

ptr 안의 값은 Heap 영역에 있게 된다.

 

ebp는 stack의 base pointer이다. 

b는 ebp에서 12byte 위에 저장이 되는 것을 알 수 있다.

 

PC는 다음에 실행할 명령어의 위치를 가리키며, Text segment에 있다.

f가 호출되면 f의 stack frame이 push된다.

 

ebp는 하드웨어적으로 하나 밖에 없음.

가장 마지막에 stack에 push된 프레임을 가르킴.

 

 

fopen을 하여 read로 badfile을 open하고, open한 파일의 포인터를 변수badfile에 줌

그리고 badfile 변수가 가르키는 포인터로부터 300바이트를 읽어서 str로 가져옴.

 

 

foo는 300바이트를 받아서 strcpy를 함.

foo에 대한 스택 프레임이 생성됨.

 

300바이트를 100바이트에 카피하게됨 => 넘치게됨.

 

버퍼가 넘치게 되면서 return 주소가 덮여쓰여지게 된다. 

 

정상적인 명령들은 code segment에 잇음

 

return주소가 커널 영역을 가리키면 Access violation이 일어난다.

 

공격에 성공하면 공격자의 코드가 실행됨

 

버퍼에 300바이트를 주면 ret이 바뀌게 되고 ret이 악의적인 실행코드를 가리키도록 함.

 

실습하기 위해선 설정을 해야함.

 

1. 주소를 랜덤화하는 방어기법을 끈다.

2. 스택에서 명령어가 실행되도록 하고, stack protector를 끈다.

3. owner를 root로 하고, setUID bit를 설정한다.

 

공격자 입장에서는 두가지 문제점이 있음.

 

1. 버퍼와 리턴 주소의 차이 거리(offset)를 알아야함. => 그래야 리턴 주소 변경가능

2. 쉘코드를 어디에 넣을 것이냐? => 리턴 주소가 쉘코드를 가리키게 해야함

 

디버깅을 하여 foo를 break함

ebp를 보면 0xfffeaf8임을 알 수 있고 buffer의 시작주소가 0xbfffea8c임을 알 수있다.

그 차이는 108byte임을 알 수 있다.

saved ebp 4byte를 더하면 버퍼 시작으로부터 리턴 주소가 112바이트 만큼 떨어져잇음을 알 수 있다.

 

인자가 어디에 전달되는지 봐야함.

인자의 주소를 확인하면 0xbffff370임을 알 수 있다.

 

리턴 주소위에 인자가 쌓이므로 악의적 코드는 인자보다 위에 쌓으면 됨.

NOP을 넣어서 아무것도 실행하지 않는 코드를 넣는다

NOP는 다음 NOP로 다음 명령어를 넘기므로 계속해서 넘기다보면 악의적인 코드를 실행하게 됨.

 

디버깅을 통해 버퍼의 시작주소 리턴 주소간의 간격을 알았고, 리턴 주소에는 nop중 하나의 위치를 가리키게함.

 

파이썬으로 badfile을 만드는 것이다.

300 바이트를 nop로 채우고 쉘코드를 젤 뒤에 넣는다.

리턴주소는 버퍼의 시작주소에서 112만큼 뒤에 있다.

 

euid가 root로 바뀐것을 볼 수 있다.

 

dash는 보호기법이 있기때문에 zhs를 사용해야한다.

dash는 setUID 프로세스 내에서 실행될때 권한이 내려간다(real user)

 

기계어를 사용해야하지만 컴파일러를 통해서 만듬

name[0]  => bin/sh의 주소

name의 주소, NULL

 

execve는 11번임

주소값 bin/sh의 주소

argv의 주소

int 0x80 => 소프트웨어 인터럽트를 검

al에는 execve 콜 번호 11이 들어감

 

 

ebx 첫번째 인자 => bin/sh의 주소

eax => execve 번호 11

ecx => argv 주소

edx => 0

 

 

 

 

 

대응책

==================================================

1. 안전한 함수 사용

2. 안전한 라이브러리 사용 => 경계를 체크하는 함수

 

운영체제 => ASLR

 

컴파일러 => 스택가드

 

HW => NX bit

 

 

ASLR

---------------------

스택의 위치를 랜덤화 시킨다. => 코드가 메모리에 적재될 때 마다

공격자는 주소를 모르게 되고 ret과 shell code의 위치를 알기 어려움

 

sysctl -w kernel.randomize.va.space => 0,1,2 

 

2로 하였을때 완벽하진 않음

 

 

./stack을 12524번 실행하면 공격이 된 것을 알 수있음

 

 

 

 

 

Stack Guard

---------------------------------------------------------------------------------------------------------------------

 

guard를 0x00이나 NULL을 쓰면 ret을 덮어쓸수 없다 => NULL에서 끝나기 때문에

guard가 덮여쓰여지지 않으면 실행하고 덮여쓰여지면 중지함, canary라고도 함

 

dash는 EUID와 RUID가 다르면 setUID 프로그램을 non setUID프로그램으로 만듬

 

따라서 RUID를 높여야한다.

그러므로 복잡해진다 공격코드가

dash도 안전하진 않음

 

 

NX bit

----------------------------------------------------------------------------------------------------------------

메모리 영역 중 일부를 명령어가 실행되지 않도록 한다.

공격 코드가 들어가더라도 실행이 되지 않도록한다.

 

 

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Other Overflow Attacks  (0) 2020.10.16
Buffer Over flow 2  (0) 2020.10.16
set-UID Privileged programs  (0) 2020.10.15
운영체제보안 4  (0) 2020.09.22
운영체제보안 3  (0) 2020.09.16
블로그 이미지

아상관없어

,