나는 gdb의 대상 실행 파일 외부에 있으며 해당 대상에 해당하는 스택도 없습니다. 어쨌든 나는 x86 어셈블리의 전문가가 아니기 때문에 어셈블리 코드에서 무슨 일이 일어나고 있는지 확인할 수 있도록 한 단계 씩 진행하고 싶습니다. 불행히도 gdb는이 간단한 어셈블리 수준 디버깅을 거부합니다. 적절한 중단 점을 설정하고 중지 할 수 있지만 한 단계 진행하자마자 gdb는 "현재 함수의 경계를 찾을 수 없습니다"라는 오류를보고하고 EIP는 변경되지 않습니다.
추가 세부 사항:
기계 코드는 gcc asm 문에 의해 생성되었으며 objdump -d의 출력에서 실행중인 커널 메모리 위치에 복사했습니다. 로더를 사용하여 객체 코드를 재배치 된 주소로로드하는 간단한 방법은 신경 쓰지 않지만로드는 커널 모듈에서 수행해야합니다.
또 다른 대안은 gdb에 제공 할 가짜 커널 모듈 또는 디버그 정보 파일을 생성하여이 영역이 프로그램 코드 내에 있다고 믿도록하는 것입니다. gdb는 커널 실행 파일 자체에서 잘 작동합니다.
(정말 알고 싶은 사람들을 위해 런타임에 VMware VM 내부의 Linux 커널 데이터 공간에 코드를 삽입하고 VMware Workstation의 내장 gdb 스텁을 통해 커널을 원격 디버깅하는 gdb에서 디버깅합니다. 참고 커널을 작성하는 것이 아닙니다. 익스플로잇; 저는 프로토 타입을 작성하는 보안 대학원생입니다.)
(내 어셈블리 내부의 각 명령어에 중단 점을 설정할 수 있습니다. 이것은 작동하지만 x86 어셈블리 명령어의 크기가 다양하고 재부팅 할 때마다 어셈블리 위치가 변경되기 때문에 시간이 지나면 상당히 힘들 것입니다.)