2017-10-18 16 views
-2

먼저 BYTE (부호없는 char)에 XOR 암호화를 수행하려고 시도합니다. 즉, 먼저 정의하지 않고 함수에 직접 전달하려고합니다.XOR BYTE 배열 (쉘 코드)

XOR 함수 :

void xor(BYTE input[], BYTE output[]) { 
BYTE key[] = { 'T', 'A', 'M' }; //Can be any chars, and any size array 

int i; 
for (i = 0; i < sizeof(input); i++) { 
    output[i] = input[i]^key[i % (sizeof(key)/sizeof(BYTE))]; 
} 

BYTE 배열 예 :

BYTE Shellcode[] = 
{ 
    0x48, 0x83, 0xEC, 0x08,          
}; 

문제 내가이어서 메모리에 노출되기 때문에 암호화를하지 않고 바이트 배열을 저장할 해달라고이다.

어떻게 먼저 BYTE 배열을 정의하지 않고 함수에 전달할 수 있습니까?

문자열을 포함하는 간단한 char 배열을 사용하면 물론 쉽게 될 수 있지만 문자열 리터럴 대신 정수 값을 사용하여 바이트 배열을 전달하는 방법을 찾을 수 없습니다.

+0

함수 입력으로 전달할 수 있으면 메모리에 노출되어야합니다. 문자열 리터럴을 사용하면 메모리 및 실행 파일에도 노출됩니다. – interjay

+2

'sizeof (input)'는 배열이 아닌 포인터의 크기입니다. – mch

+0

함수가 깨졌습니다. 함수 내에서 'sizeof'를 사용하여 해당 함수에 전달 된 배열의 길이를 인수로 사용할 수 없습니다. 이것은 주로 여러분이 * 배열을 전달할 수 없기 때문에 발생합니다 - 여러분이 생각하고있는 곳이면, 실제로는 첫 번째 배열 요소에 포인터를 전달하고있는 것입니다. 이러한 포인터는 배열의 요소 수에 대한 정보를 가지고 있지 않습니다. –

답변

0

문제는 메모리에 노출 될 것이므로 암호화하지 않고 BYTE 배열을 저장하고 싶지 않다는 것입니다.

어떻게 먼저 BYTE 배열을 정의하지 않고 함수에 전달할 수 있습니까?

이렇게 할 수 없습니다. 그것은 심지어 말이되지 않습니다. 을 전달하면 바이트가 이미 메모리에있는 데 따라 다르며 암호화 작업도 수행됩니다.

또한 프로그램이 평문 자체를 제공한다고 가정하면 평범한 텍스트가 어떤 형태로 프로그램 이미지에 저장되는 것을 피할 수 없습니다. 반대로, 외부 소스에서 plaintext 바이트를 가져온 경우 입력 한 지점에서 암호화 할 것을 고려할 수 있습니다. 세부 정보에 따라 메모리에있는 모든 일반 텍스트가 동시에 표시되는 것을 피할 수 있습니다.

처음 배열에 이러한 배열이있는 것을 피하는 대신 내용을 암호화 한 후 입력 배열을 지울 수도 있습니다. 그냥 0 또는 임의의 바이트로 덮어 씁니다. 그러나 이것은 외부 원천에서 나오는 평문의 경우에만 유용합니다. 프로그램 자체가 제공하는 데이터는 프로그램을 실행하지 않고도 액세스 할 수 있습니다.