본문 바로가기

분식집/해킹..!?

Buffer overflow란

버퍼: 시스템 연산 작업을 위해 필요한 데이터를 임시로 저장하는 공간.

(대부분의 프로그램이 스택을 버퍼로 이용함.

(*malloc()과 같은 반영구적인 데이터 저장 X)

 

 

Buffer overflow Attack

=>버퍼의 크기가 40으로 설정

40바이트-> 가능!

41~44바이트-> 이전 함수의 bp를 수정할 것.

45~48바이트->return address의 공간 침범

48바이트 이상->이전의 스택에 저장한 값마저도 침범하게 됨.

 

공격자가 메모리상의 임의의 위치에다 원하는 코드를 저장시키고,

return address가 저장된 지점에 해당 코드를 집어 넣음으로써

EIP에 공격자의 코드가 있는 곳의 주소가 들어가게 해 공격을 하는 방식.

(*버퍼에 데이터를 쓸 때 원하는 코드를 넣게 되는데,

정확한 return address 저장 위치를 찾아 조작해야 함)

 

 

strcpy(buffer2, receive_from_client);

라는 코드가 있다고 하자.

client에게 받은 데이터를 buffer2, buffer1에 복사하는 코드

 

strcpy()함수는 몇 바이트를 저장할지 지정해주지만

strcpy함수는 길이 체크를 해주지 않아서

 

receive_from_client가 NULL을 만날 때까지 복사를 한다.

위와 같은 스택 구조에서 45~48바이트 위치의 return address도 조작해야 하고

공격 코드도  넣어줘야 한다.

 

 

공격자(클라이언트)가 전송하는 데이터는 receive_from_client에 저장되어 버퍼에 복사될 것이다.

 

strcpy가 호출되어 receive_from_client가 buffer2에 복사될 것을 예상하면

위와 같은 모습으로 스택에 자리 잡게 된다.

 

*Byte order

=>잘 보면 데이터의 저장 순서가 이상하다고 느끼는데,

바이트 정렬 방식 때문이다.

 

현존하는 시스템은

big endain//little endian 두가지 저장 방식을 갖는다

각각, 바이트 순서가 낮은 메모리 주소에 높은 메모리 주소로 되고,(BE)

(IBM 370/RISC 기반 컴퓨터, 모토로라의 마이크로 프로세서)

높은 메모리 주소에서 낮은 메모리 주소로 저장하는 방식이다.(LE)

(IBM 호환 sys, 알파 칩의 시스템)

 

74E3FF59

->Big E=> 74E3FF59

->Little E=>59FFE374  와 같은 방식으로 저장

(리틀 E를 쓰는 이유는 수를 더하거나 뺄때, 낮은 메모리 주소 영역의 변화가 수의 크기 변화에 비해 적기 때문.)

 

EX. 위 수에 1을 더함

->74E3FF5A   

->5AFFE374=>낮은 수의 변하는 낮은 메모리 영역에 영향을 받고,

높은 수의 변화는 높은 메모리에서 잡게 하겠다는 것.

 

(**Byte order의 방식을 공격시 고려해야 한다! Little E라면 바이트를 뒤집어 넣어줘야함.)

 

 

 

위 그림의 공격 코드는 execve("/bin/sh",...) (쉘을 띄우는 것.)

(해당 코드는 실제 쉘 코드는 아님. 그냥 저런 코드가 들어 있다는 이야기.)

 

쉘 코드의 시작점은 0xbffffa60으로, 

함수 리턴시 return address는 EIP에 들어가게 될 것이고.

execve("/bin/sh",..)를 수행하게 되는 것이다.

 

 

(**return address위의 버퍼 공간이 쉘 코드를 넣을 만큼 충분하지 않다면?

=>다른 공간을 찾아야지!, 위의 공간에서는 function함수가 사용된 스택 공간)

=>return adrress이후 40byte공간의 명령을 수행하게 하면 됨.

(return address에 40주면 안되냐고? 명령어의 주소를 정확히 알아내는건 어려움)

따라서, 수행 지점 변경을 하는걸 사용.

=>이럼에도 부족하다면...?

return address부분을 제외한 위아래 모든 공간을 사용하게 코딩, 안되면 또 다른공간을 찾아야지..

'분식집 > 해킹..!?' 카테고리의 다른 글

HTTP의 요청과 응답.  (0) 2023.02.19
Buffer overflow-쉘 코드 만들기  (0) 2023.02.15
레지스터 진행 따라가기  (0) 2023.02.15
데이터 통신이란!  (0) 2023.02.10
8086CPU의 레지스터 구조(달고나)  (0) 2023.02.10