====== Reverse 4 ======
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 !