Pwn

    [pwnable.xyz] strcat

    문제 풀이 환경 : Ubuntu 16.04 처음에 길을 잘못 들 뻔했는데 다행히도 잘 해결했다. 📝 Analysis > 대충 name을 strcat 해주는 프로그램이다. · main 메뉴에 따라 기능이 실행되는 모양을 하고 있다. 1번 메뉴: strcat의 기능을 구현해놓은 것처럼 보인다. 2번 메뉴: desc 전역 변수에 설정된 주소를 참조해서 값을 수정할 수 있다. 왠지 전역 변수인 만큼 값 변경 후 수정을 해주면 될 것 같은 기분이 든다. 3번 메뉴: FSB(Format String Bug) 해보세요! 라고 어필하고 있지만 함정에 걸리지 말자. 더 간단한 방법이 있다. · read_int32 이 함수는 기본적으로 메뉴의 기능을 선택하기 위해 존재한다. 처음에는 malloc, free의 존재와 mai..

    [pwnable.xyz] J-U-M-P

    문제 풀이 환경 : Ubuntu 16.04 생각보다 간단했던 문제다. 📝 Analysis > Canary를 제외하고는 초록초록하다. 3번 메뉴는 뭔갈 leak 해주고, 1번은 Segmentation fault가 뜬다. · main 초기 세팅을 살펴보면, 미티게이션에서 canary 없었던 이유가 나만의 canary 만들기 때문이라는 걸 유추할 수 있다. v6(rbp - 0x8)에는 PIE offset + 0xba0 값을 먼저 저장해준다. 메뉴별 기능을 살펴보자. 메뉴 number 기능 1 v5(rbp - 0x10)에 저장한 나만의 canary 값이 전역 변수 canary 값과 같을 때 v6의 값을 주소로 call을 해준다. (어셈블리어로 보면 그렇다.) 2 v6의 하위 4Byte와 select를 xor 해..

    [pwnable.xyz] SUS

    문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > 다행히도 풀밭이 아니다. · main main은 메뉴별 기능을 사용자로부터 입력받고 해당 기능에 맞는 함수를 호출해줄 뿐이다. · create_user 문제 이름에서도 밝혔듯이 하나의 유저 공간만을 할당해준다. 이미 저장된 힙 공간이 있다면 그냥 값을 수정해주는 기능밖에 하지 못한다. 그런데 여기서 수상한 점은 쓸데없이 큰 공간을 할당해주고 있다는 것이다. 무려 0x1060 만큼이나 말이다. 무언가 힌트가 될 것 같으니 기억해두자. · print_user 그냥 cur 전역 변수의 값을 가지고 프린트해주는 함수다. · edit_user cur 전역변수에 저장된 값을 기준으로 Name과 Age를 수정해주는 함수다. create_user 함수에..

    Level 23 → Level 24

    이번 문제는 저 스스로 shell-script를 작성해서 푸는 문제인가 보군요. 그리고 한번 실행하고 나면 삭제되니 남기고 싶으면(기념?) 복사해두라네요. ㅎㅎ 일단 이전 문제와 마찬가지로 기본적인 것들을 확인해봅시다. (/usr/bin으로 들어온 뒤) cat cronjob_bandit24.sh shell-script가 보입니다. 저희가 작성할 스크립트는 /var/spool/bandit24에 저장해야 합니다. (들어가서 확인해보세요.) if문 내의 조건을 조금 풀어보면은 for에서 전달받은 * .* 형식의 파일의 값을 $i로 나타내었고 이 값이 현재 경로(.) -a(&&) 이전 경로(..)가 아닐 때 아래를 실행하게 됩니다. ..............................................

    Level 22 → Level 23

    이전 문제와 비슷한 유형이군요. 일단 파일을 확인해봅시다. cat cronjob_bandit23 cat /usr/bin/cronjob_bandit23.sh 코드를 잘 봐야 하는 문제입니다. 하나하나 보도록 하죠. 일단 첫번째 줄은 고쳐지면 myname=bandit22 이 되겠군요. 두 번째 줄은 mytarget=$(echo I am user bandit22 | md5sum | cut -d ' ' -f 1) 실행시키면 바로 볼 수 있을 것이라 생각됩니다. 문제는 저희가 알아내야 할 비밀번호가 bandit22가 아닌 bandit23이라는 것입니다. 어떤 식으로 tmp의 경로를 지정하는지는 알아냈으니 숫자만 바꿔서 그대로 이용해봅시다. echo I am user bandit23 | md5sum | cut -d..

    Level 21 → Level 22

    이번에는 cron이라는 시간 기반 스케쥴러에 대해 다뤄보는 문제입니다. 문제에서 설명한 대로 /etc/cron.d/에 들어가서 확인해봅시다. 그리고 어떤 명령어가 실행되고 있는지까지 확인해보도록 하겠습니다. cd /etc/cron.d/; ls -l cat (3개의 파일들) 일단 형식을 살펴보도록 합시다. 별(*)이 5개인 것을 보니 이런 시간을 가지고 있습니다. 그리고 그다음에 오는 게 실행할 명령어인 것이죠. 매분마다 실행하고 있으니 잘 이용해봅시다. 저희는 현재 bandit22를 집중적으로 봐야 합니다. 그래서 위에서 가리킨 파일이 어떤지 먼저 확인해봤습니다. ls -l /usr/bin/cronjob_bandit22.sh bandit21의 권한이 있는 저희도 보고 실행할 수가 있군요. 내용은 이렇고요..

    Level 20 → Level 21

    ls -l 으로 먼저 확인해보니 다음과 같이 나타납니다. SetUID가 설정된 파일이 하나 나오는군요. 일단 그냥 써서 어떤 식으로 동작하는지 알아보도록 합시다. ./suconnect 인자로 port를 주면 localhost를 통해서 접속하여 현재의 비밀번호와 비교해 같으면 다음 level의 비밀번호를 전달해주는 것 같았습니다. 그럼 일단 nc 명령어로 localhost에서 9999 port를 열어줍시다. 그리고 해당 port로 접속하면 비교를 위한 현재의 비밀번호를 전달하도록 설정합시다. echo "GbKksEFF4yrVs6il55v6gwY5aVje5f0j" | nc -l localhost -p 9999 & (&: 리눅스 작업을 background에서 동작할 수 있게 합니다.) 그러고 나서 jobs 명..

    Level 19 → Level 20

    이번엔 setuid 문제입니다. 로그인을 하고 home 디렉터리의 파일의 권한을 확인해보니 ls -l bandit20의 실행 권한이 현재 s로 setuid로 설정된 것을 보실 수 있습니다. 이 권한(s)은 이 파일을 실행한 어떠한 유저라도 일시적으로 해당 파일의 소유자의 권한을 얻을 수 있습니다. 즉 우리가 노려할 것은 이 파일이 어떤 파일인지 알아본 뒤, bandit20의 권한을 일시적으로 얻었을 때에 /etc/bandit_pass/bandit20의 패스워드를 훔쳐보는 것입니다. 일단 그룹권한으로 현재 bandit19도 읽고 실행할 수 있으니 실행해 봅시다. ./bandit20-do 아하 인자를 하나 전달해서 실행하라고 하네요. 일단 예시 그대로 따라 실행해보도록 하겠습니다. ./bandit20-do ..

    Level 18 → Level 19

    이전 레벨에서 얻은 패스워드로 로그인을 시도해보겠습니다. ssh bandit18@localhost 하지만 웬일인지 바로 로그아웃되며 창이 닫히는군요... 당황스러웠지만 이전 레벨의 NOTE 부분을 보도록 합시다. see 'Byebye!'가 정확히 적혀있군요. 그리고 문제를 보니 로그인을 하려는 순간 .bashrc라는 파일이 실행되어 저희를 로그아웃 시키나 봅니다. 그래서 저는 ssh로 접속하라는 힌트라고 생각을 하고 어떻게 하면 ssh 명령어와 함께 이 문제를 풀 수 있을까를 생각해보았습니다. 그렇게 구글링을 하던 도중에 ssh 사용법 중 하나를 발견하게 되었습니다. 바로 ssh [사용자]@[서버] [명령어] 이렇게 사용할 수 있다는 것입니다. 바로 시도해보았습니다. 저희가 원하는 건 bandit18의 ..