임베디드
수년 동안 데스크탑 컴퓨터의 보안은 관심사였습니다. 기계가 인터넷에 연결되면 본질적으로 일종의 공격 가능성이 있습니다. 이러한 침투는 데이터를 훔치거나 시스템을 손상시키거나 어떤 식으로든 작동을 변경하는 것일 수 있습니다. 보호 수단은 잘 알려져 있으며 널리 적용됩니다. 임베디드 시스템은 네트워크에 거의 연결되지 않았고 코드가 일반적으로 일종의 ROM에 있었기 때문에 항상 이러한 문제에 영향을 받지 않는 것처럼 보였습니다. 여러가지가 바뀌었다. 최신 시스템의 상당 부분이 인터넷에 연결되어 있으며 코드를 RAM에 복사하여 RAM에서 실행하는 것이 일반적입니다. 이는 보안이 이제 중요한 임베디드 소프트웨어 설계 고려 사항임을 의미합니다.
영어는 훌륭한 커뮤니케이션 도구입니다. 그것은 매우 정확하고 미묘하게 의사 소통을 가능하게하는 매우 표현적인 언어입니다. 그러나 일상적인 말에서 우리 대부분은 게으르고 종종 100% 정확도가 없는 단어를 사용합니다. 여기서 내가 염두에 두고 있는 예는 안전 및 보안 동의어인 것처럼 거의 같은 의미로 사용됩니다. 내가 들은 가장 좋은 정의는 다음과 같다고 생각합니다. 안전은 장치로부터 세상을 보호하는 과정입니다. 보안은 세상으로부터 장치를 보호하는 것입니다. 오늘의 주제는 보안입니다.
시스템이 완전히 방탄해야 하는 경우 산업 등급 암호화가 필요합니다. 이를 위해서는 일반적으로 특정 하드웨어 지원이 필요하며, 이러한 지원은 쉽게 사용할 수 있지만 높은 보안이 필요하지 않은 응용 프로그램에는 과잉으로 간주될 수 있습니다. 그러한 경우에는 다른 옵션이 있으며 그것이 제가 탐구하고 싶은 것입니다.
해커가 장치의 메모리 내용에 액세스할 수 있으면 장치가 하는 일과 수행 방법을 알아낼 수 있습니다. 이것은 작동을 변경하는 첫 번째 단계입니다. 코드가 분해될 수 있으므로 논리가 드러날 수 있습니다. 암호화가 없으면 이를 방지하기 위해 할 수 있는 일이 거의 없습니다. 해커가 다음으로 할 수 있는 일은 데이터의 16진수/ASCII 덤프를 보고 의미 있는 내용을 찾는 것입니다. 그들은 패턴과 인식 가능한 구조를 찾고 있습니다. 여기에서 몇 가지 예방 조치를 취할 수 있습니다. 암호화는 옵션이 아닐 수 있지만 난독화는 가능합니다.
데이터 난독화의 목표는 단순히 데이터를 식별할 수 없도록 만들어 해커를 지연시키거나 저지하는 것입니다. 메모리 덤프를 검색할 때 쉽게 찾을 수 있는 것 중 하나는 텍스트 문자열입니다. 이것이 제가 여기서 집중할 것입니다.
C/C++ 코드에서 텍스트 문자열은 일반적으로 널 바이트로 끝나는 ASCII 코드를 포함하는 바이트 시퀀스입니다. 알아보기 쉽기 때문에 바꿔보겠습니다. 첫째, 널 종결자 대신 각 문자열의 첫 번째 바이트가 길이 지정자가 됩니다. 문자열의 문자는 데이터를 약간 스크램블하여 덜 친숙하게 보이게 합니다. 내가 할 일은 각 바이트의 두 니블을 바꾸는 것뿐입니다. 일반 텍스트 문자열을 제공하고 적절한 초기화를 통해 배열에 대한 선언을 생성하는 유틸리티 프로그램이 필요합니다. 다음은 이 유틸리티의 핵심 기능입니다.
void scramble(int index, unsigned char *input){ unsigned char *charpointer, character; printf("unsigned char string%d[%d] ={0x%02x,", index, strlen(input)+1, strlen(input)); 문자 포인터 =입력; while(*charpointer) { 문자 =*charpointer++; 문자 =((문자 &0x0f) <<4) | ((문자 &0xf0)>> 4); printf("0x%02x", 문자); if (*charpointer) printf(","); } printf("}; // \"%s\"\n", 입력);}
이 함수에 인덱스 4와 "Hello world"(원본 eh?) 문자열을 전달하면 출력은 다음과 같습니다.
<미리>부호 없는 char string4[12] ={0x0b, 0x84, 0x56, 0xc6, 0xc6, 0xf6, 0x02, 0x77, 0xf6, 0x27, 0xc6, 0x46}; // "안녕하세요"이것을 복사하여 코드에 붙여넣을 수 있습니다. 그런 다음 텍스트를 표시해야 할 때 텍스트를 해독하는 함수를 작성하기만 하면 됩니다. 각 문자열에 색인 번호를 지정하는 대신 index 문자열이 있는 매개변수. 주석이 문자열을 읽을 수 있는 형식으로 보여주기 때문에 생성된 코드는 다소 자체 문서화되지만, 물론 이것은 소스 코드에만 나타납니다. 해커가 귀하의 소스 코드에 액세스할 수 있다면 귀하는 충분히 문제가 있어 제가 더 이상 도움을 드릴 수 없습니다!
다음은 스크램블 해제 프로세스를 설명하는 몇 가지 코드입니다.
void main(){ unsigned char temp, buffer[50]; 정수 카운트 =string4[0], 인덱스=0; while(count--) { temp =string4[index+1]; 온도 =((온도 &0x0f) <<4) | ((온도 &0xf0)>> 4); 버퍼[인덱스] =임시; 인덱스++; } 버퍼[색인] =0; printf("-%s-\n", 버퍼);}
각 바이트의 니블 교환은 스크램블을 수행할 수 있는 여러 가지 방법 중 하나입니다. 또 다른 가능성은 각 문자를 3비트씩 왼쪽으로 회전하는 것입니다. 다음은 이를 수행하는 몇 가지 코드입니다.
unsigned char leftrotate3(unsigned char c){ c =(c <<3) | (c>> 5); 반환 c;}
내가 설명한 난독화 기술은 문자열을 문자별로 스크램블합니다. 대신 전체 문자열에 대해 작업을 수행할 수 있습니다. 예를 들어 문자열을 긴 비트 시퀀스로 처리하고 임의의 수만큼 왼쪽으로 회전합니다. 이 알고리즘의 코딩은 더 열성적인 독자에게 맡기겠습니다.
모든 텍스트 문자열을 현지화할 때의 부작용은 다른 언어에 대해 다른 버전의 소프트웨어를 만드는 것이 매우 간단하다는 것입니다.
데이터 난독화는 방탄과 거리가 멀고 기껏해야 심각한 해커의 속도를 늦출 것이라는 점을 반복하고 강조해야 합니다. 다른 것이 없으면 스크램블 해제 코드가 분해될 수 있습니다. 이 기술의 트릭은 난독화를 따라가기 힘든 경로로 만드는 것입니다. 더 강력한 보안이 필요한 경우 전체 암호화를 살펴봐야 합니다.
임베디드
우리 모두 알고 있듯이 모든 조직에는 다른 요구 사항이 있으며 각 소프트웨어에는 모든 조직에 필요한 것이 있습니다. 두 조직이 동일한 산업에 속하고 동일한 작업 프로세스를 가지고 있더라도 요구 사항은 서로 다를 수 있습니다. 따라서 모든 소프트웨어에 대해 사용자 정의가 중요합니다. 이 블로그에서는 유지 관리 시스템에서 사용자 정의의 이점이 무엇인지 알게 될 것입니다. 자, 시간 낭비 없이 시작하겠습니다! 유지 관리 시스템이란 무엇입니까? 조직이 갑작스러운 장애로부터 자산을 안전하게 유지하는 데 도움이 되는 유지 관리 관리 시스템입
유지 관리는 자산 관리의 중요한 부분입니다. 자산 관리를 소홀히 하면 치명적인 결과를 초래할 수 있습니다. 중대형 조직은 자산이 풍부합니다. 유지 관리 도구 소프트웨어는 자산 집약적인 조직에 유용합니다. 많은 조직에서 자산 유지 관리를 위한 적절한 솔루션이 없습니다. 조직이 정기적으로 자산 유지 관리를 제공하지 않으면 자산 붕괴, 생산 지연과 같은 결과로 이어집니다. 고객 실망 만족하지 못한 고객이 다른 제품을 찾기 시작했다는 것을 알고 있습니다. 이러한 문제에 대한 해결책은 무엇입니까? 솔루션은 유지 관리 도구 추적 소프트웨어