2014-12-15 4 views
11

я SSHed в выносном боксе, как корень, когда я побежал следующую команду:Я только что уничтожил libc.so на моей машине. Что я могу сделать сейчас?

ln -sf /nonexistent /.../libc.so 

Сразу моя подсказка начал бросать ошибки:

basename: could not find shared library 

Я даже не могу запустить что-нибудь:

[email protected]# ls 
ls: could not find shared library 

Как это исправить? У меня есть два сеанса SSH, открытых с Bash, но никаких других процессов не доступно. У меня есть кросс-компилятор для цели на моей локальной машине, но больше нет путей к файлам SCP на удаленном конце.

EDIT: в этом поле нет других копий libc; Я перезаписал настоящий файл libc. Некоторые вещи все еще работают: я могу echo, и я могу использовать tab-completion для эмуляции ls. Но обычные программы (mv, rm и т. Д.) - это МВД.

+5

Это может быть более подходящим для Суперпользователя. – Veedrac

+0

Удалите (отменить связь) иконок «несуществующих» софт-ссылок, которые вы создали, и переустановите libc. (и надеюсь, что в случае необходимости у вас есть компетентный набор рук на удаленном сайте, если удаленный доступ забит) –

+0

@ DavidC.Rankin: Я бы, но я ничего не могу запустить ... – nneonneo

ответ

6

Я обнаружил, что все еще могу писать файлы, используя echo и перенаправить (спасибо Iwillnotexist Idonotexist!). Кроме того, echo -ne позволяет записывать произвольные байты в файл. Поэтому я могу обрезать файл с echo -ne '' > file, а затем повторно написать к нему с

echo -ne '\001' >> /file 

Используя этот подход, можно перезаписать любой исполняемый присутствует в системе (так как я все еще корень) таким образом.

я составил простую программу для переименования файла:

#include <unistd.h> 
int main(int argc, char **argv) { return rename(argv[1], argv[2]); } 

с помощью cross-gcc -static mv.c mv (исключающей libc.so зависимости). Затем я написал сценарий для кодирования любого двоичного файла в виде серии echo команд (ограничение по длине, что readline позволит мне войти):

# Encode a file as a series of echo statements. 

# settings 
maxlen = 1020 
infile = '/tmp/mv' 
outfile = '/usr/bin/mv' 

print "echo -ne '' > %s" % outfile 

template = "echo -ne '%%s' >> %s" % outfile 
maxchunk = maxlen - len(template % '') 
pos = 0 
data = open(infile, 'rb').read() 

transtable = {} 
for i in xrange(256): 
    c = chr(i) 
    if i == 0: 
     transtable[c] = r'\0' 
    elif c.isalpha(): 
     transtable[c] = c 
    else: 
     transtable[c] = r'\0%o' % i 

while pos < len(data): 
    chunk = [] 
    chunklen = 0 
    while pos < len(data): 
     bit = transtable[data[pos]] 
     if chunklen + len(bit) < maxchunk: 
      chunk.append(bit) 
      chunklen += len(bit) 
      pos += 1 
     else: 
      break 
    print template % ''.join(chunk) 

Я использовал мой echo кодировщик для создания серии echo команд который я вставлял в таблицу ssh. Они выглядят как

echo -ne '' > /usr/bin/mv 
echo -ne '\0177ELF\01\01\01\0\0\0\0\0\0\0\0\0\02\0\050\0\01\0\0\0\0360\0200\0\0\064\0\0\0\030Q\05\0\0\0\0\05\064\0\040\0\05\0\050\0\034\0\033\0\01\0\0\0\0\0\0\0\0\0200\0\0\0\0200\0\0P\03\01\0P\03\01\0\05\0\0\0\0\020\0\0\01\0\0\0\0\017\01\0\0\0237\01\0\0\0237\01\0x\02\0\0X\046\0\0\06\0\0\0\0\020\0\0Q\0345td\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\06\0\0\0\0\0\0\0\01\0\0p\0244\0356\0\0\0244n\01\0\0244n\01\0\0350\010\0\0\0350\010\0\0\04\0\0\0\04\0\0\0R\0345td\0\017\01\0\0\0237\01\0\0\0237\01\0\0\01\0\0\0\01\0\0\06\0\0\0\040\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\020\0265\04\034\0\040\0\0360\053\0371\040\034\016\0360r\0375\0134\0300\0237\0345\0H\055\0351X\060\0237\0345\04\0260\0215\0342\020\0320M\0342\014\0300\0217\0340\03\060\0234\0347\024\060\013\0345D\060\0237\0345\04\0\0213\0342\03\060\0234\0347\020\060\013\0345\070\060\0237\0345\0\020\0240\0343\03\060\0234\0347\014\060\013\0345\054\060\0237\0345\03\060\0234\0347\010\060\013\0345\044\060\0237\0345\03\040\0234\0347\024\060K\0342\0223\072\0\0353\04' >> /usr/bin/mv 
echo -ne '\0320K\0342\0\0210\0275\0350\0350\036\01\0\0174\0377\0377\0377\0200\0377\0377\0377\0204\0377\0377\0377\0210\0377\0377\0377\0214\0377\0377\0377\0H\055\0351\04\0260\0215\0342\010\0320M\0342\010\0\013\0345\014\020\013\0345\014\060\033\0345\04\060\0203\0342\0\040\0223\0345\014\060\033\0345\010\060\0203\0342\0\060\0223\0345\02\0\0240\0341\03\020\0240\0341\06\0\0\0353\0\060\0240\0341\03\0\0240\0341\04\0320K\0342\0\0210\0275\0350\0\0\0\0\0\0\0\0\0\0\0\0\0220\0\055\0351\046p\0240\0343\0\0\0\0357\0220\0\0275\0350\0\0\0260\0341\036\0377\057Qr\072\0\0352\0\0\0240\0341\020\0265\04\034\0\0360\014\0370\04\0140\01\040\0100B\020\0275\020\0265\03\034\0377\063\02\0333\0100B\0377\0367\0361\0377\020\0275\020\0265\02K\0230G\010\060\020\0275\0300F\0340\017\0377\0377\0360\0265\031N\0203\0260\034\034\0176D\07\034\01\0222\0\0360\0253\0371\045h\0\0340\0230G\04\065\053h\0\053\0372\0321\0345h\0\0340\0230G\04\065\053h\0\053\0372\0321eh\0\0340\0230G\04\065\053h\0\053\0372\0321\075\034\0200\0315y\034\0210\0' >> /usr/bin/mv 
... 

я проверил замену mv несколько раз, чтобы убедиться, что он работал (с помощью Bash табуляции завершения в качестве замены для ls), а затем использовал echo кодировщика написать замену libc.so к временному каталог. Наконец, я переместил замену libc.so в нужное место, используя статический mv Я нажал.

И успех! Это может потребоваться около часа, но мой бокс вернулся и работает без жертв, за исключением одного сбитого /usr/bin/mv :)

+0

Поздравляем вас с успешной реализацией этой стратегии! –

+2

@IwillnotexistIdonotexist: Да, я очень рад этому. Большое вам спасибо за вашу помощь! – nneonneo

+0

Человек вы убили трех птиц одним камнем на этом! ([on-the-road] (http://winterbash2014.stackexchange.com/on-the-road), [бизнес-во-фронт-сторона-в-спине] (http: // winterbash2014. stackexchange.com/business-in-the-front-party-in-the-back), [selfie] (http://winterbash2014.stackexchange.com/selfie))! –