오늘은 간단하게 OOB(Out Of Boundary)에 대해 다뤄보고자 합니다. 매우 간단한 내용이라서 쉽게 이해할 수 있을겁니다. 물론 그만큼 치명적인 취약점이기도 합니다.
OOB란 말그대로 정해진 범위를 초과해서 비정상적인 행위를 유발하는 것이라고 생각하시면 됩니다. 비정상적인 행위란 임의의 코드를 실행하거나 함수를 불러오거나 비정상적인 값을 삽입하거나 이용하는 여러가지 행위들을 말합니다. 간단한 예시를 통해 확인해보겠습니다.
#include <stdio.h>
int main()
{
int idx;
int buf[5] = {0,};
int chk = 0;
printf("Input Index : ");
scanf("%d",&idx);
printf("Input Value : ");
scanf("%d",&buf[idx]);
if(chk == 1234)
printf("PASS\n");
else
printf("FAIL\n");
return 0;
}
프로그램의 내용은 간단합니다. 원하는 buf의 index값을 입력 받고 해당 위치에 정수를 입력 받은 뒤 뜬금 없지만 chk 값이 1234면 PASS 그렇지 않으면 FAIL을 출력하는 프로그램입니다. 그런데 여기서 문제가 발생합니다. index값을 입력받을때 입력값을 검증하지 않아서 정해진 buf 주소의 밖(out of boundary)에 사용자가 값을 입력할 수 있게됩니다. 이게 왜 문제가 되냐하면 실제 해당 프로그램에서 선언한 변수들이 나란히 붙어있기 때문에 idx값을 입력받을때 잘(?) 입력해주면 사용자가 chk값의 주소에 원하는 값을 넣을 수 있기 때문이죠.
쉬운 이해를 위해 각 변수의 주소값을 출력해주게 소스코드를 변경하여 실행해봤습니다. 자료형이 int기 때문에 각 주소는 4만큼 차이나고 buf[0]의 주소와 chk의 주소가 4만큼 차이나는 것을 확인할 수 있습니다. 그리고 주소상 chk가 buf[0]보다 위에 위치하고 있기 때문에 사용자가 buf의 index값을 입력할때 -1을 넣어주고 PASS조건인 1234를 입력한다면..?
위의 그림처럼 buf[idx]주소가 chk의 주소를 가르키게되고 해당 위치에 1234가 들어가서 정상적인 방법으로는 절대 PASS가 뜰 수 없는 PASS가 뜨는것을 확인할 수 있습니다.
위의 취약점을 방지하기 위해서는 idx값을 입력받을때 범위내인지 검증을 하는 과정을 넣어주면 됩니다. 사실.. 에당초 저런식의 프로그램이 흔치 않으니 저런일이 발생할 일이 거의 없긴 하겠지만말이죠..
'Pwnable > Tech' 카테고리의 다른 글
Return to Shellcode (0) | 2019.08.09 |
---|---|
함수의 호출과 복귀 (0) | 2019.08.09 |