สตริงบิวด์อินของ JavaScript คืออะไร


147

คำถามนี้ยากที่จะสรุปในชื่อคำถาม

อัปเดต ฉันสร้าง JSFiddle ที่สร้างสตริงที่ยุ่งเหยิงจากอินพุตของคุณตามตัวอักษรที่ดึงมาจากคำถามนี้: คุณสามารถเข้าถึงได้ที่นี่หรือส่วนสำคัญจะง่ายขึ้นหรือไม่

ฉันเพิ่งเจอจาวาสคริปต์ที่สับสนในโปรไฟล์นี้ซึ่งมีลักษณะดังนี้:

javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1
+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+([,][
~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+
1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]

ขออภัยที่ทำลายความประหลาดใจ แต่เมื่อได้รับการประเมินแล้วจะส่งคืนสิ่งนี้:

"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10

วิธีการทำงานเมื่อแตกออกคือการสร้างชุดของข้อความและดึงตัวอักษรออกมาเช่น (ใช้ตัวอย่าง "I"):

[]+1/!1
returns
"Infinity"
then
[[]+1/!1]
creates this array:
["Infinity"]
then
[[]+1/!1][1^1]
Takes the first (1^1 == 0) element of that array
"Infinity"
finally
[[]+1/!1][1^1][1>>1]
Takes the first (1>>1 == 0) char of that string
"I"

สตริงอื่น ๆ ที่สร้างขึ้นรวมถึง:

({}+[])       -> "[object Object]" (where the space comes from)
([]+!!-[])    -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[])  -> "undefined"

ฉันสนใจที่จะหาสิ่งทดแทนสำหรับ "n" และ "[" และมากับสิ่งนี้:

String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))

ซึ่งฉันรู้สึกในจิตวิญญาณของการใช้ 1 และ 0 ของ แต่ละเมิดหนึ่งในด้านที่สวยงามมากขึ้นของรหัสเดิมซึ่งเป็นลักษณะของการไม่มีอะไรเกี่ยวข้องกับสายเลย ใครบ้างมีความคิดวิธีการสร้าง "v" ที่สอดคล้องกับรหัส obfuscated เดิม?

นี่คือข้อมูลเพิ่มเติมบางอย่างที่พบหลังจากโปรแกรมเมอร์ JavaScript ที่มีความสามารถหลายคนมองลึกลงไปในเรื่องนี้

Firefox ส่งคืน "ฉันอยู่คนเดียว" เนื่องจากบรรทัดนี้:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+

[1^11<<1] ภายนอกข้อมูลรถอักขระเฉพาะจากนี้:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])

ซึ่งประเมินสิ่งนี้:

"function test() {
    [native code]
}"

ซึ่งดูเหมือนว่าเราอาจมี "V" ของเรา !!!

Chrome ส่งคืน "ฉันรักคุณ" เนื่องจากรหัสเดียวกันส่งคืนสิ่งนี้:

"function test() { [native code] }"

ก่อนที่คำถามจะปิดสำหรับการเชื่อมต่อที่น่าสงสัยกับ "ปัญหาการเขียนโปรแกรมจริง" ฉันคิดว่าฉันจะเพิ่มโซลูชันสรุปที่สร้างบน@ Supr's , @ Cory'sและ@ alpha123'sดูเถิด:

alert([[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+(
[]+!!-[])[1<<1]+[/~/+{}][+!1][-~1<<1]+[([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(
!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],([]+/-/[(!!1+[
])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[
])[1^1]])[1^11<<1],([]+/-/[(!!1+[])[1>>1]+(!!1+[
])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11
+1+1)<<1]][((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<
1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1
)+1<<1]==({}+[])[1^1])*1)+((([]+/-/[(!!1+[])[1>>
1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[(1^11<<1)-1]==({}+[])[1^1])<<1)]+([,][~1]+[]
)[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+
(/1/+1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</
[1]+[])[1/1.1&1])

ด้วยความซับซ้อนของรหัสและข้อความที่สร้างขึ้นมันเกือบจะเหมือนเครื่องมือ JavaScript ที่บอกว่าคุณรู้สึกพิเศษอย่างไร :)


9
มันบอกว่า "รัก" ในคอนโซล Chrome i.imgur.com/rVyKMoP.png
bfavaretto

2
จะทำอย่างไรถ้าคุณถอดตัวอักษรที่ไม่ใช่ออกมาจากfunction test() { [native code] }นั้นคุณสามารถทำให้เป็นมาตรฐานและแยกตัวอักษรที่คุณต้องการ
Jason Sperske

4
การอ้างอิงรหัสในเอาต์พุตสตริงที่ไม่ได้มาตรฐานกำหนดเพื่อพิมพ์ข้อความโดยใช้รหัสที่สับสน ... ฉันเรียกสิ่งนี้ว่าวิธีเดียวที่แปลเป็นภาษาท้องถิ่นมากเกินไป

2
@Ian จริง ถ้าคนในชีวิตของฉันที่ฉันรักได้รับการดูแลมากเกี่ยวกับฉันว่าพวกเขาจะใช้ Chrome :)
เจสัน Sperske

4
ส่วนที่ดีที่สุดเกี่ยวกับเรื่องนี้คือคำเตือนที่โปรแกรมแก้ไขข้อความของฉันให้: "สับสนในการใช้ '!'"
Jake Johnson

คำตอบ:


83

ก่อนอื่นฉันขอขอบคุณ Jason และผู้มีส่วนร่วมทั้งหมดที่ได้เล่นกับตัวอย่างตลกที่ ฉันเขียนโค้ดนั้นเพื่อความสนุกเพื่อส่งให้ภรรยาของฉันในวันที่ 14 กุมภาพันธ์ :) มี Chrome ติดตั้งบนแล็ปท็อปเท่านั้นฉันไม่มีตัวเลือกเพื่อตรวจสอบว่ามันทำงานอย่างไรใน Firefox และ IE ยิ่งกว่านั้นฉันไม่ได้คาดหวังว่าการtoString()แสดงวิธีการบิลด์อินอาจแตกต่างจากเบราว์เซอร์อื่น

ตอนนี้ย้ายไปที่ปัญหาจริงลองดูรหัสอย่างแม่นยำ ใช่"v"เป็น "ปัญหา" ที่แท้จริงที่นี่ ฉันไม่พบวิธีอื่นในการรับจดหมายนี้ยกเว้นการวิเคราะห์[native code]สตริงซึ่งสามารถนำมาจากวิธีการในตัวใด ๆ เนื่องจากฉัน จำกัด ตัวเองโดยไม่มีสตริงและไม่มีตัวเลขยกเว้น1ใช้ฉันจึงต้องใช้วิธีการบางอย่างที่มีอักขระที่มีอยู่ในชื่อเท่านั้น

ตัวละครที่มีอยู่สามารถได้รับจากคำหลักที่มีอยู่และการแสดงสตริงคือตั้งแต่เริ่มต้นเรามีNaN, null, undefined, Infinity, true, และfalse "[object Object]"บางส่วนของพวกเขาสามารถเปลี่ยนได้อย่างง่ายดายเพื่อสตริงเช่นให้1/!1+[]"Infinity"

ฉันมีการวิเคราะห์ที่แตกต่างกันในการสร้างวิธีการสำหรับอาร์เรย์[]วัตถุ{}, การแสดงออกปกติ/(?:)/ตัวเลข1.1สตริง"1"และค้นพบวิธีการหนึ่งที่สวยงามของวัตถุที่เรียกว่าRegExp test()ชื่อของมันสามารถนำมาประกอบขึ้นจากตัวละครที่มีอยู่ทั้งหมดเช่น"t"และ"e"จากtrueและจาก"s" falseฉันได้สร้างสตริง"test"และแก้ไขวิธีนี้โดยใช้สัญกรณ์สแควร์เหลี่ยมสำหรับตัวอักษร regex ที่/-/ระบุอย่างถูกต้องในบรรทัดนี้:

/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]]

ดังที่ได้กล่าวไปแล้วโค้ดส่วนนี้ได้รับการประเมินใน Chrome เป็น:

function test() { [native code] }

ใน Firefox เป็น:

function test() {
    [native code]
}

และใน IE เป็น:

 function test() {     [native code] }  

(ในระยะหลังให้ความสนใจเป็นพิเศษกับพื้นที่ก่อนfunctionคำหลัก)

ดังนั้นตามที่คุณเห็นอย่างชัดเจนรหัสของฉันได้รับอักขระที่ 24 จากสตริงที่นำเสนอซึ่งใน Chrome เป็น"v"(ตามที่วางแผนไว้) แต่น่าเสียดายที่ใน Firefox และ IE - "n"และ"["ตามลำดับ

เพื่อให้ผลลัพธ์เดียวกันในเบราว์เซอร์ทั้งหมดฉันได้ใช้วิธีการที่แตกต่างจากที่แสดงในคำตอบอื่น ๆ ตอนนี้เวอร์ชันที่แก้ไขแล้วจะมีลักษณะดังนี้:

javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+/\[[^1]+\]/[([]+![])[1<<1<<
1]+(/|/[(1+{})[1+11>>>1]+[[]+{}][+!1][1]+([]+1/[])[1<<1>>1]
+([1<1]+[])[1+11>>>1+1]+[[!!1]+1][+[]][1-1]+([]+!!/!/)[1|1]
+(/1/[1]+[])[!1%1]+(-{}+{})[-1+1e1-1]+(1+[!!1])[1]+([]+1+{}
)[1<<1]+[!!/!!/+[]][+[]][1&1]]+/=/)[1e1+(1<<1|1)+(([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[1^1]==+!1)]+(!![]+{})[1|1<<1]+[1+{}+1][!1+!1][(11>>1)+1
]](([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+
(!!1+[])[1^1]]))[1&.1][11>>>1]+([,][~1]+[])[1-~1]+[[]+{}][!
1.1%1][11111.1%11.1*111e11|!1]+(/1/+1/[1<1][1%1])[1^11]+[[]
,[]+{}][1<<1>>>1][1||1]+(/[<+>]/[1&1|1]+[1.1])[1/11.1&1.11]

อย่างไรก็ตามเพื่อให้ผู้อ่านได้วางแผนฉันจะไม่เสนอวิธีแก้ปัญหาสำหรับสิ่งนั้น ฉันเชื่อโดยสุจริตว่าคุณจะเข้าใจได้อย่างง่ายดายว่ามันทำงานอย่างไร ... และบางคนก็สามารถทำให้คนที่รักประหลาดใจในแบบข้ามเบราว์เซอร์;)

ป.ล. ยังมีอีกผู้ Obfuscator

แรงบันดาลใจจากความคิดของเจสันในการสร้างเครื่องมือที่ทำให้งงงวยสากลฉันได้เขียนอีกหนึ่ง คุณสามารถค้นหาได้ที่JSBin: http://jsbin.com/amecoq/2 มันสามารถทำให้งงงวยข้อความใด ๆ ที่มีตัวเลข[0-9]ตัวอักษรละตินขนาดเล็ก[a-z]และช่องว่าง ความยาวสตริงนั้นส่วนใหญ่จะ จำกัด กับ RAM ของคุณ (อย่างน้อยส่วนเนื้อหาของคำตอบของฉันก็สับสนวุ่นวาย) รองรับ Chrome, Firefox และ IE

คำแนะนำ:เครื่องมือใช้วิธีการทำให้งงงวยแตกต่างจากที่แสดงไว้ด้านบน


4
"นวกรรมิก" ... ว้าวที่น่าทึ่งและคุณเก็บสี่เหลี่ยมผืนผ้าที่สมบูรณ์แบบด้วยการแบ่งบรรทัดที่ถูกต้อง คุณเป็นคนดี
Jason Sperske

1
ฉันสร้าง Obfuscator ที่สร้างสตริงตามกฎสไตล์ของคุณ: jsfiddle.net/w9rFF/8
Jason Sperske

@ JasonSperske นั่นเป็นเคล็ดลับที่ดี! การทำงานที่ดี! ฉันจะพยายามมีส่วนร่วม
VisioN

26

เหตุใดจึงไม่ใช้native codeบิตของคำถามที่ใช้ อันนี้ให้'v'ทั้งใน Chrome และ Firefox:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]>([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]?([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]:([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]

แก้ไขเพื่อรองรับ IE และทำได้โดยไม่ต้องใช้ผู้ประกอบการที่ประกอบไปด้วย: อัน นี้ใช้งานได้ใน Chrome, IE และ FF สร้างอาร์เรย์และใช้==เพื่อกำหนดเบราว์เซอร์

[([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1],([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]][((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1)+1<<1]==({}+[])[1^1])*1)+((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)-1]==({}+[])[1^1])<<1)]

อ่านได้:

[
    //ie
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],
    //ch
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1],
    //ff
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]
]
[
    //ch?
    ((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1)+1<<1]==({}+[])[1^1])*1)+
    //ff?
    ((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)-1]==({}+[])[1^1])<<1)
]

นั่นน่าสนใจ. เดิมทีมันถูกไล่ออกว่าตำแหน่งของคำว่า "native code" นั้นไม่แน่นอนระหว่าง Firefox และ Chrome วิธีนี้แก้ได้ แต่ไม่สามารถใช้งานได้ใน IE10 (ซึ่งจะส่งคืน "i") ถึงกระนั้นฉันก็ยังสงสัยว่าตัวเลือกนี้อาจเสนอแนวคิดใหม่ ๆ หรือไม่
Jason Sperske

แนวคิดก็คือเลือกทั้งสองอย่างnและvเลือกว่าอันไหนที่ใหญ่ที่สุด: str[23]>str[27]?str[23]:str[27]. กล่าวอีกนัยหนึ่งผู้ประกอบการระดับอุดมศึกษาคือกลอุบาย สามารถขยายเพื่อรองรับ IE ได้เช่นกัน:([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)]
Supr

1
คำตอบของคุณเป็นครั้งแรก (ข้างหน้าผู้สร้างรหัสต้นฉบับ) แต่ฉันรู้สึกว่าคำตอบของเขาอาจได้รับการพิจารณาอย่างถูกต้องตามหลักเหตุผล ยังคงเป็นงานที่ดี (และสมควรได้รับคะแนนโหวต 13 ขึ้นไป)
Jason Sperske

1
ผู้ให้บริการรายย่อย: ผู้ดำเนินการระดับอุดมศึกษาเป็นผู้ดำเนินการที่สำคัญที่สุดลำดับที่สามรองจากผู้เริ่มต้น ตัวดำเนินการซึ่งใช้เวลาสามตัวถูกดำเนินการเป็น ternary
Eric Lippert

1
@EricLippert, gah, ฉันยัง googled เพื่อให้แน่ใจว่าฉันใช้คำที่ถูกต้อง แต่ฉันยังคงจบลงด้วยความผิด! ขอบคุณแก้ไขแล้ว
Supr

8

นี่เป็นเรื่องที่ใกล้ที่สุดเท่าที่ฉันจะทำได้ แต่น่าเสียดายที่มันเป็นการละเมิดแบบแผนของการทำให้งงงวยโดยการโทรไปที่unescape():

unescape((/%/+[])[1]+(/1/[1]+[])[1%1]+(+!1)+(+!1)+(1e1+(11*(1-~1)<<1)))

การถอดออก:

(/%/+[])[1]          => "%"
(/1/[1]+[])[1%1]     => "u"
(+!1)                => "0"
(+!1)                => "0"
(1e1+(11*(1-~1)<<1)) => "76"
===========================
unescape("%u0076")   => "v"

ความคิดอื่น ๆ :

  1. ยังไงก็เถอะ unescape("\x76")
  2. อย่างใดแปลง118โดยไม่ต้องโทรString.fromCharCode()
  3. รับข้อความจากข้อยกเว้นด้วยคำว่า "ไม่ถูกต้อง"

ปรับปรุง:

ฉันเริ่มเล่นรหัสกอล์ฟและทำให้มันสั้นลงแทนที่ชิ้นส่วนด้วย1s มากขึ้นเป็นต้น


ฉันชอบอันนี้เช่นกัน ฉันขาดคำตอบที่เลือก "ถูกต้อง" เนื่องจากทั้งคุณและ @ alpha123 นั้นดูสับสนและซ่อนความตั้งใจดั้งเดิมอย่างชาญฉลาด
Jason Sperske

และ IE10 รองรับการผนึก (ด้วยคำขอโทษอย่างจริงใจ @ alpha123 สำหรับคำตอบที่ยอดเยี่ยม)
Jason Sperske

คุณสามารถแทนที่'%'ด้วย(/%/+[[]+1/!1])[1]การลบคำพูดใด ๆ ฉันยังได้เพิ่มl=unescape;การใช้ตัวพิมพ์เล็กเพื่อซ่อนอ้างอิงถึงL unescapeนี้ได้รับความสนุกสนาน :)
เจสัน Sperske

@JasonSperske: ยิ่งสั้นลง:(/%/+[])[1]
Cᴏʀʏ

1
หรือคุณอาจจะตั้งชื่อตัวแปรของคุณ$1;
Cᴏʀʏ

4

นี่คือส่วนที่สร้าง n / v:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]

ใน Firefox ให้([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])ประเมิน

"function test() {
    [native code]
}"

ในขณะที่อยู่ใน Chrome

"function test() { [native code] }"

1^11<<1 เท่ากับ 23 ดังนั้นเนื่องจากช่องว่างพิเศษของ Firefox จึงไม่เพียงพอที่จะไปยัง 'v' และแทน 'n'

และนี่คือเหตุผลที่คุณไม่ควรพึ่งพา Function # toString ;)

แก้ไข: ในที่สุดฉันก็พบรุ่นข้ามเบราว์เซอร์ที่ทำให้สับสน:

[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)+(parseInt("010")<10?(1+1+1+1):0)]+([,][~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]

สิ่งนี้แทนที่ส่วน n / v ด้วย:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)+(parseInt("010")<10?(1+1+1+1):0)]

ซึ่งใช้ประโยชน์จากความแตกต่างในการแยกวิเคราะห์ (เห็นได้ชัดว่า Firefox แยกวิเคราะห์ตัวเลขที่ขึ้นต้นด้วยเลข 0 เป็นฐานแปดในขณะที่ Chrome ไม่มี) เพื่อเพิ่ม 4 ในกรณีของ Firefox จึงได้รับ 'v' จาก 'ดั้งเดิม' ในทั้งสองกรณี ': P)
การแยกวิเคราะห์ดูเหมือนออกนอกสถานที่เล็กน้อย แต่นั่นเป็นสิ่งที่ดีที่สุดที่ฉันสามารถทำได้ตอนนี้


1
คำถามคือDoes anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?
เอียน

ขอบคุณ ตอนนี้ผมกำลังพยายามที่จะคิดออกเป็นวิธีที่เบราว์เซอร์ที่จะทำมัน ... 'V' เป็นตัวอักษรผิดปกติที่น่าแปลกใจ ....
ปีเตอร์ C

@Ian - ถ้าอย่างนั้น [(1 ^ 11 << 1) + 1 + 1 + 1 + 1] จะทำอย่างไร?
ประสิทธิภาพ

@JanDvorak - ฉันไม่มี FF ในขณะนี้ มันประเมินอะไร? หากฉันอาจจะเกรงใจอย่างมากที่จะถามนั่นคือ
ประสิทธิภาพ

@enhzflep ขอโทษฉันหมายถึง "ที่จะไม่ทำงานใน Chrome บนมืออื่น ๆ"
จอห์น Dvorak

4

สำหรับกรณีการใช้งานทั่วไปหากการใส่ตัวอักษรไม่ได้เป็นเรื่องที่น่ากังวลมากนักฉันอาจมีแนวโน้มที่จะโกงนิดหน่อย

สร้างฟังก์ชั่น "c" ซึ่งเปลี่ยนตัวเลข 0 .. 25 เป็นตัวละคร

c=function(v){for(var i in window){for(var ci in i){if(parseInt(i[ci],(10+11+11)+(1<<1)+(1<<1))==(v+10)){return i[ci]}}}};

เพื่อเหตุผลด้านประสิทธิภาพให้ทำการแคชตัวอักษรล่วงหน้าหากคุณต้องการ

l=[];for(var i=0; i<(11+11)+(1<<1)+(1<<1);i++){l[i]=c(i);}

ในคอนโซล Chrome อาร์เรย์ผลลัพธ์จะเป็นดังนี้:

> l;
["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "K", "l", "m", "n", "o", "p", "q", "r", "S", "t", "u", "v", "w", "x", "y", "Z"]

ดังนั้น ... คุณวีl[10+10+1]อาจจะ

อีกวิธีหนึ่ง, การแก้ปัญหาทั่วไปเช่นนี้:

p=(function(){10%11}+[])[1+11+(1<<1)]; // "%"
u=(function(){club=1}+[])[1+11+(1<<1)]; // "u"
vc=p+u+(0+[])+(0+[])+((111>>1)+11+10+[]); // "%u0076"
unescape(vc);

หรือสำหรับปัญหาเฉพาะนี้อาจเป็นเพียงแค่:

(function(){v=1}+[])[10+(1<<1)]; // "v"

3

สิ่งนี้ให้ av ใน Chrome:

Object.getOwnPropertyNames(Object)[17][3];

และสิ่งนี้ทำได้ใน Firefox:

Object.getOwnPropertyNames(Object)[9][3]

พวกเขาทั้งคู่ดึงมันออกมาObject.prototype.preventExtensions()ดังนั้นคุณอาจหาวิธีข้ามเบราว์เซอร์เพื่ออ้างอิงวิธีนั้น (เป็นชื่อเพียง 17 ตัวอักษรใน Object.Prototype for starters)

อย่าลังเลที่จะสร้างเวอร์ชั่นที่ยุ่งเหยิงกว่านี้และให้เครดิตทั้งหมดกับตัวคุณเองฉันหมดเวลา)


2

ในโครเมี่ยม, การแสดงออก([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])ประเมิน"function test() { [native code] }"ที่[1^11<<1]ประเมิน 23 (ผู้ประกอบการระดับบิตสาเหตุตัวแปรที่จะตัดออกไป 32 บิต)


คำถามคือDoes anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?
เอียน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.