본문 바로가기

IT/Python

파이썬(python)을 사용하여 프로그램에 입력값 넘겨주기


/* 
written by kaspy (kaspyx@gmail.com)
*/ 


파이썬을 사용하여 리눅스 및 윈도우의 콘솔 프로그램을 통해 입력 인자를 보다 편리하게 넘겨줄수 있다.


이방법은 보통 S/W 결함 및 Security 테스팅 등에 사용된다.


1. gets() 또는 scanf() 함수 등에 넘길때


  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.   char buf[32];
  6.   gets(buf);
  7.   printf("You enterd string 1: %s\n",buf);
  8. }
  9. // gcc -o gets_test gets_test.c

위와 같은 코드에 파이썬(python) 스크립트를 사용하여 입력 인자를 넘길수 있다.


 (python -c 'print "a"*4';cat) | ./gets_test


만약 입력 함수가 여러개라면??


  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.   char buf[32];
  6.   scanf("%s",&buf);
  7.   printf("You enterd string 1: %s\n",buf);
  8.   scanf("%s",&buf);
  9.   printf("You enterd string 2: %s\n",buf);
  10.   scanf("%s",&buf);
  11.   printf("You enterd string 3: %s\n",buf);
  12. }
  13. // gcc -o gets_test2 gets_test2.c



 (python -c 'print "c"*4';cat) | (python -c 'print "b"*4';cat) | (python -c 'print "a"*4';cat) | ./gets_test2


위와같이 '|' 를 사용하여 거꾸로 넣어주면 된다.


aaaa, bbbbb, cccc가 순서데로 들어가서 출력된다.




2. argv에 넘겨줄때



  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6.   char buf[32];
  7.  
  8.   strcpy(buf,argv[1]);
  9.  
  10.   printf("Your argv's strings are : %s\n",buf);
  11.  
  12. }
  13. // gcc -o argv_test argv_test.c


./argv_test `python -c  'print "a"*4'`


만약 argv를 아래와 같이 여러개 받는다면?


  1. int main(int argc, char* argv[])
  2. {
  3.   char buf[32];
  4.   char buf2[32];
  5.  
  6.   strcpy(buf,argv[1]);
  7.   strcpy(buf2,argv[2]);
  8.  
  9.   printf("Your argv's strings are : %s %s\n",buf,buf2);
  10.  
  11. }

이때는 아래와 같이 공백(" ")을 포함해서 넘겨주면 된다.


./argv_test `python -c  'print "a"*4+" "+"b"*4'`


순서대로 aaaa bbbb가 입력되었다고 출력된다.



3. nc명령어를 사용하여 네트워크 소켓을 통해 넘겨주기


nc 명령어와 결합하여 사용하면 네트워크를 통해서도 넘겨주는것이 가능하다.


예를들어 recv() 또는 read() 함수를 사용하여 네트워크 소켓 프로그래밍을 통해 입력값을 받는 프로그램이 있다고 해보자.


포트는 4949이고 아이피는 localhost 이다.


  1. char buf[256];
  2. int nread;
  3.  
  4. nread = recv( sock, buf, sizeof(buf)0 );
  5. buf[nread] = NULL;
  6. printf("You sent message : %s",buf);
  7. ...

(python -c 'print "a"*4' ; cat ) | nc localhost 4949


만약 입력이 여러개라면?


앞에서 한것이랑 똑같이 하면 된다.


(python -c 'print "c"*4' ; cat )| (python -c 'print "b"*4' ; cat ) | (python -c 'print "a"*4' ; cat ) | nc localhost 4949


이상으로 편리한 파이썬(python) 스크립트를 다루어보았다.


물론 단순히 저런 문자열만 넘길수 있는게 아니라, 문자열의 수식화, 헥스코드('\xff') 등도 넘길수 있으므로 잘활용하면 s/w 테스팅에 많은 도움이 될것이다.