рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!
ZeroNight 2019 рд╕рдореНрдореЗрд▓рди рд╕реЗ рдкрд╣рд▓реЗ
рд╣реИрдХрдХреНрд╡реЗрд╕реНрдЯ рдореЗрдВ, рдПрдХ рдордиреЛрд░рдВрдЬрдХ рдХрд╛рд░реНрдп рдерд╛ред рдореИрдВрдиреЗ рд╕рдордп рдкрд░ рдирд┐рд░реНрдгрдп рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд░реЛрдорд╛рдВрдЪ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд┐рд▓рд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдХрд┐ рдЖрдпреЛрдЬрдХреЛрдВ рдФрд░ r0.Crew рдЯреАрдо рдиреЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред
рдХрд╛рд░реНрдп: рдЧреБрдкреНрдд
рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ 1998 рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдХреНрд░рд┐рдпрдг рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
рд╕рд╛рдордЧреНрд░реА
0. рдХрд╛рд░реНрдп
1. рдЙрдкрдХрд░рдг2. рдЫрд╡рд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ3. рдЪрд░рд┐рддреНрд░ рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рдХрд░реНрдиреЗрд▓4. Search register_chrdev4.1ред рдПрдХ рддрд╛рдЬрд╛ рдиреНрдпреВрдирддрдо рд▓рд┐рдирдХреНрд╕ рдЫрд╡рд┐ рддреИрдпрд╛рд░ рдХрд░рдирд╛4.2ред рдХреБрдЫ рдФрд░ рддреИрдпрд╛рд░реА4.3ред LUNix рдкрд░ KASLR рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ4.4ред рд╣рдо рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд╛рддреЗ рд╣реИрдВ5. / рджреЗрд╡ / рд╕рдХреНрд░рд┐рдп рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рд╕реЗ fops рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ6. рд╣рдо рдкрдврд╝рд╛рдИ рд▓рд┐рдЦрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ6.1ред рд╣реИрд╢ рдлрдВрдХреНрд╢рди6.2ред рдореБрдЦреНрдп рдкреАрдврд╝реА рдПрд▓реНрдЧреЛрд░рд┐рдердо6.3ред keygenрдХрд╛рд░реНрдп
QEMU рдореЗрдВ рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдореЗрд▓ рдФрд░ рд╕рдХреНрд░рд┐рдпрдг рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЗрд▓ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЪрд▓реЛ рдмрд╛рдХреА рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ!
1. рдЙрдкрдХрд░рдг
- GDB
- QEMU
- binwalk
- рдЖрдИрдбреАрдП
~/.gdbinit
рдЖрдкрдХреЛ рдПрдХ рдЙрдкрдпреЛрдЧреА рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
define xxd dump binary memory dump.bin $arg0 $arg0+$arg1 shell xxd dump.bin end
2. рдЫрд╡рд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
рдкрд╣рд▓реЗ рдирд╛рдо рдмрджрд▓реЗрдВ jD74nd8_task2.iso рд╕реЗ lunix.isoред
рдмрд┐рдирд╡реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдСрдлрд╕реЗрдЯ
0x413000
рдкрд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрд▓ рдФрд░ рдХреБрдВрдЬреА рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреА рд╣реИ:
рд╣рдо рд╕реАрдзреЗ рдЫрд╡рд┐ рдореЗрдВ рд╣реЗрдХреНрд╕ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдЪреЗрдХ рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╣рдорд╛рд░реЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ
activated
рд░реЗрдЦрд╛ рдХреЛ
activated
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдо рдХрд░рдирд╛ рдерд╛ рддрд╛рдХрд┐ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд░рд╣реЗред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХреЛрдИ рд╣реИрд╢ рдЪреЗрдХ рдирд╣реАрдВ рд╣реИред рдЫрд╡рд┐ рдХреЛ lunix_broken_activation.iso рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕реЗ QEMU рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдПрдВ:
sudo qemu-system-x86_64 lunix_broken_activation.iso -enable-kvm
рдЪрд▓реЛ рдЕрдВрджрд░ рдЦреЛрджреЗрдВ:
рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:
- рд╡рд┐рддрд░рдг - рдиреНрдпреВрдирддрдо рд▓рд┐рдирдХреНрд╕ 5.0.11ред
- рдЪрд░рд┐рддреНрд░ рдЙрдкрдХрд░рдг
/dev/activate
рдореЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВ, рдХреБрдВрдЬреА, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХреЛ рдХрд░реНрдиреЗрд▓ рдХреЗ рдЖрдВрддреНрд░ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред - рдореЗрд▓, рдХреБрдВрдЬреА
email|key
рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред email|key
рдкреНрд░рд╛рд░реВрдкред
Target_broken_activation.iso рдЫрд╡рд┐ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
3. рдЪрд░рд┐рддреНрд░ рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рдХрд░реНрдиреЗрд▓
рдЙрдкрдХрд░рдг рдЬреИрд╕реЗ
/dev/mem
,
/dev/vcs
,
/dev/activate
, рдЖрджрд┐ред register_chrdev рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
register_chrdev
рдХрд░реЗрдВ:
int register_chrdev (unsigned int major, const char * name, const struct fops);
name
рдХрд╛ рдирд╛рдо рд╣реИ, рдФрд░
fops
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдбреНрд░рд╛рдЗрд╡рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╣реИрдВ:
struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); };
рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
рдпрд╣рд╛рдВ, рджреВрд╕рд░рд╛ рддрд░реНрдХ рдмрдлрд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдЧрд▓рд╛ рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред
4. Search register_chrdev
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдиреНрдпреВрдирддрдо рд▓рд┐рдирдХреНрд╕ рдЫрд╡рд┐ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╖рдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдиреНрдпреВрдирддрдоред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓ рдбрд┐рдмрдЧрд░ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдФрд░ рдирд╛рдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рд╕рдВрднрд╡ рд╣реИред
рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдиреНрдпреВрдирддрдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдиреНрдпреВрдирддрдо рд▓рд┐рдирдХреНрд╕ рдЫрд╡рд┐ рдореЗрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдиреНрдпреВрдирддрдо рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЕрд░реНрдерд╛рддреН, рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
Minimal Linux -> register_chrdev -> -> register_chrdev Lunix
4.1ред рдПрдХ рддрд╛рдЬрд╛ рдиреНрдпреВрдирддрдо рд▓рд┐рдирдХреНрд╕ рдЫрд╡рд┐ рддреИрдпрд╛рд░ рдХрд░рдирд╛
- рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
sudo apt install wget make gawk gcc bc bison flex xorriso libelf-dev libssl-dev
- рдбрд╛рдЙрдирд▓реЛрдбрд┐рдВрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
git clone https://github.com/ivandavidov/minimal cd minimal/src
- рд╕рд╣реА
02_build_kernel.sh
:
рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВ
# Disable debug symbols in kernel => smaller kernel binary. sed -i "s/^CONFIG_DEBUG_KERNEL.*/\\# CONFIG_DEBUG_KERNEL is not set/" .config
рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ
echo "CONFIG_GDB_SCRIPTS=y" >> .config
- рд╕рдВрдХрд▓рди
./build_minimal_linux_live.sh
рдЫрд╡рд┐ рдиреНрдпреВрдирддрдо / src / minimal_linux_live.iso рд╣реИред
4.2ред рдХреБрдЫ рдФрд░ рддреИрдпрд╛рд░реА
рдиреНрдпреВрдирддрдо / src / iso рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд▓рд┐рдП minimal_linux_live.iso рдХреЛ рдЕрдирдЬрд╝рд┐рдк рдХрд░реЗрдВред
рдиреНрдпреВрдирддрдо / src / iso / рдмреВрдЯ рдлрд╝рд╛рдЗрд▓
rootfs.xz
рдХрд░реНрдиреЗрд▓
rootfs.xz
рдХрд░реНрдиреЗрд▓
kernel.xz
рдФрд░
rootfs.xz
FS
rootfs.xz
ред рдЙрдиреНрд╣реЗрдВ
kernel.minimal.xz
,
rootfs.minimal.xz
рдирд╛рдо рджреЗрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЫрд╡рд┐ рд╕реЗ рдХреЛрд░ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде
рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛
vmlinux рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
extract-vmlinux kernel.minimal.xz > vmlinux.minimal
рдЕрдм рдиреНрдпреВрдирддрдо / src / iso / рдмреВрдЯ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕реЗрдЯ рд╣реИ:
kernel.minimal.xz
,
rootfs.minimal.xz
,
vmlinux.minimal
ред
рд▓реЗрдХрд┐рди lunix.iso рд╕реЗ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХрд░реНрдиреЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рднреА рд╕рдорд╛рди рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо
vmlinux.lunix
kernel.xz
рдХрд╣рддреЗ рд╣реИрдВ,
vmlinux.lunix
рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред
kernel.xz
,
rootfs.xz
, рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреНрдпреЛрдВред
4.3ред LUNix рдкрд░ KASLR рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ
рдореИрдВ QEMU рдореЗрдВ рдирдП рдЗрдХрдЯреНрдареЗ рдорд┐рдирд┐рдорд▓ рд▓рд┐рдирдХреНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ KASLR рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред
рд▓реЗрдХрд┐рди рдпрд╣ рд▓реБрдирд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЫрд╡рд┐ рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╣реЗрдХреНрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЦреЛрд▓реЗрдВ, рд▓рд╛рдЗрди
"APPEND vga=normal"
рдФрд░ рдЗрд╕реЗ
"APPEND nokaslr\x20\x20\x20"
рдмрджрд▓реЗрдВред
рдФрд░ рдЫрд╡рд┐ рдХреЛ lunix_nokaslr.iso рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
4.4ред рд╣рдо рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд╛рддреЗ рд╣реИрдВ
рд╣рдо рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рддрд╛рдЬрд╛ рдорд┐рдирд┐рдорд▓ рд▓рд┐рдирдХреНрд╕ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:
sudo qemu-system-x86_64 -kernel kernel.minimal.xz -initrd rootfs.minimal.xz -append nokaslr -s
рдЕрдиреНрдп рдбрд┐рдмрдЧрд░ рдореЗрдВ:
sudo gdb vmlinux.minimal (gdb) target remote localhost:1234
рдЕрдм рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ
register_chrdev
:
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдорд╛рд░рд╛ рд╡рд┐рдХрд▓реНрдк
__register_chrdev
ред
рд╣рдореЗрдВ рднреНрд░рдо рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдордиреЗ register_chrdev рдХреА рдЦреЛрдЬ рдХреА, рд▓реЗрдХрд┐рди __register_chrdev рдкрд╛рдпрд╛рдЬреБрджрд╛:
рдХреНрдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд▓реЗрдирд╛ рд╣реИ? рдореИрдВрдиреЗ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреБрдХрдбрд╝реЗ рдкрд░ рдмрд╕реЗ:
0xffffffff811c9785 <+101>: shl $0x14,%esi 0xffffffff811c9788 <+104>: or %r12d,%esi
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐
0xc1, 0xe6, 0x14, 0x44, 0x09, 0xe6
рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ
0xc1, 0xe6, 0x14, 0x44, 0x09, 0xe6
ред
рдЕрдм рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕ рдЦрдВрдб рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реИред
__register_chrdev
рдлрд╝рдВрдХреНрд╢рди
__register_chrdev
рдкрддрд╛
0xffffffff811c9720
, рдпрд╣
__register_chrdev
рдЦрдВрдб рд╣реИред рд╡рд╣рд╛рдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗред
рд╕рдВрджрд░реНрдн рдиреНрдпреВрдирддрдо рд▓рд┐рдирдХреНрд╕ рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдЕрдм lunix рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред
рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ:
sudo qemu-system-x86_64 lunix_nokaslr.iso -s -enable-kvm
рджреВрд╕рд░реЗ рдореЗрдВ:
sudo gdb vmlinux.lunix (gdb) target remote localhost:1234
рд╣рдо
.text
рдЦрдВрдб рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:
рд╕реАрдорд╛рдПрдБ
0xffffffff81000000 - 0xffffffff81600b91
,
0xc1, 0xe6, 0x14, 0x44, 0x09, 0xe6
:
рд╣рдо рдкрддрд╛
0xffffffff810dc643
рдкрд░ рдЯреБрдХрдбрд╝рд╛
0xffffffff810dc643
ред рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдКрдкрд░ рдХреНрдпрд╛ рд╣реИ:
рдФрд░ рдпрд╣рд╛рдБ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд
0xffffffff810dc5d0
(рдХреНрдпреЛрдВрдХрд┐
retq
рдкрдбрд╝реЛрд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рд╣реИ)ред
5. рдЦреЛрдЬ рджреЗрд╡ / рд╕реЗ / рд╕рдХреНрд░рд┐рдп
Register_chrdev рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдпрд╣ рд╣реИ:
int register_chrdev (unsigned int major, const char * name, const struct fops);
рд╣рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдбрд┐рдмрдЧрд░ рдФрд░ QEMU рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ред рд╣рдордиреЗ
0xffffffff810dc5d0
рдкрд░
0xffffffff810dc5d0
рдмреНрд░реЗрдХ
0xffffffff810dc5d0
ред рдпрд╣ рдХрдИ рдмрд╛рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпреЗ рдбрд┐рд╡рд╛рдЗрд╕
mem, vcs, cpu/msr, cpu/cpuid
, рдФрд░ рдЙрдирдХреЗ рддреБрд░рдВрдд рдмрд╛рдж
activate
рд╣реИрдВред
рдирд╛рдо рдХреЗ рд╕реВрдЪрдХ рдХреЛ
rcx
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░
fops
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ
r8
:

рдореИрдВ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдКрдкрд░ рд╣реИ struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); };
рддреЛ,
write
рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдкрддрд╛
0xffffffff811f068f
ред
6. рд╣рдо рдкрдврд╝рд╛рдИ рд▓рд┐рдЦрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ
рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рд╣рд░ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХрд╛ рд╕рд╣реА рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджрд┐рдирдЪрд░реНрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧрдгрдирд╛ рдХреЗ рдмреНрд▓реЙрдХ рдирдЧреНрди рдЖрдВрдЦреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред
6.1ред рд╣реИрд╢ рдлрдВрдХреНрд╢рди
vmlinux.lunix
рдЖрдИрдбреАрдП рдЦреЛрд▓реЗрдВ, рдХрд░реНрдиреЗрд▓
vmlinux.lunix
рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд▓реЗрдЦрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рдЪрдХреНрд░ рд╣реИ:
рдХреБрдЫ
sub_FFFFFFFF811F0413
рдлрд╝рдВрдХреНрд╢рди рдХреЛ
sub_FFFFFFFF811F0413
, рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
рдФрд░ рдкрддреЗ рдкрд░
0xffffffff81829ce0
, sha256 рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдпрд╣реА рд╣реИ,
sub_FFFFFFFF811F0413
=
sub_FFFFFFFF811F0413
256ред рдмрд╛рдЗрдЯреНрд╕ рдЬрд┐рд╕рдХрд╛ рд╣реИрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
$sp+0x50+var49
рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо
$sp+0x50+var48
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реИрд╕реЗ,
var49=-0x49
,
var48=-0x48
, рдЗрд╕рд▓рд┐рдП
$sp+0x50+var49 = $sp+0x7
,
$sp+0x50+var48 = $sp+0x8
ред
рдЗрд╕реЗ рджреЗрдЦреЗрдВред
рд╣рдо qemu, gdb рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ,
0xffffffff811f0748 call sub_FFFFFFFF811F0413
рдкрд░ рд╕реЗрдЯ
0xffffffff811f0748 call sub_FFFFFFFF811F0413
рдФрд░ рдирд┐рд░реНрджреЗрд╢ рдкрд░
0xffffffff811f0748 call sub_FFFFFFFF811F0413
0xffffffff811f074d xor ecx, ecx
, рдЬреЛ рдлрдВрдХреНрд╢рди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╣реИред рдореЗрд▓
test@mail.ru
, рдкрд╛рд╕рд╡рд░реНрдб
1234-5678-0912-3456
test@mail.ru
ред
рдореЗрд▓ рдХрд╛ рдмрд╛рдЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ:
>>> import hashlib >>> hashlib.sha256(b"t").digest().hex() 'e3b98a4da31a127d4bde6e43033f66ba274cab0eb7eb1c70ec41402bf6273dd8' >>>
рдпрд╣реА рд╣реИ, рд╣рд╛рдБ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ sha256 рд╣реИ, рдХреЗрд╡рд▓ рдпрд╣ рдореЗрд▓ рдХреЗ рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдореЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдирд╣реАрдВред
рдлрд┐рд░ рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╣реИрд╢ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдпреЛрдЧ
0xEC
рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ
0xEC
рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рд╢реЗрд╖ рднрд╛рдЧ
0xEC
:
import hashlib def get_email_hash(email): h = [0]*32 for sym in email: sha256 = hashlib.sha256(sym.encode()).digest() for i in range(32): s = h[i] + sha256[i] if s <= 0xEC: h[i] = s else: h[i] = s % 0xEC return h
рд░рд╛рд╢рд┐
0xffffffff81c82f80
рдкрд░ рд╕рд╣реЗрдЬреА рдЬрд╛рддреА рд╣реИред рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐
test@mail.ru
рд╕реЗ рд╣реИрд╢ рдХреНрдпрд╛
test@mail.ru
ред
рд╣рдордиреЗ
ffffffff811f0786 dec r13d
рдкрд░ рдмреНрд░реЗрдХ
ffffffff811f0786 dec r13d
(рдпрд╣ рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рд╣реИ):
рдФрд░ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ:
>>> get_email_hash('test@mail.ru') 2b902daf5cc483159b0a2f7ed6b593d1d56216a61eab53c8e4b9b9341fb14880
рд▓реЗрдХрд┐рди рд╣реИрд╢ рдЦреБрдж рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рд╣реИред
6.2ред рдореБрдЦреНрдп рдкреАрдврд╝реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо
рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
рдпрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдХреА рдЕрдВрддрд┐рдо рдЧрдгрдирд╛ рд╣реИ:
0xFFFFFFFF811F0943 imul eax, r12d 0xFFFFFFFF811F0947 cdq 0xFFFFFFFF811F0948 idiv r10d
r12d
рдФрд░
r12d
рд╣реИрд╢ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ 9 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╢реЗрд╖ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреНрдпреЛрдВрдХрд┐
рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ keygen рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░реВрдВрдЧрд╛ред
6.3ред keygen
def keygen(email): email_hash = get_email_hash(email) pairs = [(0x00, 0x1c), (0x1f, 0x03), (0x01, 0x1d), (0x1e, 0x02), (0x04, 0x18), (0x1b, 0x07), (0x05, 0x19), (0x1a, 0x06), (0x08, 0x14), (0x17, 0x0b), (0x09, 0x15), (0x16, 0x0a), (0x0c, 0x10), (0x13, 0x0f), (0x0d, 0x11), (0x12, 0x0e)] key = [] for pair in pairs: i = pair[0] j = pair[1] key.append((email_hash[i] * email_hash[j])%9) return [''.join(map(str, key[i:i+4])) for i in range(0, 16, 4)]
рддреЛ, рдЪрд▓реЛ рдХреБрдЫ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ:
>>> import lunix >>> lunix.keygen("m.gayanov@gmail.com") ['0456', '3530', '0401', '2703']
рдФрд░ рдЕрдм рдЖрдк рдЖрд░рд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЦреЗрд▓ 2048 рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ :) рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдпрд╣рд╛рдБ рдХреЛрдб