2014-02-19 9 views
2

나는 버퍼 오버 플로우에 대한 내 운을 시험하고 있습니다. 그러나 한 지점에서 멈추었습니다. 나는 반송 주소를 덮어 쓴다. 따라서 EIP은 나의 셸 코드의 슬레 드 nop의 주소를 가리킬 것이다. 그러나 ret을 실행하면 Cannot access memory at address 0x90909094 오류가 발생합니다. 아무도 잘못된 것을 볼 수 있습니까?x86-32의 반송 주소에 액세스 할 수 없습니다.

메모리에서 덤프 :

(gdb) x/8wx $esp 
0xbffff18c: 0xbffff470 0xbffff400 0x00000000 0x08048559 
0xbffff19c: 0xb7fc6ff4 0x08048550 0x00000000 0x00000000 
(gdb) x/8wx 0xbffff470 
0xbffff470: 0x90909090 0x90909090 0x90909090 0x90909090 
0xbffff480: 0x90909090 0x90909090 0x90909090 0x90909090 
(gdb) nexti 
Cannot access memory at address 0x90909094 
(gdb) i r eip 
eip   0xbffff470 0xbffff470 

당신이 볼 수 있듯이, 반송 주소가 0xbffff470 해당 위치에가, 내 nop 썰매가 배치됩니다. 그러나 다음 명령 (즉, ret)을 실행하자마자 오류가 발생합니다. 여기서 뭐가 잘못 됐니? 편집 : x86-32

편집을 사용하고 있습니다 : 나는 다른 게시물에 대한 답을 찾을 : 0x90909090을 할 때 내 경우에는 GDB ret "cannot access memory at address" 은 기본적으로 문제가 주소가 ESP에 설정되어 직전 인은 EBP 같습니다 .. 따라서 신속한 해결은 'A'를 패딩으로 사용하는 것이 아니라 모든 단어의 주소를 사용하는 것입니다.

+0

이 x86-32입니까? 나는 아직도 그것을 사용하는 사람을 몰랐다! :) 질문에 [x86-32] 또는 [x86-64]로 태그하여 사람들이 현재 사용하고있는 것을 알 수 있도록하십시오. x86-64를 사용한다면, 한 가지 버그가 분명합니다 : 단지'% eip'와'% esp'뿐만 아니라'% rip'과'% rsp'를 봐야합니다. 그것이 전부입니까? – Quuxplusone

+2

실수로 실수하지 않았다고 가정하면 CPU의 데이터 실행 방지가 활성화되어 있고 코드가 아닌 부분에서 명령이 실행되지 않을 수 있습니까? – rcgldr

+0

@rcgldr 생각하지 않습니까? -z execstack 및 -fno-stack-protector로 컴파일하면 모든 것이 좋을까요? – user1090614

답변

0

영업 이익은 자신의 질문 (다소) 응답 : 즉

Edit: I found the answer in another post: GDB ret "cannot access memory at address" Basically, the problem is right before the address esp is set to equals ebp, when in my case will be 0x90909090.. Thus, a quick solve is to not use 'A's as padding, but rather just the address in every word.

을, 문제는 그가 현재 함수의 스택 프레임의 일부을 덮어했던 것을, 그러나 실제를 덮어하지 않았다 반환 주소가 저장된 스택을 가리 킵니다.

// let's say his function ended with a "return 0"... xorl %eax, %eax // now here is where he did the "x/8wx" debugger command... // but then the function epilogue goes and does the usual thing: movl %esp, %ebp popl %ebp // and so here, at the actual return, %esp no longer points // to the same bytes he saw with "x/8wx" ret 

The linked answer

그의 디버거 디버거가 그가에서 정지 한 영업 이익을 이야기가되도록, (위에서 설명한 movl/popl에 해당)을 leave 명령과 결함의 일종이있을 수 있음을 시사한다 ret 명령어이지만 실제로 프로세서는 아직 leave을 실행하지 않았습니다.

같은 말로, 디버거는 함수 프롤로그 또는 에필로그의 중간에서 브레이크 포인트를 사용하지 않을 수 있습니다. 즉, 에필로그의 중간에 중단 점을 설정하려고하면 에필로그 시작 부분에 몰래 조정됩니다.