본문 바로가기

카테고리 없음

6주차_시스템

 

버퍼

버퍼(Buffer)는 일상에서 ‘완충 장치'라는 뜻으로 사용되며, 컴퓨터 과학에서는 ‘데이터가 목적지로 이동되기 전에 보관되는 임시 저장소’의 의미로 쓰다.

 

버퍼 오버플로우

버퍼가 넘치는 것을 의미한다. 버퍼는 제각기 크기를 가지고 있는데, int로 선언한 지역 변수는 4바이트의 크기를 갖고, 10개의 원소를 갖는 char배열은 10바이트의 크기를 갖다. 

 

중요 데이터 변조

버퍼 뒤에 중요한 데이터가 있다면, 해당 데이터가 변조됨으로써 문제가 발생할 수 있다.

 

데이터 유출

C언어에서 정상적인 문자열은 널바이트로 종결되며, 표준 문자열 출력 함수들은 널바이트를 문자열의 끝으로 인식한다. 만약 어떤 버퍼에 오버플로우를 발생시켜서 다른 버퍼와의 사이에 있는 널바이트를 모두 제거하면, 해당 버퍼를 출력시켜서 다른 버퍼의 데이터를 읽을 수 있다. 획득한 데이터는 각종 보호기법을 우회하는데 사용될 수 있으며, 해당 데이터 자체가 중요한 정보일 수도 있다

 

실행 흐름 조작

공격자의 관점에서 바라보면, '스택 버퍼 오버플로우로 반환 주소(Return Address)를 조작하면 어떻게 될까'하는 궁금증을 가져볼 수 있다. 그리고 실제로, 함수의 반환 주소를 조작하면 프로세스의 실행 흐름을 바꿀 수 있다.

 

 

먼저 숫자 2개를 입력받아야한다. 첫번째 값이14보다 작거나 같음을 알 수 있다. <+60>부분을 보아 func4를 호출한다는 걸 알 수 있다. 

 

해당함수는 재귀함수임을 알 수 있다. func4에서 func4를 호출하고 있기 때문이다. 36번째에서 eax값에 0을 저장한다. 41번째에서 재귀 호출을 한다. 재귀를 하는 조건은 ecx가 edi값보다 작은 경우이다. 명령 순서는 22번째-> 36~43번째줄, 57번째 줄이다. ecx는 7이므로 첫 입력값은 7이다.