완료됨
익스플로잇 질문

엔디언을 적용한 페이로드 작성에서 아래와 같은 코드를 사용하였습니다.
이때 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]만큼의 메모리를 할당하나요?

#시스템_해킹 #공격기법
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 2
avatar
믕믕이부하
대표 업적 없음

cat 명령어는 말씀대로 셸을 얻은 이후 종료하지 않고 추가적으로 명령어를 입력하기 위함인 것 같고 0x30이 할당되는 이유는 원래 0x28만큼 변수를 선언해도 뒤에 추가적으로 버퍼가 붙는 경우가 있기 때문입니다. 원래는 setvbuf 함수를 이용해서 이러한 버퍼가 붙지 않도록 하는 경우가 대부분인데 해당 문제에서는 알 수 없는 이유로 변수를 선언한 다음 setvbuf 함수를 실행해서 그런 것 같네요.

2022.02.10. 03:40
Rinnnt
CTF Third Place

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 를 수행하게 됩니다.
Screenshot 2022-04-10 203822.png(echo ""는 payload를 먼저 보내기 위해 [ENTER]를 치는 것과 같습니다).
하지만 echo 명령이 끝난다음, cat와 다르게 계속 입력을 기다리지 않으니
더이상 파이프 받을 데이터가 없게 되고, ./bin/sh) 프로세스는 종료됩니다.

정보: buffer overflow - Using (cat $file; cat) to run a simple BOF exploit

2022.04.10. 21:40