Executable : https://repo.zenk-security.com/hackingweek2014_ctf/crackme-04
WARNING: crackme-04 a été changé entre le moment ou je l'ai fait et la fin du challenge. En effet, l'unpacking fonctionnait avec upx -d, ce qui n'est plus le cas maintenant
$ md5sum old-crackme-04 4454fa70971bbbac4578ca248a066f17 old-crackme-04 $ md5sum new-crackme-04 c50937eb74096c0923eda38a081b6fbe new-crackme-04
La différence entre les deux est mince: les chaines UPX on été remplacées par XXX. On peut retrouver une version compatible avec l'outil upx via une simple commande.
$ perl -pe 's/XXX/UPX/g' crackme-04 > crackme-04-upx
Le binaire est packé UPX. On peut l'unpacker facilement avec “upx -d crackme-04-upx”.
$ upx -d crackme-04-upx Ultimate Packer for eXecutables Copyright (C) 1996 - 2013 UPX 3.09 Markus Oberhumer, Laszlo Molnar & John Reiser Feb 18th 2013 File size Ratio Format Name -------------------- ------ ----------- ----------- 859513 <- 336244 39.12% linux/ElfAMD crackme-04 Unpacked 1 file.
$ file crackme-04-upx crackme-04-upx: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=b3e7c4ad973543e323fad16c09fca15914211fa0, not stripped
Il s'agit d'un ELF 64 bits, compilé en static, mais non strippé, ce qui signifie que les symboles sont toujours présents.
.text:000000000040103E main proc near .text:000000000040103E .text:000000000040103E var_8 = qword ptr -8 .text:000000000040103E .text:000000000040103E push rbp .text:000000000040103F mov rbp, rsp .text:0000000000401042 sub rsp, 10h .text:0000000000401046 mov rax, cs:stdout .text:000000000040104D mov rcx, rax .text:0000000000401050 mov edx, 26h .text:0000000000401055 mov esi, 1 .text:000000000040105A mov edi, offset aWelcomeToTheCr ; "Welcome to the crackme !!!\n\nPassword: " .text:000000000040105F call fwrite .text:0000000000401064 lea rax, [rbp+var_8] .text:0000000000401068 mov rsi, rax .text:000000000040106B mov edi, offset aAs ; "%as" .text:0000000000401070 mov eax, 0 .text:0000000000401075 call scanf .text:000000000040107A mov rcx, [rbp+var_8] .text:000000000040107E mov rax, cs:first_half ; "K008JJ" .text:0000000000401085 mov edx, 6 .text:000000000040108A mov rsi, rcx .text:000000000040108D mov rdi, rax .text:0000000000401090 call strncmp .text:0000000000401095 test eax, eax .text:0000000000401097 jnz short loc_4010B2 .text:0000000000401099 mov rax, [rbp+var_8] .text:000000000040109D add rax, 6 .text:00000000004010A1 mov esi, offset aDbvm4a ; "dBVm4A" .text:00000000004010A6 mov rdi, rax .text:00000000004010A9 call strcmp .text:00000000004010AE test eax, eax .text:00000000004010B0 jz short loc_4010D2
Le code est trivial, les 6 premiers caractères du password sont comparés à “K008JJ” et les suivants à “dBVm4A”.
$ ./crackme-04 Welcome to the crackme !!! Password: K008JJdBVm4A Excellent, you succeed !