2012-04-11 2 views
1

버퍼 오버플로에 취약한 프로그램을 개발할 숙제를하고 있습니다. 큰 char 어레이를 생성하고 먼저 조작 지침없이 완전히 채 웁니다.다중 문자 상수 경고 문제를 해결하는 방법

내가 믿어야 할 것은 악의적 인 코드를 버퍼 어딘가에 복사하고 (악의적 인 코드를 어떻게 든 할 수있는 부분) 공격 가능한 함수의 반환 주소를 어떻게 든 수정하여 악성 코드가 어디에 있는지 입니다.

내가 설정하고자하는 주소를 알고 있습니다 (예 : ½¾¿º). 그러나 몇 가지 경고가 표시되며 원인에 대해 알지 못합니다. 나는 각 과제에 대한 얻을

int start_of_return_address = 10; 
chars[start_of_return_address + 0] = '½'; 
chars[start_of_return_address + 1] = '¾'; 
chars[start_of_return_address + 2] = '¿'; 
chars[start_of_return_address + 3] = 'º'; 

경고입니다 :

코드 (본질적으로) 경고를 일으키는 즉 내가의 bdbebfba (주소를 변환하여 주소를 가지고
warning: overflow in implicit constant conversion 
warning: multi-character character constant 

악의적 인 코드)을 문자로 변환합니다 ( ½¾¿º을 생성 함).

경고를 유발할 수있는 아이디어 또는 문자 배열에 주소를 복사 할 수있는 다른 방법은 무엇입니까?

숙제를위한 것임을 명심하십시오.

+0

어떻게 'bdbebfba'를'문자 '로 변환 했습니까? – ArjunShankar

답변

4

bdbebfba에서 문자로 변환하는 것이 좋습니다.

그 주소가, 그리고 내가 문자 배열에 저장하고자한다면 내가 할 것입니다 경우

chars[start_of_return_address + 0] = 0xbd; 
chars[start_of_return_address + 1] = 0xbe; 
chars[start_of_return_address + 2] = 0xbf; 
chars[start_of_return_address + 3] = 0xba; 

그것은 4 바이트 값이기 때문에 4 자로는 것이다 맞습니다.

나는 endian-ness도 중요하다고 생각합니다. 시스템이 리틀 엔디안 (x86) 인 경우 최하위 바이트가 하위 주소로 이동합니다 (할당 순서가 바뀝니다).

chars[start_of_return_address + 4] = 0xbd; 
chars[start_of_return_address + 3] = 0xbe; 
chars[start_of_return_address + 2] = 0xbf; 
chars[start_of_return_address + 1] = 0xba; 
+0

이것은 그 것이었다! 고맙습니다! 이 endian-ness는 실제로 중요한 요소 (코드 작업의 두 번째 세트)이므로 편집을 해 주셔서 감사합니다. – Fred

1

당신이 우리를 보이고있다 문자 리터럴 ('½''¾', '¿', 'º')을 위해 다중 상수로 해석되어서는 안된다. 그들은 아마 인코딩 문제라고 생각합니다 : 예를 들어 소스에서 UTF-8 (따라서 2 바이트)로 인코딩 될 수 있지만 컴파일러는 다른 인코딩을 기대합니다 (Latin-1은 가정합니다 - - 맞다면 '½', '¾', '¿', 'º'으로 표시되며 상수에는 두 개의 문자가 있다고 간주합니다.

관련 문제