Debugger avec fenris un fichier "encrypté" avec burneye (ou comment passer le level 10 de ngsec) SYNOPSIS: un binaire: "validate_MoD" $ ./validate_MoD Usage: ./validate $ ./validate_MoD "login=login&password=pass"

Authentication ERROR!

Either your username or password are incorrect. Please go back and try again.

$ STEP by STEP avec Fenris: $ ./fenris fenris 0.07-m (3186, 23496) - program execution path analysis tool Brought to you by Michal Zalewski [...] >> Le programme n'ayant pas été forcement compilé sur votre propre machine, vous aurez peut etre à utiliser le flag "-s" $ objdump -f ./validate_MoD | grep ad adresse de départ 0x05371035 >> il faut utiliser -X 5 ( $ ./fenris -X 5-s ./validate_MoD [...] 29321:01 SYS signal (5, 0x5371a0c) = 0 29321:01 + signal 5 = Trace/breakpoint trap 29321:01 + 0x5371a0c = fnct_7 *************************************************************** * WARNING: I detected a debugger trap planted in the code at * * address 0x053714c6. This int3 call is "connected" to a * * SIGTRAP handler at 0x05371a0c. Please use Aegir or nc-aegir * * carefully remove this trap, see the documentation. * *************************************************************** 29321:01 <53714ce> cndt: on-match block +18 executed 29321:-- SIGNAL 11 (Segmentation fault) - will not be handled >> Il fallait s'en douter, il y a une pseudo protection anti debugger. >> Le jmp derriere n'est pas vraiment significatif, mais il peut s'agir d'une condition résultant du sigtrap. >> Analysons le code plus en profondeur, et utilisons aegir: $ ./fenris -X 5 -W /tmp/as -s ./validate_MoD "login=login&password=password" & [...] $ ./aegir /tmp/as Cur. time : Sat Jul 13 09:56:33 2002 Executable: ./validate_MoD Arguments : login=login&password=password 29357:00 \ new map: 40000000:77824 (/lib/ld-linux.so.2) 05371035: pushl 0x5371008 >> A ce stade, le code n'a pas encore été décrypté, on va le laisser faire un peu ;-) [aegir] call At 0x5371035, continuing to next local call... >> stop à l'appel de la fonction de cryptage [aegir] call >> décryptage, on arrive au début du main (surement) 29357:00 local fnct_2 () 29357:00 + fnct_2 = 0x5371117 >> voyons ce qu'il y a à la fonction appelée à l'handler spécifié par signal(2) [aegir] disas 0x05371a0c 10 05371a0c [fnct_2+2293]: pushl %ebp 05371a0d [fnct_2+2294]: movl %esp,%ebp 05371a0f [fnct_2+2296]: incl 0x5375748 05371a15 [fnct_2+2302]: leave 05371a16 [fnct_2+2303]: ret >> Il ne fait qu'un variable ++, surement situé dans la bss. >> voyons ce qu'il fait au niveau du SIGTRAP [aegir] disas 0x053714c6 10 053714c6 [fnct_2+943]: int3 053714c7 [fnct_2+944]: cmpl $0x0,0x5375748 053714ce [fnct_2+951]: jne $0x53714e2 053714d0 [fnct_2+953]: xorl %eax,%eax >> il compare la valeur incrémenté dans le handler à 0, et il saute ou pas selon le cas ;-) >> Comme fenris ignore les SIGTRAP généré par l'executable, il va faloir passer outre, et donc bluffer le test. Ca ne risque pas d'etre dur en fait. Il suffit de faire croire que c'est passé dans la fonction et qu'il ait incrémenté d'un. Pour ca, hop: [aegir] setmem 0x5375748 1 Memory at address 0x5375748 modified. [aegir] run [...] >> Regardez ce qu'il défile, le code passe l'anti debugger et c'est bon ;-) 29357:02 L strcmp (bffffa94 "login", bffff5c4 "ZincompetenciaZ") = 12 29357:02 <804880e> cndt: on-match block +56 skipped >> après, inutile de vous faire un dessin pour le reste ;-)