[출처] http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=732



결론은 , '|' 때문에 ;cat 을 붙여야만 되는 겁니다.


ㄱ) (  A 명령  ) | ./attackme   이런 입력을 했다면.


(perl -e 'print "\x32\xff\xff\xbf . . ..";cat)|./attackme 라는 예를 들죠.


ㄱ) 과 같은 방법을 통해서..


인자전달 방식이 아닌, 표준입력(키보드)을 통해 따로 입력을 받는 


attackme 프로그램 같은 경우라도  '|' 을 통해 변수에 내가 원하는 값을 넣어서 


오버플로우를 시킬수는 있었지만.


attackme 의 코드 중에 system("/bin/sh") 에 의해 생성되는 프로세스 또한


| 기준을 왼쪽에 있는. 다시말해서 ( A ) 자리의 프로세스의 표준 출력 내용을  


입력받으려고 하는거죠..



*원래 쉘(/bin/sh) 는 프롬프트 $ 를 띄우고 표준입력(키보드) 로부터

입력을 기다리는 것이지만...  위의 경우에는 | 때문에

키보드 대신 ( A ) 자리의 프로세스의 표준출력 내용을 

입력받으려 한다는 거죠..



헌데, ( A )자리에 있던 프로세스가 종료되면 더이상 입력받을 내용이 없기 때문에 종료 됩니다.


따라서 ,파이프 연결을 지속적으로 유지시키기 위해서


cat 을 하나 더 집어넣어서 계속적으로 ( A ) 자리에서 표준출력을 시킬수 있도록


만들어 주는거죠.. 그게 바로 ;cat 의 역할 입니다.



그림으로 나타내어 보자면..





;cat 때문에

cat실행되고 키보드로부터 입력기다리면서

입력받은내용을 표준출력으로

보내고 , 이것은 파이프를 따라 전해집니다.



'System Hacking > 정리' 카테고리의 다른 글

IDA 리모트 디버깅 설정  (0) 2015.11.11
소멸자(.dtors) +4 하는 이유  (0) 2015.11.10
FSB 소멸자 주소가 아닌 ret주소를 이용한 공격  (0) 2015.11.10
/proc/pid/maps  (0) 2015.11.09
suid 동작  (0) 2015.10.30

+ Recent posts