Интересный вопрос сегодня залетел:
Давай посмотрим что происходит в кишках в это время. Давненько мы с тобой в
ㅤ
Предположим есть bash скрипт с функциями:
functions.sh
И основной скрипт, который сорсит файл с функциями:
test_script.sh
Не забываем сделать:
Запускаем
И видим:
То есть в контексте скрипта
При втором вызове функции всё считалось из памяти.
Если бы файл
Грубо говоря при каждом запуске
Вроде очевидно, но порой заставляет задуматься.
Изучай!
tags: #bash #debug #linux
—
🔔 @bashdays➡️ @gitgate
Если функции, вынесены в файл, подключенный через source, bash каждый раз его будет открывать/перечитывать при обращении к функции? Или как-то считает в память и все?
Давай посмотрим что происходит в кишках в это время. Давненько мы с тобой в
strace не смотрели.ㅤ
Предположим есть bash скрипт с функциями:
functions.sh
#!/bin/bash
bashdays_function() {
echo "Hello from BashDays"
}
И основной скрипт, который сорсит файл с функциями:
test_script.sh
#!/bin/bash
source ./functions.sh
bashdays_function
bashdays_function
Не забываем сделать:
chmod +x test_script.shЗапускаем
test_script.sh под контролем strace:strace -e trace=openat ./test_script.sh
И видим:
openat(AT_FDCWD, "./test_script.sh", O_RDONLY) = 3
openat(AT_FDCWD, "./functions.sh", O_RDONLY) = 3
Hello from BashDays
Hello from BashDays
То есть в контексте скрипта
test_script.sh, файл с функциями был прочитан один раз.При втором вызове функции всё считалось из памяти.
Если бы файл
functions.sh читался каждый раз, то мы увидели бы несколько строчек openat(AT_FDCWD).Грубо говоря при каждом запуске
test_script.sh, подключенный файл через source будет прочитан один раз.Вроде очевидно, но порой заставляет задуматься.
Изучай!
tags: #bash #debug #linux
—
Please open Telegram to view this post
VIEW IN TELEGRAM
16 66 25
Здрасти. Как-то я писал про
Ниже скрипт который автоматически пронумерует системные вызовы для последующих инъекций.
Сохраняем это безобразие в файл
Теперь получаем такой выхлоп:
Смотрим второй столбик, включаем логику и видим, что системные вызовы нумеруются.
Например, возьмем системный вызов
ㅤ
Теперь берем нужный номер системного вызова и применяем инъекцию. Как это сделать и для чего, опять же показывал на примерах (ссылки в начале этого поста).
Тема крутая, не нужно ебаться и считать руками.
Весь вывод
А чтобы получить только трассировку, можно сделать так:
Если бесит подсветка, выпили из перловского скрипта управляющий символ «
Такие дела, изучай!
tags: #linux #debug
—
🔔 @bashdays➡️ @gitgate
strace и как применять инъекции. Если пропустил, то читай тут и тут.Ниже скрипт который автоматически пронумерует системные вызовы для последующих инъекций.
#!/usr/bin/perl
use strict;
use warnings;
my %numbs;
select STDERR;
while(<STDIN>) {
if( /^[0-9]++\s++([a-z0-9_]++(?=\())/ ) {
my $t = ++$numbs{$1};
s/\s+/ \e[31m$t\e[m /;
die $! if( keys %numbs == 1000 );
}
print;
}
exit(0);
Сохраняем это безобразие в файл
num_syscalls и делаем chmod +x, ну а дальше запускаем в связке с strace:strace -o'|./num_syscalls' -yf sh -c 'ls|cat'
Теперь получаем такой выхлоп:
456107 48 close(3</usr/) = 0
456107 52 rt_sigreturn({mask=[]})
456107 63 openat(AT_FDCWD</usr/local/sbin>)
456107 53 newfstatat(3)
456107 64 openat(AT_FDCWD</usr/local/sbin>)
Смотрим второй столбик, включаем логику и видим, что системные вызовы нумеруются.
Например, возьмем системный вызов
openat, видим 63, 64. Это значит что openat был вызван 64 раза. А newfstatat 53.ㅤ
Теперь берем нужный номер системного вызова и применяем инъекцию. Как это сделать и для чего, опять же показывал на примерах (ссылки в начале этого поста).
Тема крутая, не нужно ебаться и считать руками.
Весь вывод
strace отправляется в stderr, чтобы иметь возможность разделять вывод трассировки и вывод исследуемой программы.А чтобы получить только трассировку, можно сделать так:
strace -o'|./num_syscalls' -yf ls > /dev/null
Если бесит подсветка, выпили из перловского скрипта управляющий символ «
\e[31m\[em».Такие дела, изучай!
tags: #linux #debug
—
Please open Telegram to view this post
VIEW IN TELEGRAM
11 34 15