( zamboriz | 2012. 03. 02., p – 00:50 )

Némi kísérletezés után úgy tűnik, hogy LD_PRELOAD-dal be lehet tölteni egy inicializáló kódot, ami átírja a program megfelelő paraméterét a tényleges jelszóra, míg a ps, top, stb, a parancssorban megadott helyőrzőt jeleníti meg.

a betöltendő kód:


void init( int argc, char **argv, char **envp ){
  argv[2] = "(igazi titok)";
}

__attribute__((section(".init_array"))) typeof(init) *__init = init;

fordítása:


gcc -shared -o setarg.so setarg.c

teszt program:


#!/bin/bash

LD_PRELOAD= /bin/echo A B C
            /bin/echo A B C

/bin/echo "0:$0 1:$1 2:$2"
LD_PRELOAD= od -c /proc/${BASHPID}/cmdline

ps ax | grep elso

teszt eredmény:


$ LD_PRELOAD=setarg.so ./test.sh elso masodik

A B C
A (igazi titok) C
0:./test.sh 1:(igazi titok) 2:masodik
0000000   /   b   i   n   /   b   a   s   h  \0   .   /   t   e   s   t
0000020   .   s   h  \0   e   l   s   o  \0   m   a   s   o   d   i   k
0000040  \0
0000041
 5047 pts/1    S+     0:00 /bin/bash ./test.sh elso masodik
 5053 pts/1    R+     0:00 grep elso

Ha működik így a dolog, akkor némi XOR-ozással elrejthető a szöveg a kódban, vagy beemelhető környezeti változóból, fájlból, amit indítás után le lehet törölni, stb.