주어진 취약한 코드에 대해 버퍼 오버플로 공격을 시도하고 있습니다. 하지만 내 악의적 인 문자열이 스택을 손상시키지는 않지만 악용 문자열에 포함 된 어셈블리 코드를 전혀 사용할 수 없기 때문에 잘못되었다고 생각됩니다.함수에 선택된 프레임의 프로그램 카운터가 포함되어 있지 않습니다.
여기 공격하려는 프로그램의 'ret'명령을 실행하기 전의 메모리 값입니다. 이 스택을 팝업과 팝 값 %의 EIP 지점을 만들 수 없기 때문에이 시점에서
0x55683984: 0x5568398c 0x...(old r.a) 0x68e322a1 0x0000c31c
0x55683994: 0xf7fa9400 0x0804a3d7 0x556839c0 0xf7e518d0
는 상황이 잘못? 그래서 내 익스플로잇 어셈블리 코드가 작동하지 않습니다. (0x68e322a1 0x0000c31c) Gdb는 No function에 선택된 프레임에 대한 프로그램 카운터가 들어 있다고 말합니다. 디버깅하지 않고 실행하려고하면 세그먼트 화 오류가 발생합니다.
이 문제는 내 어셈블리의 길이와 관련이 있습니까? (이 경우 6입니다)?
Program received signal SIGSEGV, Segmentation fault.
0x5568398c in ??()
(gdb) x 0x5568398c
0x5568398c: 0x68e322a1
세그 폴트를 일으키는 주소 안에 무엇이 있는지 볼 때 어떻게됩니까?
당신은'disassemble'을 사용할 수 있습니다 호출 스택. 실행하려고하는 코드를 보여 주면 도움이 될 것입니다 (68 e3 인 경우에는 0 바이트가 포함되어있는 것처럼 보입니다). BTW, 이것이 숙제를위한 것이라면 그렇게 표시해야합니다. – user786653
레이아웃을 사용하여 어떤 일이 일어나고 있는지 알 수 없었습니다. 게다가, 익스플로잇 코드가 c3 (ret 명령을 의미 함)으로 끝났으므로 길잃은 0 바이트는 문제가되지 않습니다. 중요한 점은 실수로 아마 정의되지 않은 메모리 주소에 도달하려고하는 것입니다. – bfaskiplar