2014-07-04 2 views
1

셸 코더의 핸드북을 읽고 스택 예제에서 간단한 오버플로 버퍼를 따라 가려고하지만 막혔습니다.스택 오버플로 버퍼

Windows에서 GCC를 실행 중이고 함수 호출 전에 책에서 말한 것처럼 스택을 밀어 넣기 전에 값을 레지스터로 옮긴 다음 호출합니다. 이 책은 리눅스를 사용하고 있다고 가정합니다. 윈도우보다 다른 호출 방법을 사용합니까? 어떻게하면 리눅스 동작을 얻을 수 있습니까?

또한 프로그램에서 사용자 입력을 허용하면 프로그램에 데이터를 입력하여 gdb에 표시하는 방법은 무엇입니까?

+0

최적화를 해제하십시오. –

+0

나는 시도했다 : gcc -ggdb function.c -O0 - 도움이되지 않은 함수. 내가 어떻게 그럴 수 있니? – user3806518

답변

1

귀하의 책은 IA32 플랫폼에서 cdecl 호출 규칙을 사용하고 있지만 귀하의 컴파일러가 매개 변수를 레지스터에 넣는 다른 호출 규칙을 사용하고있는 것으로 보입니다. AMD64 플랫폼을 사용하고 계십니까? AMD64의 표준은 레지스터에 첫 번째 n 인수를 넣고 스택에 추가 인수 만 넣는 것입니다 (Windows는 매개 변수에 대해 4 개의 레지스터 만 사용하고 다른 모든 일반 플랫폼은 6 개를 사용합니다). 호출 규칙에

더 많은 정보 : https://en.wikipedia.org/wiki/X86_calling_conventions

당신이 관심있는 것들 전에 추가 함수 매개 변수의 무리를 추가 할 경우, 당신은 스택에 마지막으로 사람을 얻어야한다. 또는 64 비트 대신 32 비트로 컴파일하면 원하는 것을 얻을 수 있습니다.

+0

호출 규칙은 마이크로 컴퓨터의 속성입니까? 운영 체제? 그리고 프로그램이 사용자 입력을 받아들이면 어떻게 프로그램에 데이터를 입력하여 gdb에 표시 할 수 있습니까? 너무 많은 질문에 사과드립니다. 그런데 도움을 주셔서 감사합니다. – user3806518

+0

전화 회의 규칙은 많은 영향을받습니다. IA32에는 많은 호출 규칙이 사용되었습니다. AMD64는 레지스터 기반의 인수 전달을 권장하고 있지만 사용중인 두 가지 공통적 인 변형이 있습니다. 컴파일러는 궁극적으로 호출 규칙을 선택하는 것이지만 다른 모듈 (예 : 라이브러리 또는 시스템 호출)을 호출하는 경우 다른 모듈과 호환되는 호출 규칙을 사용해야합니다. – user3553031

+0

32 비트로 컴파일하면 작동하는 것 같습니다. 그것은 : mov DWORD PTR [esp + 0x4], 0x2. 사용자 입력 질문에 대한 귀하의 불확실 함을 짐작하고 있습니까? 고마워. – user3806518