어떻게 시스템 호출을 분해하여 어셈블리 명령어를 얻을 수 있습니까?시스템 호출을 분해하는 방법은 무엇입니까?
답변
음, 다음과 같이 할 수 있습니다.
쓰기이 :
#include <stdio.h>
#include <sys/file.h>
int main() {
return dup(0)
}
그것을 컴파일
gcc -o systest -g3 -O0 systest.c
가 덤프 :
objdump -d systest
는 "에 보면 내가"DUP "의 조립 덤프를 얻고 싶었다 말 메인 "참조 :
400478: 55 push %rbp
400479: 48 89 e5 mov %rsp,%rbp
40047c: bf 00 00 00 00 mov $0x0,%edi
400481: b8 00 00 00 00 mov $0x0,%eax
400486: e8 1d ff ff ff callq 4003a8 <[email protected]>
40048b: c9 leaveq
40048c: c3 retq
40048d: 90 nop
40048e: 90 nop
40048f: 90 nop
그래서 "DUP @의 PLT"보고
나는 참조 :
00000000004003a8 <[email protected]>:
4003a8: ff 25 7a 04 20 00 jmpq *2098298(%rip) # 600828 <_GLOBAL_OFFSET_TABLE_+0x20>
4003ae: 68 01 00 00 00 pushq $0x1
4003b3: e9 d0 ff ff ff jmpq 400388 <_init+0x18>
그래서 그것은 내가 모든 콜 벡터를 가지고 가정 것 "전역 옵셋 테이블"로 전화를 만들고있다. 다른 포스트와 마찬가지로 커널 소스 (또는 표준 라이브러리 소스?)에서 자세한 내용을 확인하십시오.
저는 이것을 원하지 않습니다. 시스템 호출 처리는 복잡합니다 (http://www.ibm.com/developerworks/linux/library/l-system-calls/ 참조). 이 질문에 "linux"라는 태그를 붙 였으므로, 소스 코드를 kernel.org에서 다운로드 할 수 있습니다 (어셈블리 코드보다 훨씬 이해하기 쉽고 유익합니다).
물론 시스템 호출 구현은 코드에서 이해할 수 있습니다. – shingaridavesh
리눅스 시스템 호출을 이해하려면 코드를 검색하십시오.
중요 파일은 다음과 같습니다
/include/linux/syscalls.h (지원되는 모든 시스템이 리눅스에서 호출)
/arch/arm/kernel/entry-common.S (시스템 레지스터 (C)의 레벨에서 시스템 호출)
/arch/arm/kernel/calls.S (시스템 호출 번호)
/arch/arm/include/asm/unistd.h 구현 (어드레스 모든)
참고 : 시스템 호출 테이블은 단지 system.map에서 해결 될 수 있습니다.
PLT 및 GOT는 동적 링커 구조입니다. PLT 또는 프로 시저 연결 테이블에는 동적 함수에 대한 간접 점프 (GOT를 통한)와 dl_runtime_resolve() 로의 대체 점프가 포함됩니다. GOT (Global Offset Table)에는 이미 해결 된 기능의 주소 또는 간접 점프 후 PLT의 명령이 포함되어 있으므로 대체 점프로 리디렉션 할 수 있습니다. – ninjalj