파일디스크립터 문제이다.


쉘에서,


$ ls > file


으로 할때, file에 명령어의 결과가 저장된다는것은 다들 알것이다. 사실 이건


$ ls 1>file


을 생략한 버전이다.


1번은 stdout을 의미한다. (쉘 화면에 출력되는것)

그외에 0번은 stdin이고, 2번은 stderr 이다.


문제를 보면, 5글자까지 system으로 실행을 시켜준다.

하지만, fork로 되어있기때문에, 출력 결과값이 우리에게 돌아오지는 않는다.

우리의 소켓번호는 4번으로 일정하다. (fork이기 때문에)


그렇다면,


ls>&4


를 치게되면, 그 결과값을 4번 디스크립터인, 연결되어있는 소켓에 쏴준다.

그러면 그 결과가 클라이언트에게 날아가게 된다.


대충 느낌이 왔으니, 이제 쉘을 실행한다. 쉘은 원래 0번 디스크립트인 stdin을 이용해서 입력을 하지만, 여기서는 소켓으로 입력을 하고 싶은 상황이다.

그렇다면,


sh<&4


를 치게되면, 쉘을 실행하고, 그 입력값은 소켓을 통해 전달한다는 의미이다.

하지만, 끝이 아니다. 그 결과값은 아직도 stdin으로 출력이 되는 상황이기때문에, 명령어를 실행할때 뒤에 >&4 를 붙여줘야한다.

결국 공격방법은


sh<&4

ls>&4

cat key>&4

posted by tunz
  • pwn 2013.07.05 22:34

    4앞에 &가 붙는 이유가 뭐에요?
    0이랑 1 역시 fd인데 요놈앞에는 안붙고 왜 저놈 앞에는 붙는지.. ㅠㅠ

    • tunz 2013.07.07 12:16 신고

      1이 들어간 자리엔 fd만 들어갈수 있는 자리인데,
      위에서 4가 들어간 자리는 파일 또는 fd 입니다.
      그래서 그냥 >4 를 해버리면 4라는 파일이 만들어지면서 거기에 결과값이 들어갈거구요 아마도..
      그래서 file과 착각하는걸 방지하기위해 &를 붙여서 fd라는걸 표시해줍니다