나는 버퍼 오버 플로우에 대한 내 운을 시험하고 있습니다. 그러나 한 지점에서 멈추었습니다. 나는 반송 주소를 덮어 쓴다. 따라서 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'를 패딩으로 사용하는 것이 아니라 모든 단어의 주소를 사용하는 것입니다.
이 x86-32입니까? 나는 아직도 그것을 사용하는 사람을 몰랐다! :) 질문에 [x86-32] 또는 [x86-64]로 태그하여 사람들이 현재 사용하고있는 것을 알 수 있도록하십시오. x86-64를 사용한다면, 한 가지 버그가 분명합니다 : 단지'% eip'와'% esp'뿐만 아니라'% rip'과'% rsp'를 봐야합니다. 그것이 전부입니까? – Quuxplusone
실수로 실수하지 않았다고 가정하면 CPU의 데이터 실행 방지가 활성화되어 있고 코드가 아닌 부분에서 명령이 실행되지 않을 수 있습니까? – rcgldr
@rcgldr 생각하지 않습니까? -z execstack 및 -fno-stack-protector로 컴파일하면 모든 것이 좋을까요? – user1090614