shc 셸 스 크 립 트 암호 화

이전에 svn 인증 문 제 를 방지 하기 위해 svn 의 사용자 이름, 비밀 번 호 를 스 크 립 트 에 직접 썼 습 니 다.명문 암호 가 매우 안전 하지 않 기 때문에 반드시 밀 문 으로 저장 해 야 한다.기 존 스 크 립 트 프로 세 스에 영향 을 주지 않 기 위해 svn 명령 을 독립 스 크 립 트 로 추출 하여 이 스 크 립 트 에 사용자 이름과 비밀 번 호 를 쓰 고 암호 화하 여 저장 합 니 다.
암호 화 는 shc 라 는 도 구 를 사용 하여 진행 되 었 다.이 도 구 는 arc 4 방식 으로 데 이 터 를 암호 화하 고 간단 합 니 다. 실행 한 후에 입력 한 스 크 립 트 (svn. sh) 에 따라 두 개의 파일 을 생 성 합 니 다. svn. sh. x 는 암호 화 된 실행 가능 한 프로그램 이 고 svn. sh. x. c 는 실행 가능 한 프로그램의 C 소스 입 니 다.최종 실행 은 앞의. x 끝 에 있 는 실행 가능 한 프로그램 만 있 으 면 됩 니 다.
간단하게 말 하면 제 사용 은 처음에 어떤 인자 도 추가 하지 않 았 고 최종 적 으로 생 성 된. x 파일 은 동적 링크 입 니 다. 의존 하 는 것 은 없 지만 동적 링크 glibc 가 필요 합 니 다.로 컬 glibc 버 전이 서버 에 있 는 것 보다 훨씬 크기 때문에 이 파일 을 실행 할 수 없습니다. GLIBC 2.6 을 찾 을 수 없습니다.도움말 문 서 를 본 후 CFLAGS 환경 변 수 를 설정 하고 컴 파일 파 라 메 터 를 수정 하 며 다른 파 라 메 터 를 추가 할 수 있 습 니 다. 최종 명령 은:
CFLAGS="-static" shc -v -T -r -f svn.sh

그 중에서 환경 변 수 를 통 해 컴 파일 출력 된. x 파일 을 정적 링크 로 만 들 면 호스트 의 모든 동적 링크 라 이브 러 리 에 의존 할 필요 가 없습니다. -v 매개 변수 출력 명령 의 상세 한 출력; -T 매개 변 수 는 traceable 을 증가 시 켜 출력 가능 한 프로그램 을 추적 할 수 있 도록 합 니 다. -r 매개 변 수 는 배포 가능 한 바 이 너 리 프로그램 을 생 성 합 니 다.
이렇게 하면 원래 스 크 립 트 에서 svn 을 실행 합 니 다. svn. sh. x 로 직접 바 꾸 고 원래 의 사용자 이름, 비밀 번 호 를 없 애 면 비밀 번 호 는 암호 화 되 어 저 장 됩 니 다.
의 원리
shc 는 arc 4 암호 화 를 사용 합 니 다. 명령 에서 대체적으로 – 입력 매개 변수 처리 – 스 크 립 트 읽 기 – 해석 에 사용 되 는 셸 – C 소스 파일 생 성 – C 소스 파일 컴 파일 이 몇 단계 완료 되 었 습 니 다.원본 파일 을 생 성 할 때 내용 을 arc 4 암호 화하 고 C 원본 코드 에서 arc 4 를 다시 복호화 하여 최종 스 크 립 트 를 execvp 로 호출 합 니 다.
몇 개의 매개 변수의 대략적인 실현:
-T
이 변 수 를 설정 하지 않 으 면 실행 가능 한 파일 을 trace 로 만 들 수 없습니다.
void untraceable(char * argv0)
{
    char proc[80];
    int pid, mine;

    switch(pid = fork()) {
        case  0:
            pid = getppid();
            /* For problematic SunOS ptrace */
            #if defined(__FreeBSD__)
            sprintf(proc, "/proc/%d/mem", (int)pid);
            #else
            sprintf(proc, "/proc/%d/as",  (int)pid);
            #endif
            close(0);
            mine = !open(proc, O_RDWR|O_EXCL);
            if (!mine && errno != EBUSY)
                mine = !ptrace(PTRACE_ATTACH, pid, 0, 0);
                if (mine) {
                    kill(pid, SIGCONT);
                } else {
                    perror(argv0);
                    kill(pid, SIGKILL);
                }
                _exit(mine);
        case -1:
            break;
        default:
            if (pid == waitpid(pid, 0, 0))
                return;
    }
    perror(argv0);
    _exit(1);
}

우선 fock 프로 세 스 는 ptrace 호출 을 통 해 새 fock 에서 나 온 프로 세 스에 마 운 트 하려 고 합 니 다. 성공 하면 다른 프로 세 스 trace 에 의 해 실행 되 지 않 았 음 을 설명 합 니 다. 그렇지 않 으 면 SIGKILL 신 호 를 직접 보 내 프로 세 스 를 종료 하고 계속 실행 합 니 다.그러나 실제 사용 과정 에서 왜 그런 지 모 르 겠 습 니 다. 가끔 서버 에 T 상태의 프로 세 스 를 더 보 냅 니 다. 이 는 ptrace 호출 이 프로 세 스에 SIGSTOP 을 보 낸 후 SIGCONT 를 다시 보 내 는 데 성공 하지 못 했 기 때 문 입 니 다.그래서 뒤에 - T 인 자 를 더 해서 이 설정 을 건 너 뛰 면 추적 할 수 없습니다.지금 이렇게 하면 안전성 을 크게 떨 어 뜨 릴 것 이다.
-e
이 매개 변 수 는 실행 가능 한 프로그램의 실효 시간 을 지정 할 수 있 으 며, 이 시간 을 초과 하여 암호 화 된 실행 가능 한 프로그램 은 실행 할 수 없습니다.실현 도 간단 하 다. 암호 화 된 만 료 시간 을 생 성 된 C 코드 앞 에 두 고 셸 을 실행 하기 전에
if (date[0] && (atoll(date)

이러한 판단 은 프로그램의 운행 을 직접적 으로 막는다.
다음으로 전송:https://coolex.info/blog/479.html

좋은 웹페이지 즐겨찾기