← На главную

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

Темы седьмого выпуска: скрипт для загрузки картинок на 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 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