-bindshell, trinoo daemon
execve() - execve (const char *filename, char *const argv [], char *const envp[]);
filename이 가리키는 파일을 실행한다.
uname() - 시스템 정보 를 얻어온다(커널에 대한 이름과 버젼정보등을 얻어온다)
brk() - 데이터 세그먼트 사이즈 변경
old_mmap() - mmap(void * addr, size_t len, int prot, int flags, int fd, off_t offset);
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40016000
메모리 블럭을 할당하고 0x40016000으로 반환
open() - 파일을 열거나 생성 할때 사용한다 에러가 발생시 -1을 반환한다
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
ENOENT : 경로명의 디렉토리가 없거나, 심볼릭 링크가 깨져있을때.
stat() - 파일의 상태를 알아올수 있다 성공할경우 0을 실패했을경우에는 -1을 반환
close() - close 는 열린 파일 지정번호를 닫는다.
read() - open으로 열린 파일에서 원하는 데이터를 읽어 들인다.
mmap() - fd로 지정된 파일(혹은 다른 객체)에서 offset을 시작으로 length바이트 만큼을 start주소로 대응시키도록 한다
socket()- socket(int domain, int type, int protocol); - 통신의 종점를 생성하고 성공시 통신종점으로 사용될 파일지시자를 반환
bind() - bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);sockfd 는 socket함수를 통해서 만들어진 소켓지정번호이다.
bind 는 이 sockfd 에 my_addr 로 대변되는 특성을 부여한다.
my_addr 에는 sockfd 가 통신을 하기 위해서 필요한 정보인 "port", "인터넷주소", "소켓 흐름종류" 등을 포함하고 있다.
exit_group() - exit_group() 이 시스템 호출은 전체 프로세스와 쓰레드를 종료한다.
sendto() - 지정된 주소로 데이터를 전송하는 함수이다.
clone() - 새로운 프로세스를 생성한다. fork 와 달리 자식프로세스가 메모리, 테이블, 시그널핸들러 테이블과 같이 부모 프로세스와
실행 문맥 부분들을 공유한다.
setpgid() - setpgid(pid_t pid, pid_t pgid); pid로 설정된 프로세스의 프로세스 그룹 ID를 pgid로 설정한다.
//바인트쉘을 실행한다
execve("./bindshell", ["./bindshell"], [/* 22 vars */]) = 0
// 시스템 정보를 얻어온다
uname({sys="Linux", node="securitya", ...}) = 0
// 데이터 세그먼트 값을 설정
brk(0) = 0x8049a60
//메모리 블럭을 할당하고 0x40016000으로 반화
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40016000
// 파일을 읽기 전용으로 연다 링크가 깨졌거나 파일이 없을시 -1 을 반환
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
//파일의 상태를 알아온다 위의 open 3에서 열어본 파일의 상태를 알아보고 성공했기에 0을 반환
fstat64(3, {st_mode=S_IFREG|0644, st_size=21918, ...}) = 0
// 3으로 열린 파일의 주소를 반환
old_mmap(NULL, 21918, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40017000
// 3으로 열린 파일을 닫는다
close(3) = 0
open("/lib/tls/libc.so.6", O_RDONLY) = 3
// 512 버퍼로 새로연 3번 파일의 부분을 읽는다
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`V\1B4\0"..., 512) = 512
// 3번 파일의 상태를 보고 0을 반환
fstat64(3, {st_mode=S_IFREG|0755, st_size=1531064, ...}) = 0
- 정의
소프트웨어 인터럽트를 통해 만들어진 커널에 대한 명시적인 요청
즉, 프로그래밍 언어에서 지원하지 않는 기능에 대하여 운영체계의 루틴을 호출하여 이용하는 것을 말한다.
대개 모든 운영체계는 여러 가지 저급한 연산을 수행하기 위한 루틴들의 모음을 가지고 있다.
예를 들어 모든 운영체계는 디렉토리를 만드는 루틴이라든가, 특정한 디렉토리에 있는 파일들의 목록을 읽어내는 루틴 등을 가지고 있다.
만약 응용프로그램에서 운영체계에 있는 루틴을 실행시켜 어떠한 결과를 얻기 원한다면, 시스템 호출을 통해 이용해야한다.
사용자프로세스 -> 아규먼트 스택 -> 시스템 콜 번호 저장 -> 트랩발생 -> IDT에의해 트랩 시작 -> 핸들러 실행 -> 시스템콜 테이블 사용 -> 시스템 콜 핸들러