그냥 챈 구경하다가 신기한 챈 있길래 잡글 하나 써보고 감. 전공생이라면 아마 다들 아는 이야기겠지만, 요즘은 코딩 배우는 경로가 여러가지니까 모르는 사람도 있을 수 있을거 같음. 

본인은 그냥 시스템 해킹 공부하는 학생임. 



오늘 해볼 얘기는 메모리 오염과 관련된 이야기임.  본인이 코딩 처음 시작하는데  C/C++ 같은 네이티브 언어들로 개발을 하겠다면 

어느정도 도움이 될 수 있음. 메모리 오염(memory corruption) 이 뭐냐하면, 말그대로 메모리에 있는 값(그니까 변수들의 값)이 비정상적인 값으로 오염됐다는거임. 그리고 변수들이 비정상적인 값으로 변하게 되면 프로그램이 비정상적인 행동을 할 수 있기 때문에 문제가 됨.


먼저 프로그램에서 사용하는 메모리는 다음과 같이 구분됨. 실제로 DRAM에 영역이 나눠진게 아니라, 운영체제에서 어디서 어디까지는 ~~ 이다 같이 배정해주는거임. 

먼저 text 영역임. 얘네는 말그대로 님들이 작성한 코드가 들어감. cpu는 여기서 코드를 읽고 실행함. 

일반적으로는 이 영역에만 코드 실행 권한이 존재해서 다른 주소에는 올바른 코드가 적혀있어도 실행이 안됨. 


stack 은 역변수와 함수 실행/종료를 위한 값들이 저장되는 곳임. 


heap 은 크기가 유동적인 놈으로, 사용자 관리하에 할당/해제되는 메모리임. 


물론 해제된다고 해당 메모리가 바로 사라지는건 아님. 사라질 수도 있고 아닐 수도 있고. 



C언어 처음 배울때 버퍼 크기를 초과해서 복사하면 다들 VS에서 이상한 메세지가 뜨는걸 한번쯤은 봤을거임. 아래 사진은 그냥 퍼온거 ㅇㅇ

그냥 무시하고 코딩하다간 언젠가 치명적인 결과를 맞이 할 수 있음 ㅇㅇ...

얘를들어 아래와 같은 코드가 있다고 해보자. 

누가봐도 vuln 함수에서 버퍼오버플로(BOF)가 난다. 사실 메모리 오염의 대부분은 이 버퍼오버플로가 원인임. 

프로그램 실행 흐름은 main -> vuln -> main 으로 흘러갈텐데, vuln 함수가 실행될 때 vuln 함수가 끝날 때 복귀할 주소를 스택에 박아놓음. 이 복귀할 주소를 보통 RET 이라고 함.

물론 코드상으로 vuln() 뒤에는 아무것도 없는것 같지만, 어셈블리 수준(C언어 코드는 컴파일러를 통해서 어셈블리 코드로 변환되서 text 영역에 저장됨)에서 보면 main 함수의 종료를 위한 코드가 조금 추가되어있기 때문에 vuln 이 끝나면 그 주소로 가서 나머지 코드를 실행하고 프로그램을 종료해야됨, 

근데 문제는 이 박아놓은 주소(RET)가  buf 뒤에 위치하기 때문에 변조될 수가 있음. 그러면 이제 vuln이 끝났는데 main 으로 안가고 이상한 주소로 갈 수 있다는 거임. 이제 여기서 공격자는 추가적인 정보(text 영역에서 활용가능한 주소)를 더 알게되면 임의코드실행이 가능해지는거고. 

만약에 저런 취약점이 서버 프로그램에서 발생했다면 임의코드 실행 없는 단순 프로그램 종료만으로도 DoS(서비스 거부 공격)가 되니까 상당히 위험함. 




위에서 설명한게  크롬 브라우저의 제로데이 취약점이나, Adobe 같은 제품에서 발생하는 취약점의 기초임. 

예시를 들자면 그냥 특정 홈페이지를 크롬으로 열었는데 컴퓨터에 랜섬웨어 깔리는게 가능함. 이런 취약점이 8만 달러인가 받은걸로 알고있는데..

물론 현대 컴파일러, 운영체제, cpu는 이를 막기 위한 노력(RET 앞에 특정 랜덤값을 집어넣어서 해당 값이 변조되면 프로그램 종료 등)을 열심히 하고 있지만, 개발자가 1차적으로 주의해야되는건 당연한거임. 잠재적인 보안 취약점이 있다는거 자체가 다른 취약점과 연계되어서 쓰일 수 있고, 실제로 쓰이기 때문. 



요약 : 메모리 관리 잘하고, 메모리 복사와 관련된 코드는 처음부터 세심하게 설계하는게 좋다. 

사실 근데 스택 BOF로 해킹하는 경우는 별로 없음. 대부분 힙이지. 


잘못된점이나 궁금한점 있으면 질문받음.