OK, urmand tutorialul lui Peter Van Eeckhoutte, am dat de un mic punct de practica in care trebuia sa faci un script care sa scrie 10k "\x41" (fiind in hexadecimal insemnand "A") intr-un fisier ".m3u" care era "incarcat" (open file) de catre aplicatia vulnerabila. Dupa ce am incercat aseara sa imi imbunatatesc programelul si am esuat, azi intrand pe Linux mi-am propus sa incerc din nou, si asa au trecut ~4 ore pana am reusit sa il fac cum vreau eu si sa-i "dau de cap". Problema pe care o aveam, era ca, incercam sa iau input-ul user-ului de la optiuni (valoarea cunoscuta sub drept de argument) cu sys.argv[] (folosindu-ma de modulul "sys"), si aveam ceva de genul: import sys usage = """Usage: -f numele fisierului -j gunoi -m de cate ori se va efectua multiplicarea (ex: de 10 ori => 10 * junk -- daca junk-ul este sa zicem \x41 rezulta in 10 de "A")""" if len(sys.argv) < 4: print "[-] Executare gresita." print usage def procesulmamei(): fisier = sys.argv[1] gunoi = sys.argv[2] multiplicare = sys.argv[3] gm = str(gunoi) * int(multiplicare) data = open(fisier, "w") data.write(gm) data.close() print "OK." Ma rog, ceva de genul, scriptul l-am rescris aici, acum, din cauza ca l-am sters pe cel initial. Bineinteles, probabil am folosit sys.argv gresit (foarte probabil, 99,9%), DAR cineva mi-a recomandat "optparse". Probleme pe care le-am intalnit scriind programul final: - a durat ceva pana am invatat optparse, articole despre acest modul gasiti jos daca doriti sa-l invatati - nu reuseam sa scriu hexadecimalul ca fiind caracter convertit in string (A), scria in fisier hexadecimalul (\x41 spre exemplu) + am gasit inca un modul foarte frumos: binascii pentru a convertii din hexadecimal in string # Adaugare: ## INCEPUT Am uitat sa mentionez ceva in legatura cu modulul optparse si anume, ca sa luati valoarea user-ului ce o introduce (input) si sa o stocati in variabila va veti folosii de (in cazul codului de mai jos) opts.variabila. De ce? Avem: [...] Line #1: parser.add_option("-m", "--milf", help="mothers i like to.... felicitate", [B]dest="pr0n"[/B], type="string") Line #2: Line #3: (opts, args) = parser.parse_args() Ceea ce ne intereseaza este "dest" (destination). Destination creeaza o variabila pe care o definiti voi si acolo va stoca input-ul user-ului, este ceva de genul la: kfc = raw_input("Ce iti place sa mananci? ") Variabila "kfc" va avea valoarea pe care voi o scrieti, sa zicem "Mc Donalds". Linia a 3-a ne foloseste pentru a stoca toate aceste "variabile" facute de catre parser (modul) intr-o lista (a nu se intelege lista: ['item1','item2'] ci tuple: ('item1','item2') care nu poate fi editata fata de lista). Aici putem folosii movies = opts.pr0n. Valorile din opts ar arata asa (mai mult ca un dictionar): {pr0n: argument}. Daca user-ul da: script.py -m SavannaSamson In acest moment "pr0n" din "opts" ar fii ceva de genul: {pr0n: SavannaSamson}, iar variabila "movies" ar avea ca valoare "SavannaSamson" Nu stiu daca am explicat foarte bine si daca ati inteles mare lucru, s-ar putea sa fi gresit in legatura cum se stocheaza datele in variabile la optiunea "dest" din add_option, s-ar putea sa ma fi contrazis intr-un fel, iar daca da, rog pe cineva sa ma corecteze (chiar sunt curios cum este defapt, daca ma insel), dar sper ca v-a fost de ajutor. ## SFARSIT In fine, per total am si invatat (module noi, program care poate fi apelat din command line - ex: terminal -, cum sa tratez anumite 'exceptii', etc.), dar a fost si bataie de cap si mult timp dedicat. Codul: #!/usr/bin/python # Python version used to code this program: 2.6.5 on Ubuntu Linux 10.04.1 LTS # Coded by Flubber on 04.09.2010 / 15:10 import sys import binascii from optparse import OptionParser parser = OptionParser() parser.add_option("-f", "--file", help="filename (e.g.: milf.m3u -- default: music.m3u)", dest="filename", type="string", default="music.m3u") parser.add_option("-j", "--junk", help="junk to write (e.g.: \\x41 -- default: \\x41)", dest="junk", type="string", default="\\x41") parser.add_option("-m", "--multiply", help="times to multiply the junk (default: 10000)", dest="multiply", type="int", default="10000") (opts, args) = parser.parse_args() def process(): try: filename = opts.filename if filename.find(".m3u") == -1: print "[*] Adjusting file name - adding extension \".m3u\" ... [OK]" filename = filename + ".m3u" else: print "[+] Filename ... [OK]" junk = opts.junk if junk.find("\\") == -1: print "[*] Adjusting junk data ... [OK]" junk = "\\" + junk else: print "[+] Junk ... [OK]" multiply = opts.multiply junksecond = junk.replace("\\x", "") somelittlestuff = binascii.unhexlify(junksecond) littlestuff = str(somelittlestuff) * int(multiply) data = open(filename, "w") data.write(littlestuff) data.close() print """\n\n[+] Job completed successfully. Information:\n [*] Filename: %s [*] Junk: %s [*] Times the junk was multiplied by: %s\n""" % (filename, junk, multiply) except: print "[-] Unexpected error:", sys.exc_info()[0] raise else: print "[+] Exiting. Have a nice day!" process() Codepad: Python code - 46 lines - codepad Articole: Python’s optparse for human beings de "Alex on linux" "Tratarea" exceptiilor - documentatia oficiala Python Despre modulul "optparse" - documentatia oficiala Python Modulul binascii - link-ul la care am ajuns in urma cautarilor pe Google si s-a dovedit a fi folositor in cazul meu Binascii - documentatia oficiala de pe site-ul Python.org Revin mai tarziu cu completari. Bafta, sper sa ajute pe cineva.