Skip to content

Instantly share code, notes, and snippets.

@eterekhin
eterekhin / ssh_traffic_drop.md
Last active November 12, 2024 05:33
Drop excessive traffic on ssh port

Inspired by: http://web.archive.org/web/20130510023127/http://blog.bigdinosaur.org/securing-ssh-with-iptables/
When installing iptables-persistent package it asks to make your existing iptables configuration persistant, choose 'yes' twice

ssh_port=22;
sudo iptables -A INPUT -p tcp -m tcp --dport $ssh_port \
  -m state --state NEW \
  -m recent --set --name DEFAULT --rsource &&
sudo iptables -N LOG_AND_DROP &&
sudo iptables -A INPUT  -p tcp \
  -m tcp --dport $ssh_port -m state --state NEW \
@eterekhin
eterekhin / aes_cbc_ctr.cpp
Created October 21, 2024 07:34
AES CBC and AES CTR decryption
#include <iostream>
#include "include/cryptopp/aes.h"
#include "include/cryptopp/ccm.h"
#include "include/cryptopp/filters.h"
constexpr uint32_t size_of_aes_block = 16;
uint32_t get_rounds_number(const std::vector<CryptoPP::byte>& encoded_data)
{
@eterekhin
eterekhin / Pro Git.md
Created October 8, 2023 11:12
Pro Git

Version control systems before Git

  1. Local. All changes remain on a developer's machine. Changes tracking is handled by a database, that stores history of a file as a serias of revisions(or diff deltas). RCS (Revision Control Systems) is an example
  2. Centralized. There's one remote server which stores the code. Clients (developers) can pull the changes and push them, but they don't have history on their local machines, it's stored on the server. Downside of this approach is centralization. If the remote server is corrupted you may lose all the history. If the server goes down for a while you can't use version control system until it's back alive. Examples of a such approach are CVS, Subversion and Perforce
  3. Distributed. All changes are mirrored to the clients. In case of a remote server downtime you can keep working locally and push the changes when the server is back alive. If the data on the server is lost, clients have the actual data (may be not the latest ver
@eterekhin
eterekhin / LINUX_1.md
Last active November 16, 2022 09:02
LINUX_1

How to play around:

Having docker installed run

docker run -it ubuntu:22.04

After this command you'll get working no-frills ubuntu shell

So, now let's play around it

First of all I want to explore which utils are available in /bin directory. So let's execute ls /bin. We'll see bunch of utils. Also you can check out /usr/bin directory because it also provides some utils to work with (why do we need both with file-duplicates?)

RSP - указатель на вершину текущего фрейма RBP - указатель на основание текущего фрейма RIP - указатель на следующую инструкцию

In - контравариантность, такое обозначение используется, для приведения вверх по цепочке наследования generic'a

Out - контравариантность, такое обозначение используется, для приведения вниз по цепочке наследования generic'a

Интересный момент

 public interface TestOut

Binary Serializator

Опишем бинарную сериализацию на примере BinaryFormatter'a. А далее приведу пример более современных и безопасных сериализаторов

    [Serializable]
    internal sealed class Customer
    {
        public string Name { get; set; }
 }

Представление float и double в памяти. Точность float и double. IEEE - 754 стандарт.

float и double представляются в формате IEEE-754. Это формат предложенный Intel в 70 годах 20 века. Число в таком формате представлено знаком(sign), порядком(exponent) и мантиссой(mantissa). Float в таком формате кодируется семью битам порядка и 23 битами мантиссы.

Например, число 12.5 можно представить в экспоненциальном виде несколькоми способами, 12.5 = 0.125e+2 , 12.5 = 1.25e+1. 12.5 = 125e-1. Первое из трех представлений называется нормализованным, потому что мантисса попадает в интервал 0.1 < 0.125 < 1. Это признак нормализованности.

Если расчеты проводятся в двоичной системе, то первая цифра мантиссы всегда будет 1, поэтому можно хранить эту цифру в памяти, и дописывать каждый раз, когда производятся расчеты. Мы будем считать, что эта единица добавляется как целая часть перед мантиссой как дробной частью, пример : 12.5 = 1100.1 = 1.1001e+3 . Мантисса = 1.1001, в память будет записано только 1001, единица перед з

Пример использования Expression.Block:

          /* (a, b, op) => {
                    int result;
                    switch(op)
                        {
                          case Op.Add:
                            result = a+b;
                            break;

Как реализована поддержка dynamic

в .net есть поддержка во время компиляции и исполнения. Во время компиляции на месте dynamic вызовов генерируется создания CallSite экземпляров, пример:

Создается singleton, который переиспользуется при последующих вызовах. В автосгенерированном коде происходит вызов CallSite.Create, единсвенным параметром передается CallSiteBinder. Он может быть разным взависимости от обращения с dynamic объектом, в нашем случае это CSharpInvokeMemberBinder.

Также создается массив CSharpArgumentInfo, аргументы которые используются в динамической операции, у нас их три, первый this, второй константа (CSharpArgumentInfoFlags.UseCompileTimeType | CSharpArgumentInfoFlags.Constant), тип разрешен на этапе компиляции. Третий параметр Name равен null. Чтобы он был не null, нужно воспользоваться именованными параметрами.