2011-07-06 2 views
17

radare2 디버거 용 Linux 시스템 호출 맵을 작성했습니다. 이것은 시스템 콜 번호를 시스템 콜 이름 이름과 인수의 수에 거대한 정적 배열 매핑을 제공하는 것을 의미합니다. syscall 번호는 sys/syscall.h에 정의되어 있으며 OpenBSD에서는 위의 주석에서 args 수를 쉽게 알 수 있습니다. 이것을 구문 분석하고 배열의 C 코드를 버리는 것은 스크립트 작성의 문제였습니다.Linux 시스템 호출 목록과 자동으로 취하는 args 수는 어떻게 얻을 수 있습니까?

그러나 Linux에서는 이러한 사치가 없습니다. 커널 헤더에서 syscall 번호를 얻는 것은 쉽지만 args 수는 어떻게해야합니까? 내가 가진 유일한 아이디어는 다음과 같습니다.

1) 수동으로 입력하십시오. 각각의 모든 아치에 대해 (그들은 리눅스에서 아치가 다릅니다). 모든 300+ 저주받은 물건. 안돼!

2) 매뉴얼 페이지를 구문 분석하십시오.

3) 프로그램이 빌드 될 때까지 0, 1, 2 ... args로 각 시스템 호출을 시도하는 스크립트를 작성하십시오. varargs에 대해서는 작동하지 않지만 syscalls는이를 지원합니까?

더 좋은 방법이있을 것입니다. 도와주세요!

+1

varargs의 예는 'open()'을 참조하십시오. –

+0

@OliverCharlesworth이게 무슨 뜻입니까? 'sys_open()'에는 정확히 3 개의 인수가 있습니다. – Ruslan

답변

16

strace (home page,)에는이 모든 것들이 포함 된 표가 있습니다 (linux/<platform>/syscallent.h 참조).

+0

이것은 웹 페이지입니다 : https://sourceforge.net/p/strace/code/ci/master/tree/linux/ 열어 본 후 '/syscallent.h'로 이동하십시오. – VasyaNovikov

4

알고있는 유일한 목록은 커널 소스 (include/linux/syscalls.h)입니다. 그러나 그것은 숫자가 아닌 이름으로 만 가능합니다. 숫자를 얻으려면 특정 플랫폼에 syscall.h 헤더를 사용해야한다고 생각합니다. 그 파일에는 몇 가지 #ifdef가 있습니다 ...

+0

각 시스템 호출에 대한 인수의 수는 –

+0

@ vext01이 필요합니다. 유형도 필요하다고 가정합니까? 어떤 논쟁은 32 비트와 다른 64 비트가 될 수 있기 때문에 나는 믿는다.어쨌든 내가 제공 한 헤더 소스에 대한 링크를 클릭하면 각 시스템 호출의 전체 서명이 있음을 알 수 있습니다. – Nemo

+0

지금은 형식이 필요하지 않으므로 systrace 구현을 구문 분석 할 수 있습니다. –

1

가변 개수의 인수가있는 시스템 호출이 있습니다. C 수준에서 open() 호출을 확인하십시오. 여기서 세 번째 매개 변수는 선택적입니다 (어셈블러에서 선택적 일 수 있음). 수평).

다른 시스템 헤더의 (전처리 된) 소스에서 syscalls.h의 이름으로 식별 된 시스템 호출을 찾는 것이 가장 좋습니다. 이것들에서 인자의 수를 세어 볼 수 있습니다. 올바른 헤더를 얻는 것이 까다로울 수 있으며 C 함수로 직접 노출되지 않는 시스템 호출이있을 수도 있습니다. (보지 못했지만 가능성은 거의 없습니다.)

GDB와 같은 다른 디버거가 어떻게 동일한 작업을 수행하는지 볼 수 있습니다.

+0

은 아마도 왜소한 정보를 사용합니다 .... –

+1

@ vext01 : 어쩌면 -하지만 DWARF가없는 플랫폼에는 없으므로 사용할 수있는 아이디어가있을 수 있습니다. 그리고 DWARF 정보는 어딘가에서 왔습니다. –

1

This 게시물을 읽을 가치가 숫자를 할 수있는 프로그램입니다. 호프가 도움이 되길 바랍니다.

관련 문제