Cracking

jeudi 31 décembre 2020, 17:31  #1
Help for ELF x64 - Basic KeygenMe
dgarrivier
  • 2 posts

Hello,

désolé si la question vous semble naïve mais je ne comprends pas comment aborder ce challenge. Le binaire chargé plante (seg fault) lorsque j’essaye de le lancer ou de le débogguer sous Ubuntu 64 ... et ghidra plante dessus ... Un peu d’aide ?

vendredi 19 février 2021, 00:52  #2
Help for ELF x64 - Basic KeygenMe
loulous24
  • 7 posts

Je viens de le résoudre. Je ne comprends pas pourquoi il fait une seg fault effectivement. Peut-être un bug à la compilation qui ne le place pas dans la bonne partie de la mémoire j’ai l’impression. Si quelqu’un pouvait m’expliquer pourquoi ça ne s’execute pas, je veux bien.

Sinon, rien de bien compliqué dans le code, une analyse du code assembleur se fait très bien (avec ton désassembleur préféré)...

dimanche 21 février 2021, 01:45  #3
Help for ELF x64 - Basic KeygenMe
Th1b4ud
  • 1636 posts

Oui le problème vient du challenge et a été identifié. Il sera corrigé prochainement

lundi 29 mars 2021, 19:30  #4
Help for ELF x64 - Basic KeygenMe
Totomatic
  • 14 posts

Des nouvelles sur ce chal ? j’ai toujours un SIGSEGV

mercredi 31 mars 2021, 01:18  #5
Help for ELF x64 - Basic KeygenMe
Th1b4ud
  • 1636 posts

Je remonte ça en interne de nouveau

jeudi 27 mai 2021, 10:53  #6
Help for ELF x64 - Basic KeygenMe
Anonyme

Bonjour, j’ai toujours un SIGSEGV :(

vendredi 28 mai 2021, 23:45  #7
Help for ELF x64 - Basic KeygenMe
m31z0nyx
  • 394 posts

Bonjour,

Ce n’est pas forcément bloquant ; je viens de le faire sur une vieille Debian 8. À vos VMs.  😄

lundi 31 mai 2021, 09:12  #8
Help for ELF x64 - Basic KeygenMe
GMO_Goat
  • 3 posts

Quand même, s’est énervant que cela fait depuis décembre 2020 que ce problème est là, sous Debian 8 ça fonctionne mais pas moyen d’avoir python > 3.7 sur cette vieille distro,
pwndbg ne peut pas être installé et je ne pense pas que ce soit normal qu’il faille passer 4h à faire un FrankenDebian stable pour debugger un KeyGen me basic... Oui je rage car ça m’énerve de passer du temps a juste mettre en place un n-ème environnement juste pour 1 challenge

lundi 31 mai 2021, 16:11  #9
Help for ELF x64 - Basic KeygenMe
m31z0nyx
  • 394 posts

Je suis bien d’accord avec toi, vu le prix que nous payons nous devrions pouvoir espérer un meilleur service. On lance une action de groupe en justice contre root-me ?

Ah zut je suis encore en mode ironie.

lundi 31 mai 2021, 20:28  #10
Help for ELF x64 - Basic KeygenMe
GMO_Goat
  • 3 posts

Nan mais je me suis un peut emporté ... Pour le moment j’ais réussi a reverse tant que la clef contiens que des printable mais dès que ya par exemple 0x84, ça marche pas ... alors quand ya pas moyen d’avoir un gdb ... S’est compliqué et vite frustrant, d’ailleurs après tt, gdb dit que le programme lit 0x84 dans le fichier comme -62 ... Je me suis dit qu’il de devait le prendre pour un signed mais non ... alors je suis keblo ...

lundi 31 mai 2021, 21:24  #11
Help for ELF x64 - Basic KeygenMe
GMO_Goat
  • 3 posts

Bon, j’ais compris que cela venais du fait que m’on étais hots ASCII ( > 0x7f ), j’ais chercher sur le net, rien ne mentionne que \x84 est interprété comme \x12e\xcc.

vendredi 3 décembre 2021, 15:25  #12
Help for ELF x64 - Basic KeygenMe
perror
  • 10 posts

Bon, comme le correctif ne vient pas j’ai regardé le problème et j’ai patché le truc. Voici mes constatations.

Commençons par regarder la liste des segments du fichier exécutable :

======================================================================
#> readelf —segments ch36.bin

Elf file type is EXEC (Executable file)
Entry point 0x400186
There are 2 program headers, starting at offset 64

Program Headers :
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000025d 0x000000000000025d R 0x200000
LOAD 0x0000000000000260 0x0000000000600260 0x0000000000600260
0x0000000000000000 0x0000000000000040 RW 0x200000

Section to Segment mapping :
Segment Sections...
00 .data : .text :
01 .bss
======================================================================

En fait, pour une raison étrange (probablement pour éviter aux logiciels d’analyse statique de détecter la section .text), le segment 00 contient à la fois .data et .text et il n’est pas exécutable. Ce qui pose problème c’est qu’avant le chargement d’exécutables du noyau Linux mettait abusivement la section .text en exécutable même si elle était dans un segment non-exécutable... mais depuis quelques versions, ce n’est plus le cas. Il est beaucoup plus strict sur la norme notamment à cause de plusieurs problèmes liés au PIE.

Rendre la _section_ .text exécutable serait insuffisant car c’est les droits sur le _segment_ 00 qui sera pris en compte de toute façon.

Pour résoudre ce bug, il faut simplement mettre le segment 00 à RX (et pas seulement à X). C’est un peu embêtant car la section .data n’a normalement pas besoin d’être mis en exécutable mais ce sera suffisant pour faire marcher le crackme.

J’ai donc écrit ce petit programme Python qui utilise LIEF :

======================================================================
# !/usr/bin/env python3

import lief

# Parse the original executable
binary = lief.parse(’ch36.bin’)

# Set the first segment as ’eXecutable’
segments = binary.segments
segments[0].add(lief.ELF.SEGMENT_FLAGS.X)

# Rewrite the whole executable with proper execution rights
binary.write(’ch36.bin.modified’)

# Enjoy !
print("So long and thanks for all the fish !")
======================================================================

À la fin, on a bien :

======================================================================
#> readelf —segments ch36.bin.modified

Elf file type is EXEC (Executable file)
Entry point 0x400186
There are 2 program headers, starting at offset 64

Program Headers :
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000025d 0x000000000000025d R E 0x200000
LOAD 0x0000000000000260 0x0000000000600260 0x0000000000600260
0x0000000000000000 0x0000000000000040 RW 0x200000

Section to Segment mapping :
Segment Sections...
00 .data : .text :
01 .bss
======================================================================

Le ’E’ indique que l’on a bien mis le segment en ’eXecutable’.

Et, on peut à nouveau l’exécuter :

======================================================================
#> ./ch36.bin.modified
[!] x64 NASM Keygen-Me
[A] root-me
[?] Login : AAAA

. THE GAME
======================================================================

Amusez-vous bien ! Et pensez à utiliser LIEF, c’est un très bon framework ! 😉

vendredi 7 janvier 2022, 15:30  #13
Help for ELF x64 - Basic KeygenMe
yudi
  • 3 posts

Hecking
ID:freefaree
Dont oud> readelf —segments ch36.bin

Elf file type is EXEC (Executable file)
Entry point 0x400186
There are 2 program headers, starting at offset 64

Program Headers :
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000025d 0x000000000000025d R 0x200000
LOAD 0x0000000000000260 0x0000000000600260 0x0000000000600260
0x0000000000000000 0x0000000000000040 RW 0x200000

Section to Segment mapping :
Segment Sections...
00 .data : .text :
01 .bss
======================================================================

En fait, pour une raison étrange (probablement pour éviter aux logiciels d’analyse statique de détecter la section .text), le segment 00 contient à la fois .data et .text et il n’est pas exécutable. Ce qui pose problème c’est qu’avant le chargement d’exécutables du noyau Linux mettait abusivement la section .text en exécutable même si elle était dans un segment non-exécutable... mais depuis quelques versions, ce n’est plus le cas. Il est beaucoup plus strict sur la norme notamment à cause de plusieurs problèmes liés au PIE.

Rendre la _section_ .text exécutable serait insuffisant car c’est les droits sur le _segment_ 00 qui sera pris en compte de toute façon.

Pour résoudre ce bug, il faut simplement mettre le segment 00 à RX (et pas seulement à X). C’est un peu embêtant car la section .data n’a normalement pas besoin d’être mis en exécutable mais ce sera suffisant pour faire marcher le crackme.

J’ai donc écrit ce petit programme Python qui utilise LIEF :

======================================================================
# !/usr/bin/env python3

import lief

# Parse the original executable
binary = lief.parse(’ch36.bin’)

# Set the first segment as ’eXecutable’
segments = binary.segments
segments[0].add(lief.ELF.SEGMENT_FLAGS.X)

# Rewrite the whole executable with proper execution rights
binary.write(’ch36.bin.modified’)

# Enjoy !
print("So long and thanks for all the fish !")
======================================================================

À la fin, on a bien :

======================================================================
#> readelf —segments ch36.bin.modified

Elf file type is EXEC (Executable file)
Entry point 0x400186
There are 2 program headers, starting at offset 64

Program Headers :
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000025d 0x000000000000025d R E 0x200000
LOAD 0x0000000000000260 0x0000000000600260 0x0000000000600260
0x0000000000000000 0x0000000000000040 RW 0x200000

Section to Segment mapping :
Segment Sections...
00 .data : .text :
01 .bss
======================================================================

Le ’E’ indique que l’on a bien mis le segment en ’eXecutable’.

Et, on peut à nouveau l’exécuter :

======================================================================
#> ./ch36.bin.modified
[!] x64 NASM Keygen-Me
[A] root-me
[?] Login : AAAA

. THE GAME ID:214625248
Password:paid