2011-05-07 2 views
0

이 질문이 멍청하거나 질문을 받았지만 찾을 수 없으면 죄송합니다.버퍼 오버플로 - 일부 ascii의 작업이 아닌 다른 이유는 무엇입니까

버퍼 오버 플로우를 사용하려고하는 프로그램이 있습니다. getchar()을 사용하여 사용자로부터 입력을 검색하는 간단한 프로그램입니다. 버퍼는 크기 12로 설정됩니다.> 12 x를 입력하거나> 12 \ x78을 사용하여 프로그램을 중단시킬 수 있지만 A 또는 \ x41을 수백 개 입력하면 오류가 발생하지 않습니다.

어떤 도움이나 올바른 방향을 가리키는 것이 대단히 감사하겠습니다.

+0

전체 프로그램을 게시하십시오. –

+0

메모리를 덮어 쓰는 경우, 바이트가 값을 변경하지 않을 확률은 항상 256입니다. –

+0

죄송합니다. 코드를 게시 할 수 없습니다. 이것이 코드가없는 일반적인 질문이라면 무시하십시오. 봐 주셔서 감사합니다. – Robert

답변

0

0x41414141은 프로세스의 텍스트 페이지 내에 유효한 주소 일 수 있습니다. 자세한 내용은 프로세스의 세그먼트 맵을보십시오.

+0

이것이 무슨 뜻인지 잘 모르겠지만 100 A로 gdb를 돌렸고 버퍼 [11] 위의 로컬 변수를 쓰지 않고 프로그램이 완벽하게 실행되는 것처럼 동작했습니다. – Robert

0

추측을 제거하려면 어셈블리 코드를 확인한 다음 프로그램의 기계 명령어를 살펴보십시오. 디버거에서 실행하고 메모리에서 어떤 일이 발생하는지 확인하십시오. 스택의 어떤 주소에 로컬 변수가 놓여 있는지 그리고 레지스터와 특히 명령어 포인터가 함수 호출에 저장된 주소를 볼 수 있습니다.

예를 들어 the stack overflow 같은 위키 백과에서 보았습니까?

+0

나는 그것을 보았다. 그래서 나는 모든 A를 시도했다. 그것은 버퍼보다 ​​큰 모든 입력이 다음 일을 덮어 써야하는 것처럼 보입니다. 그러나 나는 그렇지 않을 것입니다. objdump -d를 실행하고 프로그램을 실행하는 gdb를 따라 가면서 메모리 레이아웃을 알았습니다. 그러면 카운터가 스택 된 다음 카운터 두 개가 저장된 다음 저장된 ebp 다음에 반환 주소가됩니다. – Robert

관련 문제