Mengambil beberapa output dari xxd dan mengubahnya menjadi shellcode yang dapat digunakan dengan tangan tidak menyenangkan, jadi tugas Anda adalah mengotomatiskan proses.
Aturan
Kiriman Anda dapat berupa fungsi, lambda, skrip, atau yang setara dengan itu. Anda dapat mencetak hasilnya, atau jika kiriman Anda adalah fungsi / lambda maka Anda juga dapat mengembalikannya.
Anda Program harus mengambil tiga argumen, yang pertama adalah string yang berisi output dari xxd, berlari tanpa argumen selain nama file, seperti ini: xxd some_file
. Berikut ini contoh tampilan argumen pertama:
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
Anda perlu mengambil bagian tengah yang berisi byte (8 kolom pertama setelah :
) dan mengubahnya menjadi shellcode dengan menghapus spasi, lalu meletakkan \x
sebelum setiap byte.
Inilah yang seharusnya menjadi input untuk input di atas (mengabaikan argumen lain):
\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
Anda dapat mengasumsikan argumen pertama akan selalu berupa output xxd yang valid, dijalankan tanpa argumen selain nama file.
Output Anda juga harus berupa string di mana garis miring terbalik adalah garis miring terbalik literal, tidak digunakan sebagai karakter pelarian. Jadi ketika saya mengatakan "\ x65", saya tidak berbicara tentang byte 0x65, atau bahkan huruf "A". Dalam kode, itu adalah string "\ x65".
Argumen kedua menentukan di mana dalam output xxd shellcode harus dimulai, dan argumen ketiga menentukan di mana ia harus berakhir. Jika argumen ketiga adalah -1
, itu akan berakhir pada akhir output xxd. Argumen kedua dan ketiga juga akan selalu non negatif, kecuali ketika argumen ketiga-1
Berikut ini beberapa kasus uji:
Argumen 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
Argumen 2 7
:, Argumen 3: e
(keduanya adalah string yang mewakili angka heksadesimal)
Keluaran: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
Argumen 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
Argumen 2 0
:, Argumen 3:2e
Keluaran: \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
Argumen 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
Argumen 2 a
:, Argumen 3:-1
Keluaran: \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
Kode dengan byte paling sedikit menang. Pemenang akan diumumkan dalam tujuh hari, pada 15 Agustus 2016 (tetapi pengiriman setelah itu masih dihargai).
Memperbarui
Selamat kepada @Adnan untuk memenangkan tantangan!
sumber
~
bukannya\x7e
. Dan bisakah kita kembali,\t
bukan\x09
?7
terlihat seperti indeks berbasis nol dane
merupakan indeks berbasis satu (e-7=7
tetapi ada 8 kode hex pada output Anda), atau apakah saya mengabaikan sesuatu?Jawaban:
05AB1E ,
3938 byteMasukan dalam bentuk:
Kode:
Penjelasan:
Menggunakan pengkodean CP-1252 . Cobalah online! .
sumber
Bash + coreutils + xxd,
737169 byteHarapkan hexdump pada STDIN dan mulai / akhiri sebagai argumen baris perintah.
Ini mencetak beberapa peringatan ke STDERR, yang diizinkan secara default.
sumber
xxd
solusi mereka!16#
dengan0x
?xxd
sesuatu, tetapi tampaknya berfungsi di mana-mana.0xn
heks gaya dan0m
angka gaya oktal di luar kotak: gnu.org/software/bash/manual/bash.html#Shell-Arithmetic .echo $[0x2a] $[052]
.JavaScript, 84 byte
Penjelasan: Hapus semua bagian yang tidak diinginkan dari dump, tambahkan
\x
masing-masing pasangan hex, kemudian ekstrak bagian yang diinginkan dari hasil.||u
digunakan untuk mengkonversi nol yang diperoleh dengan menambah-1
parameterundefined
yang merupakan nilai ajaib yang menyebabkanslice
irisan ke ujung string. 101 byte jikaf
dant
adalah string digit hex:sumber
(s,f,t,u)=>
, Anda bisa melakukannyas=>f=>t=>u=>
, untuk menyimpan beberapa byte.u
harus berupa parameter tambahan dan tidak dapat dijelajahi.Ruby:
9089877963 byte-2 byte terima kasih kepada @addison
-8 byte terima kasih kepada @PiersMainwaring
Lihat tes di repl.it: https://repl.it/Cknc/5
sumber
.join
dengan*""
untuk menyimpan 2 byte..map{|h|h.to_i(16)}
dengan.map(&:hex)
untuk menyimpan 8 byte lebih banyak!.hex
argumen secara individual!Jelly ,
4844 byteIni mengharapkan hexdump sebagai argumen baris perintah tunggal, dan titik akhir dan mulai pada STDIN, dalam urutan itu, dipisahkan oleh linefeed.
Cobalah online!
sumber
PowerShell v2 +,
175157142133129 byteMengambil input
$a
,$b
,$c
, dengan$a
baik sebagai baris baru-string dipisahkan literal, atau dengan PowerShell`n
karakter memisahkan baris. Kami menetapkan helper string$z
sebagai sangat diproses$a
sebagai berikut -Pertama kita
-split
di baris baru, lalu, untuk setiap baris|%{...}
, kita mengiris bagian tengah[10..48]
, menggunakan-ne32
untuk menghapus spasi,-join
kembali menjadi satu string panjang,-split
pada setiap dua karakter (menjaga dua karakter), dan-ne''
untuk menghapus elemen kosong. Ini menghasilkan array string dua elemen, seperti('31','c0','b0'...)
.Kami kemudian mengiris array yang didasarkan pada
$b
gips dengan operator heksadesimal hingga nilai$c
. Kita perlu menggunakan pseudo-ternary di sini yang menjelaskan apakah$c
itu benar-1
atau tidak. Jika ya, kita memilih.count
(yaitu, elemen akhir) dari$z
. Jika tidak, kami hanya menambahkan0x
operator heksadesimal$c
dalam sebuah string. Perhatikan bahwa ini tidak diindeks.Irisan array memiliki elemen-elemennya
-join
disatukan dengan literal\x
untuk membentuk satu string. Itu diawali dengan literal lain\x
dan hasilnya ditinggalkan di saluran pipa. Pencetakan tersirat.Contoh
sumber
Jelly ,
393837 byteCobalah online!
Sekarang ketuk 05AB1E! (meskipun builtin "convert from hexadecimal")
Format input yang sama dengan solusi Dennis .
Gunakan
Ɱ
, yang merupakan fitur baru (kependekan dariЀ
). Tanpa itu, ini akan membutuhkan 38 byte.sumber
Perl, 114 byte
Argumen yang diberikan pada baris perintah sebagai string yang dikutip diikuti oleh dua angka. Angka diambil dalam desimal (saya tahu heks digunakan dalam contoh tetapi tidak ditentukan dalam pos)
Secara teknis hanya bekerja pada input dengan hingga 2 ^ 21 byte karena metode substring perl ini konyol
sumber
7
untuke
harus menghasilkan serangkaian panjang 32.Python, 140 byte
https://repl.it/ClB3
Pisahkan string asli dan buang elemen jika mereka kurang dari lima karakter, prepends
\x
, dan irisan dengan argumen kedua dan ketiga.Versi 162 byte jika kita perlu menangani tipe output lain yang tidak ditentukan oleh pertanyaan:
sumber
00000030: 5858 58 XXX
karena akan menarik bagian terakhir dan Anda akan mendapatkan sesuatu seperti\x58\x58\x58\xXX\xX
.xxd
output lain yang digunakan sebagai argumen. "Berikut adalah contoh dari bagaimana argumen pertama akan terlihat:"Python 2 dan 3 -
164 162 150 146 134150 byteSekarang menerima string hex untuk argumen kedua dan ketiga.
sumber
Python 3.5, 125 byte
Tidak Disatukan:
sumber