바이너리 파일이 있는데 암호를 해독해야합니다 (숙제). 주어진 함수 (이진 파일의 일부인 함수)도있었습니다. 이 함수는 입력 문자열이 문자별로 올바른 비밀번호 문자와 비교되어 문자가 잘못되었을 때 즉시 false를 반환 함을 보여주었습니다 (안전하지 않은 방법입니다. 누수가 시간이 걸리기 때문에 올바른 비밀번호 길이에 대한 아이디어를 얻습니다) 예). 그러나 우리 선생님은 우리에게 조금 더 어려워지기 위해 결과 (수정 / 잘못된)를 반환하는 임의 타이머를 추가했습니다 …
어쨌든, 나는 이미 리버스 엔지니어링으로 성공적으로 수행했으며 올바른 암호를 얻었습니다. 이제 명령 줄에서 놀고 있습니다.
/usr/bin/time -v ./program_name enter_password
이 명령을 사용하면 시스템 시간, 스왑, 실행 시간과 같은 많은 정보를 얻을 수 있습니다. 그러나 가장 흥미로운 것은 “자발적 컨텍스트 전환”인데, 입력 한 암호의 정확한 문자가 많을수록 “자발적 컨텍스트 전환” ” 나는 얻다!
더 잘못된 문자를 입력할수록 “자발적 컨텍스트 전환”이 더 많이 나타납니다.
명령을 입력하고 문자를 입력하고 “자발적 컨텍스트 전환”을 관찰하는 것만으로도 암호를 해독하는 데 거의 2 시간이 걸렸습니다. 하나의 문자가 정확할 때마다 “자발적 컨텍스트 전환”이 1 씩 감소했습니다.
제 질문은, “자발적 컨텍스트 스위치”란 정확히 무엇이며 왜 암호 해독에 도움이 되었습니까?
답변
에 대한 매뉴얼 페이지time
자발적 및 비자발적 컨텍스트 스위치의 개념을 설명합니다 :
The resource specifiers [...] are:
c Number of times the process was context-switched involuntarily
(because the time slice expired).
w Number of times that the program was context-switched voluntarily,
for instance while waiting for an I/O operation to complete.
(인용은 데비안 시스템에서 인용 한 것으로, 링크 된 매뉴얼 페이지에는 약간 다른 텍스트가 있습니다)
즉, 프로세스가 수행해야 할 작업이 없기 때문에 프로세스가 CPU를 떠나는 경우 컨텍스트 전환은 자발적입니다 (외부 무언가가 발생하기를 기다리는 동안). 비자발적이며 일부 계산을 계속하고 싶지만 OS는 다른 프로세스로 전환 할시기를 결정합니다.
비밀번호 검사 프로그램과 관련이있는 방법은 프로그램이 실제로 수행하는 작업에 따라 다릅니다.
주석에 링크 된 소스 코드에서 프로그램 usleep()
이 일치하지 않는 각 문자를 한 번 호출 하여 이후에 다음 문자에서 비교 루프를 계속한다는 것을 알 수 있습니다. 수면은 CPU를 얻는 것만 큼 자발적이므로 이러한 호출은 각 비 매칭 문자에 대한 자발적 컨텍스트 전환으로 표시됩니다.
Linux에서는으로 호출을 볼 수 있어야합니다 strace
.
최종 지연은 무작위 수면 T * (rand() % 3)
, 즉 0, 1 또는 2 배 상수 에서 비롯됩니다 . 이는 다소 거친 단위이므로 동일한 암호를 사용하여 여러 번 시도하면 쉽게 평균을 내야합니다.