FTZ-level12
안녕하세요 오랫만의 포스팅인거 같아요~ 그동안 시험기간 때문에 제대로 포스팅을 하지 못했습니다.
오늘도 화이트햇 행사에 참가해서 집에오니 9시라 문제하나만 포스팅 하도록 하겠습니다.
FTZ-level12 문제는 level11문제와 거의 유사합니다. 즉 버퍼오버플로우의 취약점을 이용한 해킹인데 level11에서와 다르게 gets함수로 입력을 받는다는 점입니다.
지금까지와 같은 방식인 hint에 attackme의 코드가 들어있습니다.
이 문제 또한 ASLR이 걸려있습니다. 따라서 level11과 같은 방법으로 풀어야 겠네요...
자 여기까지는 level11과 똑같은 방법입니다. 하지만 level 11에서는 프로그램을 실행할 때 인자를 주어 쉽게 실행할 수 있었습니다. 하지만 이번문제에서는 프로그램을 실행한 뒤 문자를 입력하도록 되어있습니다. ./attackme를 실행한뒤 `python -c 'print " ........"'`를 실행해도 그냥 단순히 변수에 `python -c 'print " ........"'`이란 문자열이 저장 되는 것입니다. 그러면 어떻게 해야할 까요??
바로 파이프라인을 이용하는 것 입니다.
파이프라인은 기호 "|"의 왼쪽 명령의 표준 출력(stdout)을 오른쪽 명령의 표준 입력(stdin)으로 사용됩니다.
예를들어) 명령어A | 명령어B
=명령어 A의 표준출력이 명령어 B에 표준입력으로 된다.
여기서 궁금한 점이 있다. 왜 cat을 붙여야 할까?????
파이프라인 사용시에 왼쪽의 표준 출력이 파이프라인 오른쪽의 표준 입력으로 들어가는데 python이 실행되고 종료되면서 pipe broken오류로 인해 종료가 일어난다. 따라서 사용자의 입력을 출력해주는 cat을 이용해여 stdin을 유지시키는 것이다.
예를 들어) $cat | bash 를 실행하면
cat과 파이프(|)가 동등한 자식프로세스로 연결되면서 cat이 입력 받은 라인이 파이프 를 통해 쉘로 전달되게 된다.
결론적으로 (python -c 'print "........"';cat) | ./attackme에서 괄호를 써주어야 하는 이유는 괄호를 써주지 않으면 python -c 'print "....."'와 cat|./attackme가 따로 실행된다. 따라서 괄호를 사용하는 것이다.
그리고 (python -c 'print "........"';cat) | ./attackme같이 명령어를 입력하게 되면 print사이의 문자열이 출력되고 cat의 입력 대기라인이 같이 attackme에 전달된다 그래서 버퍼오버플로우가 발생하면서 쉘이 실행되는 것이며, 바로 쉘이 종료되는 것이 아닌 사용자입력을 대기하게 되고 이때 우리가 값을 전달하면 쉘에서 그대로 실행이 되는 것이다.
0 개의 댓글