Linux/bandit wargame

bandit wargame(level 22 ~ level 33) ... 24.09.24

cheonjaehacker 2024. 9. 24. 13:28

==> level 22

 

어떤 일정한 간격으로 자동적으로 실행되는 프로그램이 있는데,

이 프로그램은 cron???으로 시간별 할일을 스케줄로 만들어준다고 한다.

/etc/cron.d/ 의 설정을 확인하고 명령이 어떻게 실행되는지 보라고 한다. 

 

*cron?

 => 스케줄 프로그램 

 일정 시간/ 특정 시간마다 어떤 명령이나 프로그램이 실행되게함.

 

일단 이해 안되는 부분.

|| 파이프가 두개? ==> 얘는 파이프가 아닌 더블 버티칼바(||).

                                  더블 버티칼바(||)   *첫 번째 명령이 에러가 밸생해도 각각의 모든 명령을 수행함!

                                    요런 애들을 다중 명령어라 하고 추가로

                                  더블 엠퍼서드(&&)   *첫 번째 명령이 에러 없이 정상적으로 종료했을 때만 두번째 명령을 수행!

                                   세미콜론(;)    *하나의 명령어 라인에서 여러개의 명령어를 실행! (세미콜론으로 구분)

                                          => 첫 번째 명령이 실패해도 두 번째 명령은 반드시 실행됨.

 

일단 요놈을 찾았다.

근데 제목만 검색하고 싶을땐 어떻게 해야하지 -name하면 관련된거 그냥 다 찾는거 같은데...

 

뭐 읽긴했는데 진짜 뭔지 모르겠다...

 

 

cron에 대해 알아왔다.

@reboot ==> 부팅시 실행           /          ***** ==> cron 표현식에 따르면 *이 모든 값. 즉, 매분마다 실행!!!

bandit22 ==> 실행하는 사용자

/usr/bin/cronjob_bandit22.sh (감마?)> /dev/null ==> 실행할 명령.(쉘 스크립트) 

 

즉 풀어서 설명하면

부팅시부터 매분마다 bandit22의 계정으로 해당 쉘 스크립트를 실행한다.

 

실행되는 스크립트를 확인했더니.

어떤 파일의 권한을 변경하고 그 파일에 bandit22의 비밀번호를 넣는다?!

즉, 매분마다 해당파일에 bandit22의 비밀번호가 들어가고 있다는 것!

 

확인결과 비밀번호를 얻었다!         tRae0UfB9v0UzbCdn9cY0gQnds9GF58Q

 

[중요]

1. cron 표현식에 대해 일단 오늘은 시간이 부족해서 넘어가지만 이후 글을 작성하기 전 꼭 정리하고 넘어갈 것.

2. 쉘 스크립트에 대한 지식이 부족한거같음. 복습을 하거나 아님 내용을 확실하게 정리하고 넘어갈 것.

 

 

 

 

 

==> level 23

 

크론으로 돌아가는 프로그램. 시간별 할일 스케줄러.

 

다른사람의 쉘스크립트를 읽는 능력은 매우 중요하다. 이번 레벨에서는 의도적으로 읽기 쉽게 만들었다.

만약 당신이 이게 뭔지 이해하는데 어려움이 있다면, 그것이 출력하는 디버그 정보를 보기위해 실행을 시도해봐라.

 

/etc/cron.d 로 이동해서 파일을 살펴 보자. cronjob_bandit23 을 읽어보았다.

뭔가를 매분마다 실행하고 있다 확인해보자.

 

vi 에디터로 열어보았다.

 

여기서 $는 어떤 명령의 출력값. 예를 들면 $echo 1이라고 하면 1을 의미한다.

myname이란 변수에 whoami 라는 명령어의 출력값을 저장하고, mytarget에도 뭔가를 저장하고 있다.

그리고 myname이라는 변수에 비밀번호를? /tmp/$mytarget에 저장하고 있다고 한다.

 

일단 어떤 방식으로 돌아가는지 알아보았다.

whoami는 사용자명을 출력하는 명령어

이렇게 내 user name이 출력된다.

 

그렇다면 cronjob_bandit23이란 파일은 bandit23을 사용자로 명령을 실행하기 때문에

저장된 비밀번호는 bandit23의 비밀번호!

그럼 $mytarget이 뭔지 알면 ??

 

요게 mytarget이군.

 

이게 bandit23의 비밀번호!

 

실험해보니까 이렇게 $()로 묶어서 명령어의 반환값으로도 볼 수 있다!

 

?????근데 로그인이 안된다?!!!

자세히보니 이거 bandit22의 비밀번호랑 같다. 그럼 bandit22가 실행했다는건데 엥?

 

나 바보냐... myname이면 나잖아 ㅡㅡ

근데 myname은 리눅스의 binary 명령이 아니라 /usr/bin/cronjob_bandit23.sh에 저장된 변수?에 불과한데

어떻게 알고 bandit22로 실행시킨거지? 쉘에다 입력했는데

뭔가 실행되긴하는데 뭔지 모르겠다. 알아보니 그냥 공백이라한다. myname은 정의되지 않았음.

 

 

보고있는데 $myname은 쉘에서 실행하면 그냥 빈명령인거같다. 아무것도 실행안됨.

근데 내가 궁금한건 $myname

 

 

이 두개에 파일 모두. 같은 bandit22의 비밀번호가 저장된다는 것이다.

 

가설을 세워봤다. 

1. 내가 알지못하는 어떤 경로로 $myname이 실행되서 해당파일에 비밀번호를 저장되었다.

2. bandit22를 사용했던 누군가가 저렇게 저장해뒀다.

 

일단 이렇게해서 bandit23의 비밀번호를 얻었다. 저 md5sum이라는 명령어에 비밀이 있는건가? 잘모르겠다..

 

궁금해서 bandit23의 계정으로 실행해봤는데 

그냥 $myname으로 된 파일에 누군가 bandit22의 비번을 넣어둔 것 같다.

0Zf11ioIjMVN551jX3CmStKLYqjk54Ga 비번이 바뀌었네.

 

 

 

 

 

 

==> level 24

이번레벨에선 내가 직접 쉘스크립트를 작성하는것을 요구한다고 한다. 

이것은 큰 도약이자 내가 이 단계를 씹어먹은 것을 자랑스러워한다고 한다.

또, 내가 만든 쉘스크립트는 한번 실행되면 삭제된다는 것을 기억하라고한다. 그래서 당신이 계속 카피하려고 시도한다면...(빡대가리다)

 

배운거

ls -ld . ==> 현재 폴더 권한 확인.

for 변수명 in 범위 ==> 범위에는 리스트 올 수 있다.

****문자는 띄어쓰기로 구분할 수 있다!!!

 

즉 ==> for i in * .* ==> 모든파일과 .으로 시작하는 숨겨진 모든파일 ==> 즉 숨겨진파일 포함 폴더 내 모든 파일.

 

if [조건]; then

      실행할 명령...

fi ==> 조건문 종료를 뜻함.

 

stat [파일]==> 파일의 상태나 디렉토리의 상태 확인

timeout [파일]==> 프로그램 실행 후 해당시간이 지나도 실행중인 경우 종료 

 

정말... 정말 많이 알아봤다. 결국 혼자서 풀어냈다.

성취감이 상당하다... 그럼 내가 어떻게 풀었는지 알아봅시다~!

 

우선 cronjob_bandit24가 뭘하는지 알아봤다.

쭉 읽어보자. 

똑같이 bandit24 사용자로 매분 실행되는 프로그램이다.

 

실행되는 프로그램은 똑같은 myname에 사용자이름을 저장한다.

어떤 디렉토리 경로로 이동해서 

for i in * .*; ==> 모든 파일과 숨겨진 모든 파일을 i에 담고

만약 i가 . ..가 아니라면

Handling $i로 출력하고 owner라는 변수에 해당 파일의 소유자명을 저장한다.

        만약 소유자가 bandit23이라면?

        해당 프로그램을 timeout으로 실행한다.

그 후 해당 프로그램을 삭제한다.

 

여러가지 실험결과 두가지를 얻었다.

하나는 bandit24가 아니라면 해당 경로가 존재하지 않아서 어느 디렉토리에서든 실행할 수 있다.

두번째는 bandit23가 소유자라면 프로그램을 실행한다는 것이다.

 

이를 갖고 나는 프로그램을 실행한다는 것에 집중해서

만약 어떤 프로그램을 실행해서 /etc/bandit_pass/bandit24에 접근할 수 있다면??

 

매분 bandit24의 이름으로 실행되기 때문에 bandit24 비밀번호에 접근해서 내가 볼 수 있는 특정파일로 보낸다면?

tmp에 bandit24_pass라는 빈 파일을 만들고 

/var/spool/bandit24/foo 경로에 위 스크립트를 만들었다.

 

그렇게 계속 기다리고 새로고침해봤는데... 저장이 되지 않았다...

분명 저 폴더에 내가 만든 파일은 삭제되었고 즉, 저 스크립트가 실행이 되었다는 건데 왜 저장이 안될까..

 

혹시 권한이 없어서?

bandit24_pass에 누구나 파일을 쓸 수 있게 권한을 부여하였다.

# chmod 777 bandit_pass

그래도 안된다?! 아 스크립트에도 권한 줘야지. 

# chmod 777 test.sh

이렇게 test.sh를 누구나 실행할 수 있게 권한을 바꾸고 기다려보았다...

 

1분정도 기다렸더니.. 비밀번호 획득!!!!

기분 좋다 이게 되네 ㅋㅋ gb8KRRCsshuZXI0tUuR6ypOFjiZbf3G8

 

어쩌면 이걸로  bandit24의 권한을 얻을 수도...?

 

 

 

 

 

==> level 25

이번엔 30002 port가 열려있어서 내가 bandit24의 비밀번호와

4자리 pin번호를 주면 bandit25의 비밀번호를 준다고 한다.

여기서 pin번호는 안알랴줌? ㅋㅋ 

힌트는 brute-forcing,  무차별 대입공격이다.

 

내가 스크립트를 만들어서 1~9999까지 pin을 대입하는 프로그램을 만든다면?

 

이런 스크립트를 만들고

파이프라인으로 무차별 대입을 해봤다.

결과가 너무 지저분하게 출력되서 

이렇게 grep을 통해 비밀번호를 획득했다!

 

pin번호가 뭔지 알고싶어서 Wrong!이 몇번 출력되는지 확인했다.

0~9296까지 대입하고 실패했으니 pin은 9297이다.

 

 

==> level 26

이번 문제에서 알아야하는 것은 3가지

1. 계정과 연결된 쉘을 확인하는 방법.

2. move에서 vi editor로 이동할 수 있다!

3. vi에서 쉘을 실행시킬 수 있다!

 

cat /etc/passwd로 계정 정보를 확인해보았다.

나머지 계정은 모두 계정에 연결시 /bin/bash로 쉘을 실행시키는데 bandit26만 showtext?를 실행시키고 있었다.

export는 기존에 있는 변수 혹은 새로운 변수를 환경변수로 만드는 명령어라고 한다.

exec는 주어진 명령을 실행하되 새루운 프로세스를 생성하지 않고, 쉘 프로세스를 대체한다는 명령어라고 한다.

 만약 exec 없이 명령어를 입력하면 bash쉘에서 showtext를 실행하여 ppid가 bash, pid가 showtext가 된다.

 => 즉, bash 쉘의 하위 프로세스로 실행된다.

 하지만 exec 명령어로 실행하면 bash쉘의 프로세스가 showtext가 된다!

 => 즉, ppid없고 showtext가 종료되면 프로세스가 종료된다.(bash로 돌아오지 않음)

 

따라서 showtext는 bash대신 실행되어 

more ~text.txt라는 명령을 수행하고 바로 종료되는 것이다.

 

여기서 우리가 알아야하는 것은 more이다.

more은 cat과 달리 화면에 예쁘게, 즉 크기에 알맞게 표현해주기 위한 명령어이다.

다시 말하면 화면의 크기에 따라 다르게 수행될 수 있다는 뜻이다.

bandit26에 sshkey로 접속을 시도하면 이렇게 텍스트가 출력되고 프로그램이 종료된다.

하지만 이녀석은 more로 수행되기 때문에 내가 화면크기를 줄이면?

이렇게 실행되다 멈춘 것을 확인할 수 있다. 

[***중요***]

1) 이 화면에서 v를 누르면 vi editor로 진입할 수 있다.

2) :set shell:/bin/bash 이렇게 입력하면 vi editor에서 쉘을 설정할 수 있다!!!!

3) :sh 를 입력하면 해당 쉘이 실행된다!!!!

 

짜잔~ 이렇게 bandit26의 쉘을 취득했다. 여기는 실제 bandit26의 bash이다.

 

여기서 bandit27의 비밀번호를 획득해보자.

bandit27-do라는 압축파일이 있다. 한번 실행해보자.

이렇게 명령어를 다른 사용자로 실행해주는 프로그램인 것 같다. 전에 풀었던 문제.

확인해보니 setuid가 bandit27로 설정되어있다.

 

후후 바로 비밀번호를 획득했다. upsNCc7vzaRDx6oZC6GiR6ERwe1MowGB

 

 

이번문제는 more의 취약점(?) 그리고 vi editor의 취약점(?)을 배운 문제같다. 

이런 방법으로도 쉘을 취득할 수 있다니.. 명령어와 프로그램에 대한 이해도가 높아야 할 것 같다.

 

 

==> level 28

이번 파트는 git에 대한 내용이다. 

git?

git이란 하나의 프로그램을 여러 개발자들이 함께 개발하기 위해 만들어졌다.

프로그램을 개발할 때 어떤 프로그램을 공유하고 검토, 개발하는 환경이라고 생각하면 된다.

 

git에는 repository, commit, branch라는 개념이 있다.

Repository(저장소) : 깃에서 변경 내역을 추적, 관리하는 단위

                                 일반적으로 로컬저장소(local repository)와 원격저장소(remote repository)로 나뉨.

                                 로컬은 개발환경에서 사용되는 저장소. 원경은 다른 개발자화 협역할 때 사용되는 저장소.

Commit : 변경 내역을 저장소에 기록하는 작업.

                각각의 커밋은 고유한 해시값을 가짐. 변경 내역의 이력을 추적 가능.

Branch : 커밋의 변경 이력을 기반으로 생성된 작업라인.

              새로운 기능 추가나 버그 수정 등을 위해 독립적인 브랜치를 생성하여 작업 가능

https://velog.io/@reyang/Git-Commit-Branch%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90 

자세한 내용은 위 주소에 나와있으니 참고!!

 

어쨋든 자세한건 미래의 내가 할테니 신경끄고 비밀번호를 얻어보자.

 

# git 

clone은 해당 주소에 저장된 git을 복제하는 옵션이다.

포트번호는 ID@Host:Port이렇게 입력하면 된다.

repo라는 폴더가 저장되었다. 

확인해보니 README가 있었고 여기서 비밀번호를 얻었다! Yz9IpL0sBcCeuG7m9uQFt8ZNpS4HZRcN

 

git을 시작하는지 알려주는 단계였다..

 

 

==> level 29

git은 실제로 해킹하는데 많이 사용된다. 지금 문제푸는방식이 실제로 이용됨.

git에 관리자 아이디, 비밀번호를 주석으로 두는 경우가 있다. ==> 개발할때 보기 쉽게

물론 개발이 완료되고 변경하면 문제없지만

간혹 변경하지않고 그대로 운영하는 경우가 있다.

 

이런 경우 git repo를 얻으면 histroy를 확인해서 비밀번호와 아이디를 얻을 수도 있음.

 

이번문제도 그런 맥락에서 이해하면 좋다.

README.md를 보니 

비밀번호가 주석처리된 것을 볼 수 있다. 예전에는 xxx가 아니라 비번이 있었던 건가?

 

여기서 git으로 history를 확인하는 방법은 바로

# git log

commit 은 파일을 올리는 작업을 뜻함. (일단 도장 찍고)

push 는 파일을 업로드. (서버로 보내는 것)

 

첫번째 commit에서 fix info leak 

정보 유출을 고쳤다네요.

 

이전버전으로 돌아가는 방법은?

# git checkout [commit 버전]

 

오케 돌아왔다

확인해보니까 안된다.. 왜 안될까..

읽어보니까 detached HEAD 상태라고 한다. 흠... 흠... 아 몰라 revert 시켜

 

캬캬캬 됐다 왜 이건되고 저건 안되는지 모르겠다 졸리다 빡친다 에라이

4pT1t5DENaYuqnqvadYs1oE4QLCdjmJ7 

 

 

 

 

 

==> level 30

 

README.md를 확인했다.

 

log를 확인해보니 fix username된 커밋이 보인다.

해당 커밋으로 되돌린 버전을 새로 커밋했다.

 

README.md를 확인하니 bandit29? username이 있었다...

 

내가 추론해봤을땐 bandit29를 만든 개발자가 bandit30을 만들면서 (version up하면서)

그대로 관리자 아이디와 비밀번호를 가져왔었던 것 같다. 하지만 README.md 파일은 고치지 않았고

이를 뒤늦게 알게되어서 username을 변경했다? 

즉, bandit29와 bandit30은 비밀번호가 같지 않을까? 라는 추론이다.

흠.. 해보니까 안되네..

 

[***중요***]

git 에는 branch 개념이 있다.

 

-- branch ==> 개발의 갈래길

 

-- main  

   -> dev (개발버전)

   -> pro (배포버전)

이렇게 개발이 다양한 branch(영어로 나뭇가지란 뜻이다), 즉 다양한 갈래로 나뉘어서 개발된다.

우리가 no passwords in production! 을 보고 유추할 수 있는 것은

"음 production. 배포버전에는 비밀번호가 없다? 그러면 개발버전이 따로 있나?"  이다.

branch를 확인하는 옵션은

 

# git branch -a

이렇게 다양한 branch가 있고 여기서 dev가 눈에 띈다.

 

확인했더니 아.. 여기에 비밀번호가 있었다!! 이런이런 

이렇게 개발버전에서 노출되는 경우도 있으니 확인 해봐야할 것 같다. qp30ex3VLz5MDG1n91YowTv4Q8l7CDZL

 

 

 

 

 

 

==> level 31

 

그냥 빈 파일이라네요...

 

git

tag??? => 무슨 버전이야~ 라고 남기는 것.

#git tag

secret이라는 tag를 확인!

 

#git show [태그명]

설명에 따르면 이게 바로 비밀번호라고 한다... fb5S2xb7bRyFmAvQYQGEqsbhVyJqhnDy

 

 

git에 중요한 정보들이 노출되는 통로, 길을 지금까지 알아보았다.

그냥 저장되있는 경우

history에 있는 경우

branch에 있는 경우

tag에 있는 경우

이렇게 알게 되었다. 

즉, git에는 여러가지 루트로 중요한 정보가 유출되는구나! 해킹에 이렇게 쓰이는구나! 알고가기!

 

 

 

 

==> level 32

 

이번에는 git의 원격저장소(remote repository)에 파일을 올리는 방법! 을 배우는 단계이다.

 

파일을 올린때는 3가지 단계가 있다.

1.add 2.commit 3.push

의역하자면

1. 결재 서류 올리기

2. 결재 도장(승인 or 수정/반려)

3. 결재 서류 접수 및 처리(최종적으로 업로드)

 

즉, 내가 어떤 파일을 add해서 결재 대기중인 곳에 파일이 올라가면

 누군가 commit해서 결재를 승인하고

 최종적으로 push를 통해 파일을 업로드 한다.

 

우선 key.txt를 작성해서 add해보자

# git add

업로드하려는데.. 오잉? 뭔가 경로가 무시되었다고합니다. .gitignore 파일을 확인해보라네요.

 

요런 파일이 repo안에 숨겨져있었습니다.

.gitignore?

==> 관리자가 이 확장자는 무시하겠다! 필요없다! 라고 정해주는 파일입니다.

==> *.txt 이런식으로 입력해서 .txt 를 확장자로 가진 파일을 무시하겠다고 알릴 수 있습니다.

 

여기서 무시하고 올리겠다! 하면

# git add -f

f옵션으로 force 강제로 올리겠다는 뜻입니다.

이렇게 이상없이 올라갔습니다.

 

그 다음 단계는 commit !!!

 

# git commit -m [message]

이렇게 add된 파일을 commit 하는데

중요한 것은 -m 옵션으로 message를 넣어줘야 한다는 것입니다.

 

이전에 git history를 확인할때 "fix username", "fix password" 등 커밋에 무슨작업을 했는지 코멘트가 작성되있었는데

그것이 바로 git commit -m을 통해 코멘트를 작성하는 것입니다!!

곧 알게되겠지만 이는 log에서 확인할 수 있습니다.

 

마지막 단계 push !!!

 

# git push -u origin [브랜치]

==> origin이라는 remote repository에 master라는 브랜치를 생성하고

      local repository의 master 브랜치 내용을 remote repository의 master 브랜치에 보내라!

 

- u 옵션은 --set-upstream의 줄임말로 

     local repository의 master 브랜치가 remote repository의 master 브랜치를 항상 추적하도록 설정!

 

옵션을 쓰지 않으면 그 이후 

git push할때 

# git push origin master:master 

 이렇게 로컬, 리모트 레포지토리를 적어줘야합니다.

# git pull origin master:master

 pull도 마찬가지.

매번 이렇게 적으면 번거로우니! -u로 어느 remote repository의 어느 brance를 대상으로 하는지 정보를 tracking connection하기 위해 옵션을 추가했다네요.. (뭐라노)

 

비밀번호를 입력했더니 와우~ 다음 단계로 가는 비밀번호를 줬습니다!! 3O9RfhqyAlVBEZpVb6LYStshZoqoSx5K

 

log를 확인했더니 이렇게 제가 적은 코멘트대로 commit된 것을 확인했습니다..

이렇게 코멘트를 작성하는게 중요하네요..

 

 

지금까지 git에서

파일을 clone하고 

history를 log하고

branch를 확인하고

tag를 확인하고

파일을 remote repository로 push하는 것 까지! 배웠습니다.

 

 

 

==> level 33 (마지막 단계)

들어가자마자 심상치 않다..

이게 뭘까?

음 뭔가 특정 명령어로 내가 입력한 값을 대문자로 변경해서 shell에 전달하는 것 같다.

 

확인해보니 대문자나 숫자는 따로 바뀌진 않는다.

 

뭔가 해보니 $shell, $user, $pwd

이런게 된다. 

알아보니까 환경변수라고 하는 녀석이고

$SHELL = /bin/sh 이런식으로 정의한다고 한다.

 

****컴퓨터가 하는말을 잘 들어라!!! 

 ==> 왜 안되는지 컴퓨터가 다 알려준다!

 

 

쉘스크립트?!

$0을하니까...

쉘이 열렸다?!

root로 돌아가서 echo $0을 해봤다.

/usr/bin/zsh ??

왜일까..

 

이런 스크립트를 작성하고 실행해 보았다.

 

처음에는 프로그램만 실행했고 두번째에는 인자를 주었다.

그랬더니 저렇게 출력된다..?

 

$0은 script를 실행시킬 때 프로그램의 이름이 포함된 첫 번째 문자열을 저장한다.

 즉,우리가 실행시킨 파일 ./test.sh 를 저장한 것이다.

 

이는 쉘에서도 동일하게 적용된다!

이전에 본것처럼 terminal이 쉘을 실행시키고 우리는 그 쉘에다 명령어를 입력한다.

즉, 해당 쉘에서 echo $0가 /usr/bin/zsh을 나타내는 것은 어떻게 보면 당연하다.

해당 쉘 쉘에서 실행시켰으니 $0은 당연히 쉘의 파일명/주소를 반환한다.

 

실험을 해볼까?

우리는 현재 터미널에서 실행된 쉘에서 작업을 하고 있다.

여기에서 만약 쉘을 한번 더 실행시킨다면?

엥 뭐지 아무일도 일어나지 않는 것 같아 보인다.. 하지만...

 

# ps -ef로 확인해보니..

pid가 158079인 쉘과 pid가 158821인 쉘 두개가 있다.

자세히보면

첫 번째 쉘은 qterminal이 실행시켰고, 두 번째 쉘은 ppid 158079 ==> 첫 번째 쉘이 실행시켰다.

추가로 우리가 실행한 명령 ps -ef는 ppid를 158821 ==> 두 번째 쉘이 실행시켰다.

 

터미널 => 쉘1 => 쉘2 => ps -ef 이런 구조이다.

exit해도 터미널이 종료되지 않는다.

왜 why? 내가 종료시킨건 두 번째 쉘이니까!!

 

확인결과. 두 번째 쉘만 종료되었다.

 

이해를 더 추가해보자면 터미널이 /usr/bin/zsh을 했고 내가 그 밑에서 이것저것 작업을 하는 느낌?

그래서 test.sh를 했을땐 test.sh 밑에서 새롭게 인자를 받으니까 $0하면 자기자신이 나온 것.

 

그럼 문제로 돌아가서...

 

이 프로그램은 소문자를 대문자로 바꿔서 쉘한테 전달하기 때문에 영어는 쓰지 못한다.

하지만 결국 이 프로그램도

어떤 쉘 => 해당 프로그램 이기 때문에 

$0은 이 프로그램을 실행시킨 쉘일 것이다.

우하하하 쉘 내놔! 

어떤 쉘 => 대문자 프로그램 => 어떤 쉘

대문자 프로그램 위에 쉘을 실행시킨 것이다~!

 

어떤 구조일까 살펴보자.

흠 뭐지 스크린 위에 uppershell이 실행된다. 현재 내 쉘은 ps -ef를 실행시킨 빨간색으로 표시한 쉘인 것 같다.

그 쉘을 sh -c -- $0 ?이란놈이 실행시켰고.. 그 부모 프로세스는 보이지 않는다.

 

그래서 여기서 ./uppershell을 실행시키고 $0으로 그 위에 쉘을 실행시켰다.

들여다보니 ./uppershell이 sh -c -- $0 이라는 명령을 실행시켰다. 아마 저 명령이 

우리가 처음 로그인했을때 >>하면서 보였던 쉘인 것 같다.

내 예상과는 달리

uppershell => sh -c -- $0을 실행시키고 있었던 것이다.

 

 

아 그러니까 우리가 입력한 값을 중간에 어떤 프로세스가 대문자로 바꾸고 sh이 실행시키게 하는데 

$0을 통해 쉘을 실행하도록해서 해당 명령을 수행하던 쉘 위에 쉘이 열린 것이다. 맞나? ㅎ

 

이번문제는 좀 새롭게 느낀점이 많은 문제인 것 같다.

뭔가 리눅스라는 운영체제에 대한 눈이 조금 열릴랑 말랑하는 느낌

알 것 같기도 하고 모르는 것 같기도 하고.. 좀 더 공부해봐야겠다.

 

bandit33 비밀번호 획득!

 

 

 

네~ 축하한다네요~!

 

수고했다 나 자신.. 다시 정리하러 올게~~