- ОС Linux как мост (gateway) между локальной сетью и Internet
- Костарев Алексей Федорович, kaf@terem.perm.su
- 1. Введение
- 2. Функции моста (gateway)
- 3. Настройка ядра ОС Linux
- 3.1 Начальные установки
- 3.2 Включение возможностей маршрутизации пакетов, защиты сети (screening router) и подсчета IP-статистики (account)
- 3.3 Настройка сетевых драйверов
- 3.4 Сборка ядра
- 4. Настройка программного обеспечения
- 4.1 Настройка интерфейсов
- 4.2 Настройка routing’а
- 4.3 Настройка nameserver’а
- 4.4 Настройка зашиты
- 5. Заключение
- 1 Введение
- 2 Функции моста (gateway)
- 3 Настройка ядра ОС Linux
- 3.1 Начальные установки
- 3.2 Включение возможностей маршрутизации пакетов, защиты сети (screening router) и подсчета IP-статистики (account)
- 3.3 Настройка сетевых драйверов
- 3.4 Сборка ядра
- 4 Настройка программного обеспечения
- 4.1 Настройка интерфейсов
- Настройка локального интерфейса lo
- Настройка интерфейса платы Ethernet локальной сети (eth0)
- Интерфейс для серийного порта — SLIP/CSLIP (sl0) или PPP (ppp0)
- 4.2 Настройка routing’а
- 4.3 Настройка nameserver’а
- 4.4 Настройка зашиты
- Screening routing
- Выключение серверов на локальным машинах
- Wrapping
- 5 Заключение
- Explains: Linux linux-gate.so.1 Library / Dynamic Shared Object [ vdso ]
- Меня попросили взломать программу на собеседовании
ОС Linux как мост (gateway) между локальной сетью и Internet
Костарев Алексей Федорович, kaf@terem.perm.su
В документе описана настройка ОС Linux для подключения локальной сети к сети Internet
1. Введение
2. Функции моста (gateway)
3. Настройка ядра ОС Linux
3.1 Начальные установки
3.2 Включение возможностей маршрутизации пакетов, защиты сети (screening router) и подсчета IP-статистики (account)
3.3 Настройка сетевых драйверов
3.4 Сборка ядра
4. Настройка программного обеспечения
4.1 Настройка интерфейсов
4.2 Настройка routing’а
4.3 Настройка nameserver’а
4.4 Настройка зашиты
5. Заключение
1 Введение
В данном документе мы рассмотрим вариант подключения локальной сети через один серийный интерфейс к одному IP-провайдеру — наиболее часто встречающийся вариант подключения к сети Internet.
Данное руководство справедливо для версий ядра 1.2.8 — 1.2.13 Новые эксперементальные ядра 1.3. позволяют Вам обеспечить дополнительные возможности (Mobile-IP, IP-masquarading и т п) но в настоящее время являются эксперементальными.
Рассматриваемый тип дистрибутива — Slackware v 3.0.0. Для других типов дистрибуции (RED HAT, CALDERA и т п) необходимо сделать корректировку на другой способ инициализации системы (выход в мультирежим — каталог /etc/rc.d/. ), набора команд команд поддержки TCP/IP и т п.
2 Функции моста (gateway)
Мост между локальной сетью и Internet выполняет следующие функции:
- Поддержка постоянной (или по требованию) связи с IP-провайдером
- Маршрутизация IP пакетов между локальной сетью и сетью Internet (routing) для выхода локадьных пользователей в сеть Internet.
- Обеспечение IP-сервиса (ftp,telnet,talk и т п) для пользователей локальной сети и сети Internet
- Обеспечение защиты от несанкционированного доступа к локальной сети из сети Internet
3 Настройка ядра ОС Linux
3.1 Начальные установки
Как правило во всех дистрибутивах ОС Linux ядро собрано так, что оно не работает как router (маршрутизатор пакетов) между разными сетями, не поддерживает механизм защиты (firewall) маршрутизируемых пакетов и подсчета статистики. Кроме того выбранное вами первоначальное ядро может не содержать необходимых драйверов для поддержки сетевых плат и содержит набор драйверов не нужных Вам для работы.
Поэтому Вам необходимо будет собрать новое ядро, включив в него необходимые функции и драйвера для работы в качестве gateway.
Для сборки ядра Вам необходимо установить в систему исходные тексты ядра (дискеты K в Slackware v 3.0.0, или дискеты D в предыдущих версиях Slackware).
После установки перейдите в каталог /usr/src/linux и запустите команду
Установите необходимые параметры в секциях General Setup , IDE Drivers . Ответьте y на вопрос
3.2 Включение возможностей маршрутизации пакетов, защиты сети (screening router) и подсчета IP-статистики (account)
В секции Networking options Ответьте утвердительно на следующие вопросы:
3.3 Настройка сетевых драйверов
В секции Network device support ответьте y на вопрос
Если вы не установили режима динамически загружаемых драйверов или Ваш драйвер сетевой платы не является динамически загружаемым, то Вам необходимо включить его (их) во время генерации системы.
Минимально необходимый набор драйверов:
- Для серийной (модемной) линии Вам надо включить либо SLIP, CSLIP драйверы либо PPP драйвер. Тип драйвера уточните у Вашего IP-провайдера.
- Для локальной (ethernet) сети один из сетевых драйверов (часть драйверов находится в подпунктах
Do you want to be offered ALPHA test drivers (CONFIG_NET_ALPHA)
Other ISA cards (CONFIG_NET_ISA).
3.4 Сборка ядра
После ответа на все вопросы запустите команды:
Если Вы установили режим динамически загружаемых драйверов, то запустите команды сборки и установки этих драйверов:
После сборки ядра перепишите его в корневой катагог под любым удобным для Вас именем (например: linuxroute) :
После этого перезагрузите машину и попробуйте загрузить новое ядро. Если все прошло успешно — переходите к настройке программного обеспечения.
4 Настройка программного обеспечения
4.1 Настройка интерфейсов
Для каждого сетевого устройства (серийная линия с модемом, Ethernet плата) Вы должны подключить драйвер (на этапе сборки ядра или динамически) и установить интерфейс.
Динамическое подключение драйверов и устнановка интерфейса для устройств, как правило производится в файле /etc/rc/rc.inet1.
Для динамического подключения драйвера необходимо в файл rc.inet1. добавить команду(ы):
Интерфейсом с точки зрения ОС является устройство через которое система получает и передает IP-пакеты. Каждое устройство (не вся машина) имеет свой IP-адрес. Интерфейс для устройства устанавливается командой ifconfig.
В файле rc.inet1 Вы должны установить следующие интерфейсы:
- Локальный интерфейс (lo). Настройка этого интерфейса, как правило, автоматически включается в файл rc.inet1 при установке дискет N 1-4 (TCP/IP) ОС Linux.
- Интерфейс для платы Ethetnet (eth0).
- Интерфейс для серийного порта — SLIP/CSLIP (sl0) или PPP (ppp0) в зависимости от возможностей IP-провайдера.
Настройка локального интерфейса lo
Настройка локального интерфейса автоматически включается в файл rc.inet1 после установки TCP/IP. Локальный интерфейс устанавливается командой:
Например, чтобы проверить правильность установки TCP/IP, наберите команду:
Чтобы проверить правильность работы IP-серверов используйте для IP-клиентов адрес локального интерфейса: 127.0.0.1. Например, для проверки работы ftp-сервера, наберите команду
Настройка интерфейса платы Ethernet локальной сети (eth0)
Для связи с локальной сетью как правило используют одну или несколько плат Ethernet. Драйвер платы должен быть подключен в ядро, либо на этапе сборки ядра (см. выше), либо командой подключения динамически загружаемых драйверов:
Ядро именует драйверы Ethernet как eth0, eth1 и т. д.
Для конфигурации интерфейса Вам надо знать :
- IP-номер машины в сети
- Широковещательный адрес (BROADCAST)
- маску подсети (subnetmask)
В файле rc.inet1 после инсталляции уже есть закомментированные строки с настройкой интерфейса. Вам надо лишь определить вышеперечисленые переменные и раскомментировать строки:
Интерфейс для серийного порта — SLIP/CSLIP (sl0) или PPP (ppp0)
Для работы по серийному порту Вы можете использовать как SLIP (Serial Line Interface Protocol) с его модификацией CSLIP (Compressed Serial Line Interface Protocol), так и PPP (Point To Point) протокол.
PPP-протокол (программа pppd) является более сложным — он позволяет проверять достоверность входа для коммутируемых линий, поддерживает не только IP-протокол но и другие.
SLIP/CSLIP — протокол является более простым и удобным в настройке и часто используется для выделенных линий.
В данной работе мы рассмотрим настройку SLIP/CSLIP протокола для работы по выделенной линии через модемы.
Наиболее популярной программой для работу по протоколу SLIP/CSLIP по модему является dip (DialUpIP). Она позволяет использовать модем как по выделенной так и по комутируемой линии и производить настройки скорости соединения, IP-адресов, процедуры входа и т. п.
Основная проблема в программой dip состоит в том, что при вызове она становится фоновым процессом и после падения линии снимается без повторного запуска так что очень трудно отследить падение линии и перезапустить процесс соединения. Для решения этой проблемы в данном примере используется модифицированая программа dip, которая не уходит в фоновый процесс и вы можете легко ее перезапустить после падения линии, написав процедуру на языке shell:
Файл конфигурации описывает номер порта, скорость работы модема, локальный и удаленый IP-адрес интерфейса и т. п. Пример файла конфигурации приведен ниже:
4.2 Настройка routing’а
Настройка routing’а (маршрутизации пакетов между интерфейсами) может быть как статической (однократно настраиваемая таблица), так и динамической.
Динамическая настройка бывает необходима в том случае, если у Вас сложная, постоянно меняющаяся структура сети и одна и та же машина может быть доступна по различным интерфейсам (например через разные Ethernet или SLIP интерфейсы). Для динамической настройки routing’а служат команды routed и gated.
Как правило в большинстве ситуаций бывает достаточно статической настройки интерфейса командой route.
Настройка routing’а производится в файле rc.inet1. Как правило Вам бывает необходимо настроить routing по вышеперечисленным трем интерфейсам:
- Локальный интерфейс (lo).
- Интерфейс для платы Ethetnet (eth0).
- Интерфейс для серийного порта — SLIP/CSLIP (sl0).
Локальный инерфейс поддерживает сеть с IP-номером 127.0.0.1 . Поэтому для машрутизации пакетов с адресом 127. используется команда :
Если у Вас для связи с локалной сетью используется одна плата Ethernet и все машины находятся в этой сети (сетевая маска 255.255.255.0), то для настройки routing’а достаточно вызвать:
Настройку routing’а по интерфейсу SLIP/CSLIP производит команда dip, вызывая при установлении связи команды ifconfig и route.
4.3 Настройка nameserver’а
Если Вы не собираетесь заводить поддержку сервиса имен для свой сети (что является довольно сложной организациооной и технической проблемой) и доверяете ведение своих имен Вашему IP-провайдеру, то Вам достаточно указать в файле /etc/resolv.conf адрес nameserver’а вашего провайдера:
4.4 Настройка зашиты
Защита локальной сети от взлома осуществляется следующими способами:
- запретом роутирования (машрутизации) указанных пакетов с одного интерфейса на другой (screening routing).
- выключение серверов на локальным машинах
- закрытие или ограничение доступа к серверам на локальных машинах (wrapping).
Screening routing
Данный режим защиты использует возможности ядра Linux блокировать указанные пакеты при их передаче (forwarding) с одного интерфейса на другой. Эти возможности включаются при конфигурации ядра (make config — см.выше) с параметрами:
Преимущество данного метода состоит в том, что Вы можете на одной машине (gateway между локальной сетью и Internet’ом) защитить всю локальную сеть, не защищая каждую мащину в отдельности.
Для того чтобы включить защиту Вам необходимо воспользоваться программой настройкой защиты ipfwadm.
В 90% случает бывает достаточно закрыть TCP-порты c 1-го по 1024 для запреты доступа к основным TCP-серверам и порты с 5000 по 65535 для запреда доступа с X-серверам, оставив порты 1025-4999 для работы программ-клиентов локальной сети. Если Вы хотите открыть доступ клиентам Internet к Вашим серверам (ftp,http и т п) (предварительно тщательно проверив защиту), то вы можете оставить открытыми соответствующие порты (см. /etc/service).
Все команды защиты Вы можете записать в отдельный командный файл (например /etc/rc.d/rc.firewall) и вызывать его при выходе системы в мультирежим из файла /etc/rc.d.rc.inet1.
Пример файла настройки защиты:
Выключение серверов на локальным машинах
Для того чтобы полностью закрыть доступ на локальной машине (речь идет о UNIX-машинах) к определенному сервису (например telnetd) достаточно в файле /etc/inetd.conf закомментировать строчку запуска данного сервера. В отличие от защитычерез firewall
- Вам необходимо подправить файл /etc/inetd.conf на всех локальных машинах
- Вы закрываетет доступ к серверу не только Internet’овских пользователей но и локальных.
Если Вы хотите лишь огранчить доступ к серверу, не выключая его, то Вам надо настроить TCP-wrapper (см. следующий раздел).
Wrapping
В ОС Linux при обращении из сети к TCP-порту суперсервер inetd вызывает не сам сервер, а программу tcpd, передавая ей параметром имя необходимого сервера (см. файл /etc/inetd.conf). Программа tcpd определяет IP-адрес клиента ищет этот адрес для указанного сервиса в файлах /etc/hosts.allow и /etc/hosts.deny. Если адрес найден в файле /etc/hosts.allow — клиенту разрешается доступ к указанному серверу, если же адрес найден в файле /etc/hosts.deny, то клиент не получает доступ к серверу. Например, если Вы хотите открыть доступ на сервер telnetd только с одной машины Вы добавляете в файл /etc/hosts.deny строку:
5 Заключение
Для более подробного ознакомления Вам следует ознакомиться с документацией через команду:
Источник
Explains: Linux linux-gate.so.1 Library / Dynamic Shared Object [ vdso ]
I ‘m using the ldd command to get information about /usr/local/nginx/sbin/nginx binary and I see linux-gate.so.1 library. However, I’m unable to find out this file anywhere on the system? What is linux-gate.so.1 and how do I copy this file?
linux-gate.so.1 is nothing but the Linux Virtual Dynamic Shared Object. This file only exists in each executables address space. In other words you don’t have to copy or worry about this file as it is a virtual library. According to this article:
This virtual library provides the necessary logic to allow user programs to access system functions through the fastest means available on the particular processor, either interrupt, or with most newer processors, fast system call.
This VDSO exposed by the kernel at a fixed address in every process’ memory:
cat /proc/self/maps
Sample outputs:
- No ads and tracking
- In-depth guides for developers and sysadmins at Opensourceflare✨
- Join my Patreon to support independent content creators and start reading latest guides:
- How to set up Redis sentinel cluster on Ubuntu or Debian Linux
- How To Set Up SSH Keys With YubiKey as two-factor authentication (U2F/FIDO2)
- How to set up Mariadb Galera cluster on Ubuntu or Debian Linux
- A podman tutorial for beginners – part I (run Linux containers without Docker and in daemonless mode)
- How to protect Linux against rogue USB devices using USBGuard
Join Patreon ➔
See this blog post which explains linux-gate.so.1 vdso in the details.
🐧 Get the latest tutorials on Linux, Open Source & DevOps via
Источник
Меня попросили взломать программу на собеседовании
TL;DR Меня попросили взломать программу на собеседовании. И я получил работу.
Я собеседовался на позицию инженера программной безопасности, они спрашивали в основном разные низкоуровневые вещи. Некоторые ответы я знал, некоторые нет.
Потом они прислали email с защищённым и зашифрованным бинарником, который нужно было взломать.
Когда я добрался до дома, я скачал его и увидел, что он спрашивает пароль. Они хотели, чтобы я нашёл этот пароль.
Вот что я увидел при первом запуске:
*** DOOR CONTROL SYSTEM ***
Я напечатал три раза какие-то глупые слова, и программа закрылась.
У меня ещё есть инструменты в запасе для анализа. Давайте соберём побольше информации о файле.
# file CrackTheDoor
CrackTheDoor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0x9927be2fe310bea01d412164103b9c8b2d7567ea, not stripped
root@lisa:
Окей, теперь мы знаем немного больше о бинарнике.
# ldd CrackTheDoor
linux-gate.so.1 => (0xf777b000)
libc.so.6 => /lib32/libc.so.6 (0xf760c000)
/lib/ld-linux.so.2 (0xf777c000)
root@lisa:
Ничего необычного. Объясню немного. linux-gate.so вы можете не найти в своей файловой системе. Но ldd показывает его как общую библиотеку. Это Virtual DSO.
Итак, вы знаете о linux-gate.so.1.
Возможно вы также знаете, что libc.so.6 это основная C библиотека для GNU систем.
ld-linux.so это загрузчик динамических библиотек в linux.
Запустим программу в отладчике и посмотрим что произойдёт.
# gdb CrackTheDoor
GNU gdb (GDB) 7.4.1-debian
Copyright © 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type «show copying»
and «show warranty» for details.
This GDB was configured as «x86_64-linux-gnu».
For bug reporting instructions, please see:
…
Reading symbols from /root/CrackTheDoor. (no debugging symbols found). done.
(gdb) r
Starting program: /root/CrackTheDoor
Program received signal SIGSEGV, Segmentation fault.
0x080484fb in __do_global_dtors_aux ()
(gdb)
Программа упала. Это значит, что в ней должны быть какие-то антиотладочные трюки. Окей…
Запустим её снова и посмотрим точку входа программы.
# gdb CrackTheDoor
GNU gdb (GDB) 7.4.1-debian
Copyright © 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type «show copying»
and «show warranty» for details.
This GDB was configured as «x86_64-linux-gnu».
For bug reporting instructions, please see:
…
Reading symbols from /root/CrackTheDoor. (no debugging symbols found). done.
(gdb) info file
Symbols from «/root/CrackTheDoor».
Local exec file:
`/root/CrackTheDoor’, file type elf32-i386.
Entry point: 0x804762c
…
.
Поставим breakpoint на точку входа и начнём отладку:
Затем нажмём «r» для запуска. Окажемся на первой строке точки входа программы:
gdb) x/30i $pc
=> 0x804762c: pusha
0x804762d: mov $0xaa,%dl
0x804762f: mov $0x8048480,%edi
0x8047634: mov $0x8048cbc,%ecx
0x8047639: mov %edi,0x80476f3
0x804763f: mov %ecx,0x80476f7
0x8047645: sub %edi,%ecx
0x8047647: mov $0x804762f,%esi
0x804764c: push $0x80476c1
0x8047651: pusha
0x8047652: mov $0x55,%al
0x8047654: xor $0x99,%al
0x8047656: mov $0x8047656,%edi
0x804765b: mov $0x80476e5,%ecx
0x8047660: sub $0x8047656,%ecx
0x8047666: repnz scas %es:(%edi),%al
0x8047668: je 0x804770a
0x804766e: mov %edi,0x80476eb
0x8047674: popa
0x8047675: add 0x80476eb,%edx
0x804767b: ret
Должно выглядеть как-то так. Можно выбрать синтаксис между AT&T и Intel версиями. Мне больше нравится Intel.
По адресу 0x8047654, мы присваиваем 0x55 al регистру, а затем XOR’им его с 0x99 получая 0xCC.
0xCC это очень важно, так как это означает остановку процесса. Когда отладчик хочет прервать выполнение программы, он заменяет байты на 0xCC в том месте, где хочет её остановить.
По адресу 0x8047666, мы видим repnz scas; это означает поиск участка памяти, ограниченного es и edi, на предмет значения в al(0xCC).
Итак, эти строчки просто сканируют память, и если там есть 0xCC, программа прекращает выполнение.
Не хочу тратить слишком много времени тут. Запустим strace:
# strace ./CrackTheDoor
execve(«./CrackTheDoor», [«./CrackTheDoor»], [/* 17 vars */]) = 0
[ Process PID=31085 runs in 32 bit mode. ]
brk(0) = 0x9972000
access(«/etc/ld.so.nohwcap», F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xfffffffff7715000
access(«/etc/ld.so.preload», R_OK) = -1 ENOENT (No such file or directory)
open(«/etc/ld.so.cache», O_RDONLY) = 3
fstat64(3,
mmap2(NULL, 35597, PROT_READ, MAP_PRIVATE, 3, 0) = 0xfffffffff770c000
close(3) = 0
access(«/etc/ld.so.nohwcap», F_OK) = -1 ENOENT (No such file or directory)
open(«/lib32/libc.so.6», O_RDONLY) = 3
read(3, «\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300o\1\0004\0\0\0». 512) = 512
fstat64(3,
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xfffffffff770b000
mmap2(NULL, 1456504, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xfffffffff75a7000
mprotect(0xf7704000, 4096, PROT_NONE) = 0
mmap2(0xf7705000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15d) = 0xfffffffff7705000
mmap2(0xf7708000, 10616, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xfffffffff7708000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xfffffffff75a6000
set_thread_area(0xffe4d864) = 0
mprotect(0xf7705000, 8192, PROT_READ) = 0
mprotect(0x8049000, 4096, PROT_READ) = 0
mprotect(0xf7733000, 4096, PROT_READ) = 0
munmap(0xf770c000, 35597) = 0
ptrace(PTRACE_TRACEME, 0, 0x1, 0) = -1 EPERM (Operation not permitted)
ptrace(PTRACE_TRACEME, 0, 0x1, 0) = -1 EPERM (Operation not permitted)
Судя по последним двум строчкам, программа упала опять. Из-за системного вызова ptrace.
Ptrace — это аббревиатура для «Process Trace». При помощи ptrace вы можете контролировать другой процесс меняя его состояние, как это делают отладчики.
Отладчики очень интенсивно используют ptrace. Это их работа.
Код для такого участка может выглядеть примерно так:
Кстати, вы можете сделать ptrace[PTRACE_TRACEMe] только один раз, так что если отладчик вызвал ptrace на нашей программе до этого, то наш вызов вернёт false и мы поймём, что кто-то контролирует программу извне.
Нам нужно обойти защиту на ptrace чтобы программа не думала, что мы пытаемся её отлаживать.
Мы заменим результат системного вызова.
Мы будем определять когда программа вызывает ptrace и возвращать ноль.
В домашней папке я создал новый .gdbinit файл. Следовательно, каждый раз когда я запускаю gdb, конфигурация будет загружаться автоматически.
/.gdbinit
set disassembly-flavor intel # Intel syntax is better
set disassemble-next-line on
catch syscall ptrace #Catch the syscall.
commands 1
set ($eax) = 0
continue
end
В eax будет результат системного вызова. И он всегда будет 0, что означает истину в нашем случае.
Таким образом мы обошли защиту от отладки и можем вернуться к gdb.
$ gdb ./CrackTheDoor
GNU gdb (GDB) 7.4.1-debian
Copyright © 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type «show copying»
and «show warranty» for details.
This GDB was configured as «x86_64-linux-gnu».
For bug reporting instructions, please see:
…
Catchpoint 1 (syscall ‘ptrace’ [26])
Reading symbols from /home/eren/CrackTheDoor. (no debugging symbols found). done.
(gdb) r
Starting program: /home/eren/CrackTheDoor
Catchpoint 1 (call to syscall ptrace), 0x08047698 in ?? ()
=> 0x08047698: 3d 00 f0 ff ff cmp eax,0xfffff000
Catchpoint 1 (returned from syscall ptrace), 0x08047698 in ?? ()
=> 0x08047698: 3d 00 f0 ff ff cmp eax,0xfffff000
*** DOOR CONTROL SYSTEM ***
Я поставил breakpoint на PJeGPC4TIVaKFmmy53DJ
Эта часть интересна. Я вижу манипулирование константами и то, что к подающимся данным на вход применяется XOR констант. Продолжим…
И оставшаяся часть функции:
Видите ли вы те же закономерности, что вижу я? Если нет — не беда.
Здесь в программе проверяется мой ввод поксоренный с константами.
Теперь ещё раз посмотрим на ввод, первые байты ксорятся с некоторыми константами, и затем вывод сравнивается с другими костантами.
Последние две функции должны выглядеть как-то так:
Я набросал скрипт на Python чтобы применить XOR к этим константам и нашёл ключ:
*** DOOR CONTROL SYSTEM ***
Компания прислала мне вторую часть, так что вскоре я напишу ещё одну статью.
Источник