2015-01-10 16 views
7

Tôi đã xem qua một số mã eval:Javascript eval - obfuscation?

eval('[+!+[]+!+[]+!+[]+!+[]+!+[]]'); 

Mã này tương đương với số nguyên 5.

gì được kiểu này mà gọi? Tôi đã thử tìm kiếm trên web nhưng tôi dường như không thể tìm ra điều này được đề cập đến. Tôi thấy điều này rất thú vị và muốn biết nơi/làm thế nào người ta học cách in những thứ khác nhau thay vì chỉ là số nguyên 5. Chữ cái, ký hiệu và vv Vì tôi không thể chỉ định một mẫu trong mã tôi đã có 0 thành công từ và thêm vào nó để tạo ra các kết quả khác nhau.

Đây có phải là một số loại obfuscation không?

+0

@thefourtheye Ok, tôi đã sửa lỗi :-) – Mouser

+0

Tôi quen với ngôn ngữ đó (quen thuộc như tôi đã đọc/đọc về nó). Mã eval này đặc biệt là Javascript. Trừ khi tôi bị nhầm lẫn, và có khả năng là, Javascript và brainf *** không có mối quan hệ. Brainf *** là một ngôn ngữ bí truyền không sử dụng thực sự nào ngoài giải trí. Mặc dù trong trường hợp này, điều này đối với tôi là hoàn toàn cho giải trí là tốt. Có lẽ một chút kiến ​​thức. – odran037

Trả lời

8

này loại obfuscation, eval() sang một bên, được biết đến như obfuscation Non-chữ và số. Để được hoàn toàn không tự chữ và số, các eval sẽ phải được thực hiện bởi mảng xây dựng nguyên mẫu chức năng và ký hiệu subscript:

[]["sort"]["constructor"]("string to be evaled"); 

Những chuỗi này sau đó được chuyển đổi sang hình thức không tự chữ và số.

AFAIK, lần đầu tiên được đề xuất bởi Yosuke Hosogawa vào khoảng năm 2009. Nếu bạn muốn nhìn thấy nó hoạt động, hãy xem công cụ này: http://www.jsfuck.com/

Nó không được coi là một loại obfuscation tốt vì nó dễ dàng đảo ngược lại mã nguồn ban đầu, mà không cần phải chạy mã (tĩnh) . Plus, nó làm tăng kích thước tập tin rất nhiều.

Nhưng đó là một hình thức thú vị của sự làm xáo trộn khám phá sự ép buộc loại JavaScript. Để tìm hiểu thêm về bản trình bày này, tôi giới thiệu bản trình bày này, trang trình bày 33: http://www.slideshare.net/auditmark/owasp-eu-tour-2013-lisbon-pedro-fortuna-protecting-java-script-source-code-using-obfuscation

2

Để có được giá trị như 5, khái niệm cần phải có được như thế này

+[!+[] + !+[] + !+[] + !+[] + !+[]] 

Chúng ta hãy phân tích các yếu tố phổ biến đầu tiên. !+[].

  1. Một mảng trống trong JavaScript được coi là Sai.

  2. + điều hành áp dụng cho một mảng đen, sẽ cố gắng chuyển nó sang một số và vì nó là trống rỗng, JavaScript sẽ đánh giá nó để 0.

  3. ! điều hành chuyển đổi 0 để true.

Vì vậy,

console.log(!+[]); 

sẽ in true. Bây giờ, khái niệm có thể được giảm như thế này

+[true + true + true + true + true] 

Kể từ true được coi là 1 trong các biểu thức số học, khái niệm thực tế trở nên

+[ 5 ] 

Nhà điều hành + cố gắng để chuyển đổi các mảng ([ 5 ]) vào một số lượng và kết quả trong 5. Đó là lý do tại sao bạn đang nhận được 5.

+0

Câu hỏi đặt ra là kỹ thuật này được gọi là gì (nếu có), không phải là cách thức hay lý do nó hoạt động. – Ixrec

+0

Đúng, nhưng vẫn hữu ích. Tôi không nghĩ nó là đúng sự thật .. Mặc dù tôi cho rằng có một số phương pháp sắp xếp mọi thứ để lấy số 5. ​​Hoặc bất kỳ số nào cho vấn đề đó. Câu hỏi hơn là làm thế nào để có được các số nguyên, chữ cái và ký hiệu khác. – odran037

1

Tôi không biết bất kỳ thuật ngữ nào được sử dụng để mô tả loại mã này, ngoài việc "lạm dụng eval()".

Tôi tìm thấy điều này rất thú vị và muốn biết nơi/làm thế nào một học cách in những thứ khác nhau thay vì chỉ các số nguyên 5. Letters, biểu tượng và vv Vì tôi không thể ghim điểm một mô hình trong đó mã tôi đã có 0 thành công lấy từ và thêm vào nó để làm cho kết quả khác nhau .

Phần này tôi có thể trả lời một phần ít nhất. Các eval() bạn dán dựa rất nhiều vào các quy tắc cưỡng chế kiểu lạ của Javascript. Có các trang trên web mô tả nhiều hậu quả lạ lùng của các quy tắc ép buộc mà bạn có thể dễ dàng tìm kiếm.Nhưng tôi không thể tìm thấy bất kỳ tham chiếu nào về cưỡng chế kiểu với mục tiêu cụ thể của việc tạo ra "đáng ngạc nhiên" từ những thứ như eval(), trừ khi bạn đếm số this video by Destroy All Software (phần Javascript bắt đầu lúc 1:20). Hầu hết trong số họ dễ hiểu tập trung vào cách tránh các lỗi lạ trong mã của bạn. Vì mục đích của bạn, tôi tin rằng những điều hữu ích nhất mà tôi biết là:

  • ! toán tử sẽ chuyển đổi bất kỳ thứ gì thành boolean.
  • Toán tử + đơn nhất sẽ chuyển đổi mọi thứ thành một số.
  • Toán tử nhị phân + sẽ ép buộc đối số của nó thành số hoặc chuỗi trước khi thêm hoặc ghép chúng. Thông thường nó sẽ chỉ đi với chuỗi nếu một hoặc đối số khác đã là một chuỗi, nhưng có những ngoại lệ.
  • Các số nguyên đầu ra của toán tử bit, bất kể đầu vào là gì.
  • Việc chuyển đổi thành số phức tạp. Booleans sẽ đi tới 0 hoặc 1. Strings sẽ cố gắng sử dụng parseInt(), hoặc tạo ra NaN nếu thất bại. Tôi quên phần còn lại.
  • Chuyển đổi đối tượng thành chuỗi hoặc số sẽ gọi phương thức "toString" hoặc "toValue" tương ứng, nếu có.

Bạn hiểu ý tưởng. Câu trả lời của thefourtheye hướng dẫn chính xác cách các quy tắc này áp dụng cho ví dụ bạn đưa ra. Tôi thậm chí không cố gắng tóm tắt những gì xảy ra khi Ngày, Chức năng, và Regexps có liên quan.

Đây có phải là một số loại obfuscation không?

Thông thường bạn chỉ đơn giản là nhận được obfuscation miễn phí như là một phần của minification, vì vậy tôi không biết tại sao ai đó sẽ viết trong mã sản xuất thực (giả sử đó là nơi bạn tìm thấy nó).

+0

Điều này giúp ích. Không biết nó được gọi là gì hay bất cứ điều gì về nó thực sự, làm cho việc tìm kiếm và tìm thứ gì đó thậm chí từ xa cũng gần như khó khăn. Tôi không thể nhớ mình đã tìm thấy ở đâu. Nhưng tôi đã xem qua trang web này: http://blog.mgechev.com/about/ Mã đánh giá của anh ấy in tên anh ấy. Tôi cũng không thể hiểu tại sao điều này sẽ được sử dụng trong sản xuất. – odran037

4

Được gọi là JavaScript không phải là chữ và số và có thể do khả năng cưỡng chế loại JavaScript. Thực tế, có một số cách để gọi eval/Chức năng mà không cần phải sử dụng ký tự alpha:

[]["filter"]["constructor"]('[+!+[]+!+[]+!+[]+!+[]+!+[]]')() 

Sau khi bạn thay thế chuỗi "bộ lọc" và "xây dựng" Cơ quan Đại diện phi tự chữ và số bạn có đầy đủ chữ và số phi JavaScript của bạn.

Nếu bạn muốn chơi với điều này, có một trang web nơi bạn có thể làm điều đó: http://www.jsfuck.com/.

Kiểm tra https://github.com/aemkei/jsfuck/blob/master/jsfuck.js này cho ví dụ khác như sau:

'a': '(false+"")[1]', 
'b': '(Function("return{}")()+"")[2]', 
'c': '([]["filter"]+"")[3]', 
...