Мини заметки — выпуск 7

7 августа 2012

Темы седьмого выпуска: скрипт для загрузки картинок на Yfrog, получение паролей из адресного пространства процесса в UNIX, обфускация кода в Perl, регулярное выражение для валидации JSON и не только. Предыдущие выпуски: первый, второй, третий, четвертый, пятый и шестой.

1. Скрипт загрузки картинок на Yfrog

Честно говоря, поначалу я думал написать отдельный модуль и залить его на CPAN, но потом оказалось, что тут кода-то всего на тридцать строк:

#!/usr/bin/env perl

use strict;
use warnings;
use LWP;

# yfrog-uplaod.pl v 0.1
# (c) Alexandr A Alexeev 2012 | http://eax.me/

my $file = $ARGV[0] or die "Usage: $0 <fname>\n";

my $host = int(rand(9)) + 1;
my $ua = LWP::UserAgent->new();
my $res = $ua->post(
     "http://iload$host.imageshack.us/upload_api.php",
     [
       key => '015EFMNVfe7f6f7e93cb4a7b0a41e19956ce59f8',
       Filedata => [$file],
     ],
     Content_Type => 'form-data',
  );

if($res->is_success &&
   $res->decoded_content =~ m!<image_link>(.*?)</image_link>!) {
  print "[+] OK\n";
  print "image_link:\t$1\n";
  $res->decoded_content =~ m!<yfrog_link>(.*?)</yfrog_link>!;
  print "yfrog_link:\t$1\n";
} else {
  print "[-] Failed\n";
}

Короткую ссылку можно использовать в Twitter, длинную — на форумах и в блогах.

2. Как в X11 переключиться на другой монитор

Выводит список мониторов и доступных режимов:

xrandr

Включаем вывод на монитор VGA:

xrandr --output VGA --auto

Выключаем вывод на монитор LVDS:

xrandr --output LVDS --off

Меняем разрешение для монитора VGA:

xrandr --output VGA --mode 1680x1050

Чтобы картинка не растягивалась:

xrandr --output VGA --mode 1680x1050 --scale 1x1

Также можно разделить картинку между несколькими мониторами:

xrandr --output LVDS --left-of VGA --auto

Чтобы не увидеть сообщение об ошибке вроде такого:

xrandr: screen cannot be larger than 1280x1280 (desired size 2560x960)

… нужно подправить xorg.conf.

3. Что делать, если в Ubuntu у окон пропали заголовки?

В Xubuntu нужно сказать:

xfwm4 --replace

В других убунтах вместо xfwm используется metacity или compiz. Соответствующий менеджер окон нужно запустить с ключом --replace. Если же менеджера окон нет вообще (например, он был случайно удален), его нужно установить. Это удобно сделать, перейдя в консоль путем нажатия Ctr+Alt+F1. Вернуться в X11 можно с помощью сочетания Ctr+Alt+F7.

4. Отключение гостевого входа в Xubuntu

По умолчанию в Xubuntu разрешен гостевой вход в систему. Для отключения этой возможности нужно отредактировать файл /etc/lightdm/lightdm.conf следующим образом:

[SeatDefaults]
user-session=xubuntu
greeter-session=lightdm-gtk-greeter
allow-guest=false

Обратите особое внимание на последнюю строчку. После перезагрузки системы войти под гостем уже не удастся.

5. Как получить пароли из адресного пространства процесса

Получаем ID процесса:

ps wuax | grep mail-notification

Аттачимся к процессу с помощью отладчика GDB:

sudo gdb --pid 5075

(gdb) generate-core-file
(gdb) detach
(gdb) q

Пароль скорее всего хранится в памяти где-то рядом с именем пользователя:

sudo strings core.5075 | grep -C 3 'afiskon'

В выводе получим несколько десятков строк, напоминающих пароль — осталось попробовать их все по очереди.

В Ubuntu для выполнения такого приема нужно иметь права суперпользователя, а вот в CentOS достаточно просто быть владельцем процесса. Во FreeBSD с настройками по умолчанию примем не сработает, ибо отключен procfs.

6. Обфускация кода на Perl

Можно вбить в адресной строки браузера http://perlobfuscator.com/ (см также разъяснения относительно так называемого «сжатия») или же воспользоваться модулем Acme::EyeDrops:

perl -MAcme::EyeDrops=sightly -le 'print sightly({SourceFile=>"x.pl"})'

См также заметку Как написать неплохой обфускатор.

7. Debian — пишем простенький init.d скрипт

Создаем файл /etc/init.d/common следующего содержания:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          common
# Required-Start:    $syslog
# Required-Stop:     $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Short description
# Description:       Description...
### END INIT INFO

case "$1" in
  start)
    ifconfig eth0 down
    ifconfig eth0 hw ether 00:11:22:33:44:55
    ifconfig eth0 up
    ;;
  stop)
    ;;
  *)
    echo "Usage: /etc/init.d/common {start|stop}"
    exit 1
    ;;
esac

exit 0

Как видите, этот скрипт меняет MAC-адрес сетевой карты во время загрузки системы (в комментариях подсказывают, что пример неудачный). Меняем права доступа и добавляем скрипт на автозапуск:

sudo chmod 755 /etc/init.d/common
sudo update-rc.d common defaults

Удаляем скрипт из автозапуска:

sudo update-rc.d -f common remove

См также wiki-страничку How to LSBize an Init Script на debian.org, и еще скрипт для автозапуска веб-сервера starman, что не так давно проскакивал в рассылке Moscow.PM.

8. Если вы не помните приоритеты операторов в Perl

… то оцените следующий прием по достоинству:

perl -MO=Deparse,-p -e 'print $x * $y - $z && $xx || $yy ^ ! $zz'

Вывод:

print((((($x * $y) - $z) && $xx) || ($yy ^ (!$zz))));

Как видите, вместо того, чтобы учить приоритеты операторов можно просто запомнить приведенную выше команду.

9. Как изменить яркость экрана в Debian/Ubuntu

Очень просто:

sudo setpci -s 00:02.0 F4.B=99

Подробности, как обычно, в манах.

10. Регулярное выражение для валидации JSON

А это регулярное выражение я решил тупо скопипастить со StackOverflow:

sub JSON { # http://stackoverflow.com/a/3845829
  qr/
  (?(DEFINE)
     (?<number>   -?(?= [1-9]|0(?!\d) ) \d+ (\.\d+)?([eE] [+-]? \d+)?)    
     (?<boolean>   true | false | null )
     (?<string>    " ([^"\\\\]* | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* " )
     (?<array>     \[  (?:  (?&json)  (?: , (?&json)  )*  )?  \s* \] )
     (?<pair>      \s* (?&string) \s* : (?&json)  )
     (?<object>    \{  (?:  (?&pair)  (?: , (?&pair)  )*  )?  \s* \} )
     (?<json>   \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* )
  )
  \A (?&json) \Z
  /six  
}

В модуле Regexp::Constant, если что, такого нет.

Дополнение: Мини заметки — выпуск 8

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.