[출처] 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 |