엔디언을 적용한 페이로드 작성에서 아래와 같은 코드를 사용하였습니다.
이때 get_shell address 뒤에 왜 cat명령어를 붙여주나요?
cat 명령어를 빼고 실행하면 셸을 얻고 바로 종료되는거 같네요..
(python -c "print 'A'*0x30 + 'B'*0x8 + '\xa7\x05\x40\x00\x00\x00\x00\x00'";cat)| ./rao
그리고, rao.c에서 char buf[0x28] 만큼 할당했는데 scanf의 buf에서는 [0x30]만큼의 메모리를 할당하나요?
cat 명령어는 말씀대로 셸을 얻은 이후 종료하지 않고 추가적으로 명령어를 입력하기 위함인 것 같고 0x30이 할당되는 이유는 원래 0x28만큼 변수를 선언해도 뒤에 추가적으로 버퍼가 붙는 경우가 있기 때문입니다. 원래는 setvbuf 함수를 이용해서 이러한 버퍼가 붙지 않도록 하는 경우가 대부분인데 해당 문제에서는 알 수 없는 이유로 변수를 선언한 다음 setvbuf 함수를 실행해서 그런 것 같네요.
cat 명령 없이
(python -c "print 'A'*0x30 + 'B'*0x8 + '\xa7\x05\x40\x00\x00\x00\x00\x00'")| ./rao
를 실행시키면 ./rao
프로세스는 'A'*0x30 + 'B'*0x8 + '\xa7\x05\x40\x00\x00\x00\x00\x00'
를 파이프 받은 다음
/bin/sh
를 실행시킨후 종료 됩니다. 더이상 파이프 받을 데이터는 없으니, /bin/sh
도 종료됩니다.
이렇게 되면 /bin/sh
와 소통할 방법이 없어지게 됩니다.
그래서 cat 명령으로 소통 방법을 마련해줍니다.
cat 명령은 원래 cat [FILE]
으로 사용되며 [FILE]
의 내용을 stdout으로 써주지만,
[FILE]
없이 cat
만 쓰게 되면 stdin에서 입력은 받고 stdout으로 써줍니다.
stdin에서 stdout으로 복붙된 입력은 파이프를 통해 ./rao
에서 시작된 ./bin/sh
가 받고 수행을 하게 됩니다.
cat
명령은 계속해서 stdin 입력을 기다리기 때문에 interactive shell처럼 느껴지는 것입니다.
(cat
명령을 사용해도 ./rao
는 종료되지만, /bin/sh
는 계속 입력을 기다립니다).
cat 명령이 아니더라도 ./bin/sh
와 소통할 방법은 있습니다.
echo [STRING]
은 [STRING]
을 가져다 stdout에 써줍니다.
그러므로
(python -c "print 'A'*0x30 + 'B'*0x8 + '\xa7\x05\x40\x00\x00\x00\x00\x00'"; echo ""; echo "id")| ./rao
는 ./bin/sh
에서 id
를 수행하게 됩니다.
(
echo ""
는 payload를 먼저 보내기 위해 [ENTER]를 치는 것과 같습니다).
하지만 echo
명령이 끝난다음, cat
와 다르게 계속 입력을 기다리지 않으니
더이상 파이프 받을 데이터가 없게 되고, ./bin/sh
) 프로세스는 종료됩니다.
정보: buffer overflow - Using (cat $file; cat) to run a simple BOF exploit