본문 바로가기

Wargame/Pwnable.kr

Pwnable.kr uaf-8pt Human 클래스의 give_shell() 함수 안에 system("/bin/sh") 가 있는데 이 함수를 실행시키는 것이 핵심인 듯 하다. introduce() 함수도 public으로 선언되어 있다. 문제의 제목 그대로 UAF(Use After Free) 취약점을 이용해야 한다. Man 클래스와 Woman 클래스에서 앞의 Human 클래스를 상속하고 있고 멤버 함수로 introduce() 함수를 둘다 가지고 있다. 즉, 함수 오버라이딩을 하고 있다. main() 함수에는 Human 형 포인터로 Man 클래스와 Woman 클래스를 객체화하고 각각의 메뉴를 출력한다. 1번 메뉴는 생성된 각 인스턴스의 introduce() 함수를 호출하고 3번 메뉴는 생성된 인스턴스를 소멸시킨다. 2번 메뉴에서는 main(.. 더보기
Pwnable.kr dragon-75pt 보호되어 있는 글입니다. 더보기
Pwnable.kr simple login-50pt 보호되어 있는 글입니다. 더보기
Pwnable.kr brainfuck-150pt 보호되어 있는 글입니다. 더보기
Pwnable.kr leg-2pt leg.c 파일의 main() 함수 소스를 보면 사용자 입력값이 key1(), key2(), key3() 함수 각각의 반환값의 합과 같으면 flag 내용을 읽어 출력시켜 준다. 위는 key1() 함수의 c 소스 코드이다. ARM에서는 PC(Program Counter) 레지스터가 EIP 레지스터와 비슷한 역할을 한다. 하지만 Pipe Lining 기법을 이용해 효율성을 극대화하기 때문에 항상 PC는 Execute 단계보다 4byte 앞선 지점을 가리킨다.(PC는 항상 Fetch 지점을 가리키게 되고, 다다음 Instruction을 의미한다.) 따라서 위의 분석 결과화면에서 'mov r3, pc' 라인의 pc는 0x00008ce4의 값을 가지고 있고 r0 레지스터에는 일반적으로 함수의 반환값을 저장하기 때.. 더보기
Pwnable.kr asm-6pt readme 파일을 보면 9026 포트로 연결을 시도하면 asm 바이너리가 실행될거라고 한다. flag를 읽어야하는데 flag 파일의 명이 위와 같이 매우 길다... asm.c 소스 파일이다. 64bit 쉘코드 문제이며 open(), read(), write() 시스템 콜만이 사용 가능하다. 아래의 표시한 부분을 보면 chroot() 함수로 프로세스가 인식하는 루트 디렉토리를 변경하고 sandbox() 함수(이 함수에서 사용 가능한 시스템 콜을 open(), raed() write()로 제한한다.)를 호출한 후 sh 포인터 변수의 값을 실행시킨다. 64bit 형태로 open(), read(), write() 쉘코드를 작성하면 되는 간단한 문제이다. pwntools의 shellcraft를 이용해 간단하게 .. 더보기
Pwnable.kr cmd2-9pt cmd1과 마찬가지로 argv[1]을 전달해 system() 함수의 실행을 통해 flag를 출력해내야 한다. delete_env() 함수로 환경 변수를 0으로 초기화하고 putenv() 함수로 PATH 환경 변수를 임의로 설정한다. 또, filter() 함수를 호출하는데 cmd1보다 더 까다롭다. filter() 함수에 '/'가 걸리지 않도록 문자열을 argv[1]로 전달해야 하는데, echo 를 사용해 볼 수 있다. "echo ls" 라고 입력하면 그냥 'ls'라는 문자열이 출력되지만 "$(echo 'ls')" 라고 입력하게 되면 ls 명령어를 입력한 것과 마찬가지로 문자열 안의 내용을 실행하게 된다. 이 점을 이용하자. echo의 man 페이지를 보면 8진수 또는 16진수를 전달하기 위해 위처럼 입력.. 더보기
Pwnable.kr cmd1-1pt main() 함수를 먼저 보면 putenv() 함수로 PATH 환경 변수를 임의로 설정한다. 또한 argv[1]을 매개 변수로 한 filter() 함수를 호출하는데 filter() 함수를 보면 전달받은 매개 변수에(문자열) "flag", "sh", "tmp" 가 포함되면 안된다. 즉, argv[1]에 "flag", "sh", "tmp"가 들어가지 않도록 전달해서 system() 함수를 이용해 flag 파일을 출력해 내야 한다. 작성한 파이썬 스크립트이다. PATH 환경 변수의 영향을 받기 때문에 각 명령어와 파일의 경로는 '/'부터 시작하는 절대 경로로 써야 한다. 그리고 문자열 검사를 회피하기 위해 마지막 "flag" 대신 와일드 카드를 이용해 "fla?"로 표기한다. 위와 같이 flag를 출력했다. 더보기
Pwnable.kr shellshock-1pt shellshock.c를 보면 SetUID와 SetGID를 모두 받아와 shellshock의 홈 디렉토리에 있는 bash를 실행시켜 echo문을 출력한다. shellshock는 지금은 패치된 bash의 취약점인데, 아래 링크를 참고하자. - shellshock 취약점 -http://teamcrak.tistory.com/380http://m.blog.naver.com/renucs/220144713558 기존 사용하는 bash는 안전하지만 홈 디렉토리의 bash는 취약점이 확인되었다. 환경 변수로 함수를 선언함과 동시에 명령어를 전달하게 되면 명령어를 실행해버린다. 더보기
Pwnable.kr lotto-2pt 먼저 간략히 설명하자면, 사용자로부터 submit 배열에 6byte 입력을 받고 1부터 45까지의 수 6자리로 구성된 lotto 배열과 비교를 해 match 변수의 값이 6이 되면 flag를 출력한다. 랜덤한 수 6자리를 어떻게 맞추느냐.. 표시한 부분만 보면 금방 풀 수 있다.ㅋㅋ본래 의도는 각 자리수 6자리가 모두 같아야 하겠거니~ 했겠지만! 두 배열의 값을 서로 비교할 때 중복 검사를 하지 않는다. 만약 lotto[0]의 값과 submit[0]의 값이 서로 같고, submit 배열의 모든 자리값이 submit[0]의 값과 같다면 안쪽 for문에 의해 submit 배열의 각 자리와 비교를 해 match 변수의 값을 증가시킬 것이고 결국 match 변수의 값은 6이 될 것이다. 쉽게 말해, 같은 값으로.. 더보기