일전에 미리 포장된 쿼리 집합에서 선택한 다음 서버와 통신하여 선택한 쿼리에 대한 답을 검색할 수 있는 프로그램을 발견했습니다. 나는 프로그램이 서버와 인증을위한 암호를 요구하지 않았다는 것을 깨달았을 때 궁금해하기 시작했다. 암호가 프로그램에 포함된 것으로 나타났습니다. 저자는 1) 아무도 그것을 읽을 수 있도록 이진 파일이었기 때문에 괜찮다고 설명했고, 2) 암호를 읽을 수 없다면 암호 문자열을 찾을 수 없을 것이라고 설명했습니다.
이러한 이유 중 어느 것도 유효하지 않으며 이 게시물을 사용하여 이를 보여주고 싶습니다. 내 예제 프로그램은 터미널에 "암호"를 작성하지만 악성 사용자가 검색해야 하는 문자열의 수와 실제 프로덕션 프로그램의 유일한 차이점은 됩니다.
#include <stdio.h>
#include <string.h>
main ()
{
char password [9] = {"secret"};
printf ("This is the password: %sn", password);
}
|
그림 1 – 암호가 내장된 기본 프로그램 |
실행하면 표시
x1
이것은 암호입니다 : 비밀
준비 됨 14:12:16
|
그림 2 – 기본 프로그램 실행 |
프로그램 모듈에 문자열을 표시하려면 악의적인 사용자가 >system>gnu_library>bin 디렉터리에서 문자열 명령을 사용할 수 있습니다. -n5는 출력을 5자 이상 문자열로 제한합니다. 디스플레이를 단축하기 위해 출력(. . . . . .)을 잘렸지만 암호가 표시된 첫 번째 문자열 중 하나임을 알 수 있습니다. "로그인" 또는 "암호" 또는 "관리자", "루트" 또는 "SQL"과 같은 식별 가능한 사용자 ID와 가까운 곳에 암호를 사용하면 검색이 더 쉬워집니다.
>시스템>gnu_library>빈>문자열 -n5 x1.pm
바인딩, 릴리스 17.1.beta.be
phx_vos #
Noah_Davids.CAC
프리릴리즈
암호입니다: %s
비밀
s$start_c_program
_preemption_cleanup
_exit
. . . . .
|
그림 3 - GNU 문자열 명령을 사용하여 프로그램 모듈에서 4자 이상의 모든 문자열을 찾습니다. |
문자열 명령을 사용할 수 없는 경우 악의적인 사용자는 프로그램 모듈만 표시할 수 있습니다. 나는 우리 모두가 우연히이 작업을 수행 한 것으로 의심하고 예쁘지 않은 동안 그것은 암호를 표시합니다. 나는 다시 출력을 잘렸고 다시 암호를 볼 수 있습니다.
d x1.pm
%phx_vos#m16_mas>SysAdmin>Noah_Davids>x1.pm 11-01-13 14:13:59 mst
'00'01'00'1Abind, 출시 17.1.beta.be'00'00'00'00'00'00'00'00'00'04ctp
'00'00'00'00'0
+'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'
0phx_vos
+#00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'
00'00노아
. . . .
+'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'C
D'8B'C0
+'00'00'00'00 이것은 암호입니다 : %s
'00'00'00'00'00'00'00비밀'00'00'00'00'00'00'00'00'B0'00'00'00'00'00'00'00'01'00
'00'00,'
+'00'00'04'00'00'00'00'00'00'00'00'FF'F8'FE'00'04main'00'00'83'EC'2C'C7D$00
. . . .
|
그림 4 – 암호를 찾기 위해 프로그램 모듈 표시 |
프로그램에 암호를 포함시키는 몇 가지 대안이 있습니다.
암호를 파일에 배치할 수 있으며 프로그램에서 파일을 읽을 수 있습니다. "실행해야 하는" 사용자만 파일에 대한 읽기 액세스 권한이 주어지며 다른 모든 사람만 null 액세스 권한을 얻습니다. 물론 "실행해야"은 "암호를 알아야 합니다"와 동일시되지 않을 수 있습니다. 또한 누군가가 실수로 액세스를 변경하는 위험이 항상 있습니다.
대안은 프로그램에 암호 문자열을 유지하고 프로그램에 대한 액세스를 제한하는 것입니다. 이 솔루션은 또한 "액세스 목록을 쉽게 변경할 수 있습니다" 문제로 인해 발생합니다. 프로그램이 다른 프로그램에서 실행할 수 있는 다른 프로그램과 동일한 디렉터리로 유지되면 액세스 목록 변경 가능성이 높아집니다.
마지막으로 프로그램 모듈에 암호를 유지하지만 문자열을 난독화할 수 있습니다. 다음 프로그램은 이 작업을 수행하는 간단한 방법을 보여줍니다.
#include <stdio.h>
#include <string.h>
main ()
{
char obfuscate [9] = {0x0c, 0x81, 0xe2, 0x94, 0xe6, 0x9c};
char key [9] = {127, 228, 129, 230, 131, 232, 133, 234, 135};
char password [9];
int i;
for (i = 0; i < strlen (obfuscate); i++)
password [i] = obfuscate [i] ^ key [i];
password [i] = 0x0;
printf ("This is the password: %sn", password);
}
|
그림 5 – 난독처리된 암호 문자열이 있는 프로그램 |
당신이 할 수있는 모든 것을 볼 수 있듯이 난독화 문자를 가지고 XOR는 암호를 만드는 다른 키 문자 세트와 함께 그들을 합니다. 프로그램을 실행면 첫 번째 프로그램과 동일한 출력이 생성됩니다.
x2
이것은 암호입니다 : 비밀
준비 14:12:51
|
그림 6 – 난독화 된 프로그램의 실행 |
그러나 문자열에 대한 검색은 암호처럼 보이는 것을 표시하지 않습니다
>시스템>gnu_library>빈>문자열 -n5 x1.pm 바인딩, 릴리스 17.1.beta.be phx_vos # Noah_Davids.CAC 프리릴리즈 암호입니다: %s s$start_c_program _preemption_cleanup _exit . . . . |
그림 7 – 문자열 명령더 이상 암호가 표시되지 않습니다. |
그리고 파일을 표시하는 동안 난독 암호 문자와 당신이 그들을 찾기 위해 볼 위치를 정확하게 알아야하고 또한 암호를 만들기 위해 결합하는 방법을 알아야합니다.
d x2.pm
%phx_vos#m16_mas>SysAdmin>Noah_Davids>x2.pm 11-01-13 14:15:27 mst
. . . .
+'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'CD'8B'
C0'00'0
+0'00'00 암호입니다: %s
'00'00'00'00'00'00'00'0C'81'E2'94'E6'9C'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'7F
'E4'81'
+E6'83'E8'85'EA'87'00'00'00'00'00'00'B0'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'00'0
4'01'B0
+'00'03@00'FF'F0'08'08'FF'FE'00'04main'00'00'00'83'EC'89$X'89t$T'89 $P|'C
7D$L'00
|
그림 8 – 프로그램 모듈 표시더 이상 인식 가능한 암호를 표시하지 않습니다. |
프로그램 모듈을 분해하여 암호가 생성되는 방법을 파악할 수 있기 때문에 이것은 여전히 완벽한 해결책이 아닙니다. 여전히 프로그램을 분해하면 프로그램 모듈을 표시하는 데 훨씬 더 정교해야 합니다.
난독처리된 암호 문자열을 파일에 넣은 다음 액세스 목록을 통해 파일을 보호하는 것에 대해 두 가지 생각을 가지고 있습니다. 한편으로는 암호를 변경해야 하는 경우 이 문제는 프로그램에 난독처리된 암호 문자열을 포함시키는 훨씬 더 나은 솔루션입니다. 다른 한편으로는 파일에 다른 구성 옵션이 있더라도 문자열을 파일에 넣으면 악의적인 사용자에게 조사할 잠재적인 암호 문자열이 줄어듭니다. 물론 그는 여전히 파일에 액세스 한 다음 난독화 기술과 키를 파악해야합니다.
마지막으로 난독화된 암호 문자를 생성하는 방법은 무엇입니까? XOR 작업에 대한 좋은 점은 ((XOR B) XOR B)가 A와 같아서 원래 암호 XOR문자를 키로 사용하여 문자를 인쇄하는 짧은 프로그램을 작성했습니다.
#include <stdio.h>
#include <string.h>
main ()
{
char password [9];
char key [9] = {127, 228, 129, 230, 131, 232, 133, 234, 135};
char newPW [9];
int i;
strcpy (password, "secret");
for (i = 0; i < strlen (password); i++)
{
newPW [i] = password [i] ^ key [i];
printf ("%xn", newPW [i]);
}
}
|
그림 9 – 난독화된 암호를 생성하는 프로그램 |