Взяти певний вихід з xxd і перетворити його в корисний код оболонки вручну - це не цікаво, тому ваше завдання - автоматизувати процес.
Правила
Ваше подання може бути функцією, лямбда, сценарієм або будь-яким розумним еквівалентом. Ви можете надрукувати результат або якщо ваше подання є функцією / лямбда, то ви також можете повернути його.
Ви програма повинна приймати три аргументи, перший з яких рядок , що містить висновок XXD, пробіг з яких - небудь інших , ніж ім'я файлу аргументів, як це: xxd some_file
. Ось приклад того, як буде виглядати перший аргумент:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Вам потрібно взяти цей середній розділ, що містить байти (перші 8 стовпців після цього :
), і перетворити його в shellcode, видаливши будь-який пробіл, а потім поставити \x
перед кожним байтом.
Ось яким повинен бути результат для введення вище (ігноруючи будь-які інші аргументи):
\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
Ви можете припустити, що перший аргумент завжди буде дійсним xxd результатом, запускається без аргументів, крім імені файлу.
У вашому висновку також має бути рядок, де риски зворотнього косого ряду є буквальними зворотніми косими рисами, а не використовуються як символи втечі. Тому коли я кажу "\ x65", я не кажу про байт 0x65, або навіть букву "A". У коді це буде рядок "\ x65".
Другий аргумент вказує, звідки у виведенні xxd повинен починатися код оболонки, а третій визначає, де він повинен закінчуватися. Якщо третій аргумент -1
, він закінчиться наприкінці виведення xxd. Другий та третій аргументи також завжди будуть негативними, за винятком випадків, коли є третім-1
Ось кілька тестових випадків:
Аргумент 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Аргумент 2:, 7
Аргумент 3: e
(це обидва рядки, що представляють шістнадцяткові числа)
Вихід: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
Аргумент 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Аргумент 2:, 0
Аргумент 3:2e
Вихід: \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e
Аргумент 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Аргумент 2:, a
Аргумент 3:-1
Вихід: \xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
Виграє код з найменшими байтами. Переможець буде оголошений через сім днів, 15 серпня 2016 року (однак подання після цього ще оцінено).
Оновлення
Вітаю @Adnan за перемогу у виклику!
~
замість \x7e
. І чи можемо ми повернутися \t
замість \x09
?
7
виглядає як нульовий індекс і e
є одноосновним індексом ( e-7=7
але у вашому виході є 8 шістнадцяткових кодів) чи я щось пропускаю?