크랙미 오픈
재미있는 해킹을 할 준비를 하세요! 이 블로그 게시물에서는 Ubuntu 20.04 LTS를 사용하여 암호로 보호되는 간단한 C 실행 파일에 침입하는 방법을 보여줍니다. 이제 막 시작했든 노련한 전문가든 이 튜토리얼은 모두를 위한 것입니다. 사이버 기술을 발휘할 시간입니다!
이 자습서에 사용된 모든 파일은 여기 GitHub에서 찾을 수 있습니다 . 리포지토리를 로컬 환경에 복제하여 암호화된 파일에 액세스할 수 있습니다.
시작하려면 crackme파일을 실행하여 crackme 디렉토리로 이동하고 다음 명령을 입력하여 동작을 관찰할 수 있습니다.
$ ./crackme
Access Denied
이 file명령은 파일 유형을 식별하는 데 사용됩니다. 특정 순서로 일련의 테스트를 수행하여 이를 수행합니다: 파일 시스템 테스트 , 매직 넘버 테스트 및 언어 테스트 .
이러한 테스트는 콘텐츠 및 관련 메타데이터를 기반으로 파일 형식을 결정하도록 설계되었습니다. 명령을 사용 하여 특정 파일의 유형을 식별하려면 터미널에서 file실행하면 됩니다 . file [filename]예를 들어:
$ file crackme
crackme: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=e06e0b0229279a69506925702a7f79e36bdc3eb2, not stripped
- 64비트 Linux 운영 체제에서 실행되도록 설계된 실행 파일
- x86–64 아키텍처용으로 컴파일되고 동적으로 연결됩니다. 즉, 공유 라이브러리에 의존하여 작동합니다.
- /lib64/ld-linux-x86–64.so.2 인터프리터에 의해 해석됨
- GNU/Linux 2.6.24용으로 제작되었으며 "BuildID"라는 고유 식별자가 있습니다.
- 제거되지 않았으므로 여전히 분석에 사용할 수 있는 디버깅 정보와 기호가 포함되어 있습니다.
프로그램의 동작을 추가로 분석하고 잠재적으로 리버스 엔지니어링하기 위해 ( GNU 디버거ltrace ) 와 같은 다른 도구와 함께 사용할 수 있다는 점도 주목할 가치가 있습니다. 이 튜토리얼에서는 사용하지 않을 것입니다.gdb
ltrace다음 명령을 입력하여 crack me 파일에서 실행할 수 있습니다 .
$ ltrace ./crackme
__libc_start_main(0x40087d, 1, 0x7ffeef764458, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9) = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9) = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9) = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9) = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9) = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9) = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9) = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9) = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9) = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9) = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9) = -4
strncmp("USER=vagrant", "Passw0rd=", 9) = 5
strncmp("SHLVL=1", "Passw0rd=", 9) = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9) = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9) = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9) = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9) = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9) = -32
strncmp("DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "Passw0rd=", 9) = -12
strncmp("SSH_TTY=/dev/pts/0", "Passw0rd=", 9) = 3
strncmp("OLDPWD=/home/vagrant/crackme_tut"..., "Passw0rd=", 9) = -1
strncmp("_=/usr/bin/ltrace", "Passw0rd=", 9) = 15
puts("Access Denied"Access Denied
) = 14
+++ exited (status 1) +++
PC: ALX
__libc_start_main프로그램의 환경을 설정하고 메인 함수를 호출하는 함수입니다. 다양한 인수를 취하며 C 표준 라이브러리( libc )에서 제공합니다. 프로그램의 기본 진입점 함수에 의해 호출됩니다.- 로 시작하는 줄
strncmp은 프로그램이strncmp두 문자열의 주어진 문자 수(이 경우 9자)를 비교하는 함수인 함수를 호출하고 있음을 보여줍니다. 비교되는 문자열은 다양한 환경 변수(예: "SHELL", "PWD", "LOGNAME" 등) 및 문자열"Passw0rd=". 프로그램이 문자열로 시작하는 환경 변수가 있는지 확인하는 것 같습니다"Passw0rd=". - 이
puts함수는 " Access Denied "라는 문자열과 함께 마지막에 호출되며, 이는 환경 변수 중"Passw0rd=".
Linux에서 환경 변수를 설정하려면 export터미널에서 명령을 사용할 수 있습니다. 예를 들어 이름이 지정된 환경 변수 Passw0rd를 값으로 설정하려면 test다음을 실행할 수 있습니다.
export Passw0rd=test
$ ltrace ./crackme
__libc_start_main(0x40087d, 1, 0x7fff085f1d38, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9) = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9) = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9) = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9) = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9) = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9) = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9) = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9) = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9) = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9) = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9) = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9) = -4
strncmp("USER=vagrant", "Passw0rd=", 9) = 5
strncmp("SHLVL=1", "Passw0rd=", 9) = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9) = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9) = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9) = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9) = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9) = -32
strncmp("Passw0rd=test", "Passw0rd=", 9) = 0
MD5_Init(0x7fff085f1b90, 0x400b06, 9, 6) = 1
strlen("test") = 4
MD5_Update(0x7fff085f1b90, 0x7fff085f2f68, 4, 0x7fff085f2f68) = 1
MD5_Final(0x7fff085f1bf0, 0x7fff085f1b90, 0x7fff085f1b90, 0) = 1
sprintf("09", "%02x", 0x9) = 2
sprintf("8f", "%02x", 0x8f) = 2
sprintf("6b", "%02x", 0x6b) = 2
sprintf("cd", "%02x", 0xcd) = 2
sprintf("46", "%02x", 0x46) = 2
sprintf("21", "%02x", 0x21) = 2
sprintf("d3", "%02x", 0xd3) = 2
sprintf("73", "%02x", 0x73) = 2
sprintf("ca", "%02x", 0xca) = 2
sprintf("de", "%02x", 0xde) = 2
sprintf("4e", "%02x", 0x4e) = 2
sprintf("83", "%02x", 0x83) = 2
sprintf("26", "%02x", 0x26) = 2
sprintf("27", "%02x", 0x27) = 2
sprintf("b4", "%02x", 0xb4) = 2
sprintf("f6", "%02x", 0xf6) = 2
strcmp("c4032d9e95a93d91b9b595dcfcca640b"..., "098f6bcd4621d373cade4e832627b4f6"...) = 51
puts("Access Denied"Access Denied
) = 14
+++ exited (status 1) +++
PC: Here
- 우리는 이미 첫 번째 줄에서
__libc_start_main함수가 4개의 인수(주 함수의 주소, 프로그램 인수의 수, 프로그램 인수 배열에 대한 포인터, 주 함수가 호출될 때 호출될 함수에 대한 포인터)로 호출 되었음을 보여줍니다. 보고. - 다음 줄
strncmp은 두 문자열을 비교하고 사전식 순서를 나타내는 정수를 반환하는 함수에 대한 일련의 호출을 보여줍니다. 프로그램이 시스템의 각 환경 변수를 문자열과 비교하려고 하는 것 같습니다"Passw0rd=". - 그런 다음 MD5 암호화 해시 함수 의 일부인 , 및 함수에
MD5_Init대한MD5_Update호출 이 있습니다. 프로그램이 Passw0rd 환경 변수 값의 MD5 해시를 계산하는 것처럼 보입니다.MD5_Final - 다음
sprintf으로 문자열을 형식화하고 버퍼에 저장하는 함수에 대한 호출이 있습니다. 프로그램이 MD5 해시의 바이트를 16진수 값으로 형식화하고 문자열에 저장하는 것으로 보입니다. - 출력에는
strcmp"c4032d9e95a93d91b9b595dcfcca640b" 및 "098f6bcd4621d373cade4e832627b4f6"의 두 문자열을 인수로 사용하는 함수 호출이 포함됩니다. 이는 프로그램이 암호의 MD5 해시를 내보낸 Passw0rd 환경 변수의 해시와 비교하고 있음을 나타냅니다. - 이
puts함수는 Passw0rd가 올바르지 않음을 나타내는 문자열 "액세스 거부"와 함께 마지막에 호출됩니다. 그러나 이 문제는 곧 해결될 것입니다.
이 웹사이트를 사용 하여 해시된 문자열을 해당 값으로 되돌릴 수 있습니다.
이제 해시된 암호가 LionelMessi 임을Passw0rd 확인했으므로 환경 변수를 이 값으로 설정 하고 ltrace명령을 다시 실행하여 다른 결과를 생성하는지 확인할 수 있습니다. 한번 해보자!
$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted
강력하고 고유한 암호를 사용하고 다른 계정에서 암호를 재사용하지 않는 것을 항상 기억하는 것이 중요합니다.
MD5 해시를 사전과 비교하고 이를 원래 문자열 형식으로 되돌리는 C 프로그램의 GitHub 의 향후 릴리스를 주시하십시오 . 계속 지켜봐!
간단한 파일 크래킹에 대한 이 튜토리얼을 즐겼기를 바랍니다. 의견이나 질문이 있으시면 주저하지 말고 아래 의견란에 남겨주십시오. 행복한 해킹!

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































