Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Pycontw2013x

2.647 Aufrufe

Veröffentlicht am

Veröffentlicht in: Technologie
  • Hello there! Get Your Professional Job-Winning Resume Here! http://bit.ly/topresum
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier

Pycontw2013x

  1. 1. . . . . . ........天元突破, 鑽開 Python 的限制TJW @ PyCon Taiwan 20132013-05-26TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 1 / 27
  2. 2. . . . . . .Hacking change my life經歷/學習某些事物會改變「你」數學、程式設計、象棋、魔術、撲克都是Hacking 也是其中之一TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 2 / 27
  3. 3. . . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  4. 4. . . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  5. 5. . . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  6. 6. . . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  7. 7. . . . . . .Back to 90s還在用鴿子傳封包還沒有 Google大學課本都是影印店印的安裝 Linux 要十幾張磁碟片那個時候開源軟體叫做自由軟體X 沒辦法輸入中文TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 4 / 27
  8. 8. . . . . . .CheckIO.orgTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 5 / 27
  9. 9. . . . . . .CheckIO example# Withdraw without any i n c i d e n t# 120 − 10 − 0.5 − 1% = f l o o r (109.4) = 109# 109 − 20 − 0.5 − 1% = f l o o r (88.3) = 88from math import f l o o rdef checkio ( data ) :balance , withdrawal = dataf o r a in (0.5+1.01* x f o r x in withdrawal i f x%5==0):balance = f l o o r ( balance −a ) i f balance >= a e l s e balar e t u r n balancei f __name__ == ’__main__ ’ :a s s e r t checkio ([120 , [10 , 20 , 3 0 ] ] ) == 57# With one I n s u f f i c i e n t Funds , and then withdraw 10 $a s s e r t checkio ([120 , [200 , 1 0 ] ] ) == 109#with one i n c o r r e c t amounta s s e r t checkio ([120 , [3 , 1 0 ] ] ) == 109a s s e r t checkio ([120 , [200 , 1 1 9 ] ] ) == 120p r i n t ( ’ A l l Ok ’ )TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 6 / 27
  10. 10. . . . . . .CheckIO example2# Withdraw without any i n c i d e n t# 120 − 10 − 0.5 − 1% = f l o o r (109.4) = 109# 109 − 20 − 0.5 − 1% = f l o o r (88.3) = 88# 88 − 30 − 0.5 − 1% = f l o o r (57.2) = 57c l a s s X( o b j e c t ) :def __eq__( s e l f , n ) : r e t u r n Truedef __ne__( s e l f , n ) : r e t u r n Falsedef checkio ( x ) : r e t u r n X()i f __name__ == ’__main__ ’ :a s s e r t checkio ([120 , [10 , 20 , 3 0 ] ] ) == 57# With one I n s u f f i c i e n t Funds , and then withdraw 10 $a s s e r t checkio ([120 , [200 , 1 0 ] ] ) == 109#with one i n c o r r e c t amounta s s e r t checkio ([120 , [3 , 1 0 ] ] ) == 109a s s e r t checkio ([120 , [200 , 1 1 9 ] ] ) == 120p r i n t ( ’ A l l Ok ’ )TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 7 / 27
  11. 11. . . . . . .限制TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 8 / 27
  12. 12. . . . . . .CheckIO get shellget=lambda x , n : [ i f o r i in x i f i .__name__==n ] [ 0 ]x =(). __class__ .__base__. __subclasses__ ()CDLL=get ( x , ’CDLL ’ )CDATA=get ( x , ’_CData ’ )cx=CDATA. __subclasses__ ()csx=get ( cx , ” _SimpleCData ” ) . __subclasses__ ()c_char_p=get ( csx , ” c_char_p ” )c_int=get ( csx , ” c_int ” )l i b c=CDLL( ” / l i b 6 4 / l i b c . so .6 ” )#l i b c=CDLL(”/ l i b /x86_64−linux −gnu/ l i b c . so . 6 ” )system=l i b c . systemsystem . argtypes =[c_char_p ]system . r e s t y p e=c_intTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 9 / 27
  13. 13. . . . . . .CheckIO get shell>>> ( ) . __class__<type ’ t u p l e ’>>>> ( ) . __class__ .__base__<type ’ o b j e c t ’>>>> ( ) . __class__ .__base__. __subclasses__ ()?TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 10 / 27
  14. 14. . . . . . .CheckIO get shell>>> ( ) . __class__<type ’ t u p l e ’>>>> ( ) . __class__ .__base__<type ’ o b j e c t ’>>>> ( ) . __class__ .__base__. __subclasses__ ()[< type ’ type ’ >, <type ’ weakref ’ >, <type ’ w e a k c a l l a b l e p r o x y ’, <type ’ i n t ’ >, <type ’ b a s e s t r i n g ’ >, <type ’ b y t e a r r a y ’ >, <tyoneType ’ >, <type ’ NotImplementedType ’ >, <type ’ traceback ’ >,e ’ xrange ’ >, <type ’ d i c t ’ >, <type ’ s e t ’ >, <type ’ s l i c e ’ >, <<type ’ complex ’ >, <type ’ f l o a t ’ >, <type ’ b u f f e r ’ >, <type ’ los e t ’ >, <type ’ property ’ >, <type ’ memoryview ’ >, <type ’ t u p l e, <type ’ r e v e r s e d ’ >, <type ’ code ’ >, <type ’ frame ’ >, <type ’TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 11 / 27
  15. 15. . . . . . .防止?.......邏輯TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 12 / 27
  16. 16. . . . . . .是圖http://www.flickr.com/photos/theklan/1361277704/ CC-SA授權TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 13 / 27
  17. 17. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  18. 18. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  19. 19. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  20. 20. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  21. 21. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  22. 22. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  23. 23. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  24. 24. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  25. 25. . . . . . .Python 語言規範Python 語言規範以及 CPython 實作很嚴格禁止吃任何垃圾食物所以,怎麼辦到的。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27
  26. 26. . . . . . .Python 語言規範Python 語言規範以及 CPython 實作很嚴格禁止吃任何垃圾食物所以,怎麼辦到的。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27
  27. 27. . . . . . .想法 1Egg 檔其實是 zip所以 Python 其實是可以執行 zip 檔的不過 Jar 跟 egg 無法共存TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 16 / 27
  28. 28. . . . . . .其他一些常識zip 和 rar 會忽略檔頭zip, rar, gif 會忽略尾巴jar 和 egg 格式在尾巴有點衝突ruby -x, perl -x 會忽略檔頭html 只管 <html> </html>中間的東西TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 17 / 27
  29. 29. . . . . . .所以很容易圖檔/影片檔藏壓縮檔外加再藏個 html壓縮檔可以是個 jar 或 egg圖檔/影片/壓縮檔後面可以藏 ruby 或 perljar 後面也可以藏 ruby, perlTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 18 / 27
  30. 30. . . . . . .GIFHeader: GIF89a|width|height外加一堆 LZW 壓縮區塊最後有個結尾區塊TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 19 / 27
  31. 31. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?會出現 GIF89a 未知變數錯誤那 Width: ’=0’, Height: ’x00x01’ 如何?Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  32. 32. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?會出現 GIF89a 未知變數錯誤那 Width: ’=0’, Height: ’x00x01’ 如何?Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  33. 33. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?會出現 GIF89a 未知變數錯誤那 Width: ’=0’, Height: ’x00x01’ 如何?Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  34. 34. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?會出現 GIF89a 未知變數錯誤那 Width: ’=0’, Height: ’x00x01’ 如何?Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  35. 35. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?會出現 GIF89a 未知變數錯誤那 Width: ’=0’, Height: ’x00x01’ 如何?Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  36. 36. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?會出現 GIF89a 未知變數錯誤那 Width: ’=0’, Height: ’x00x01’ 如何?Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  37. 37. . . . . . .解法CPython 的 parser 怎麼處理 “x00”?因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)所以會和下一行連在一起。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
  38. 38. . . . . . .解法CPython 的 parser 怎麼處理 “x00”?因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)所以會和下一行連在一起。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
  39. 39. . . . . . .解法CPython 的 parser 怎麼處理 “x00”?因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)所以會和下一行連在一起。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
  40. 40. . . . . . .HeadTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 22 / 27
  41. 41. . . . . . .TailTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 23 / 27
  42. 42. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  43. 43. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  44. 44. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  45. 45. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  46. 46. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  47. 47. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  48. 48. . . . . . .TetrisR=range ;W,H=10 ,20;E={198:0 x 7 f f f , 4 6 : 0 xff00 ,39:255 ,102:0 x f f f f,71:0 x f f f f 0 0 ,108:0 x f f 0 0 f f , 1 5 : 0 xff0000 };B=[[15 i f j==H e l s e 0]*W+[15]*3 f o r j inR(H+3)]; S=n=0; import sys , random as C;C=C. choice ; e =[1];O=lambda : ( lambda Z : ( [ ( z/4+1 , z&3) f o r z in R(8) i f (Z>>z )&1] ,3 , −2 ,Z ) ) (C(E . keys ( ) ) ) ; P,X,Y, Z=O( ) ;T=USEREVENT+1L=lambda P,X,Y : [ 1 f o r ( i , j ) in P i f B[ j+Y ] [ i+X ] ] ; d=d i s p l a y ; i n i t ( ) ; F=d . set_mode ((400 ,800)); time . set_timer (T, 1 0 0 ) ;w=key . get_pressed ; a=”GAME OVER, score ”while (d . f l i p () or e . __setitem__ (0 , event . wait ( ) . type ) or e [0])!= QUIT :i f e[0]==T:K=w( ) ;U=X+(−1 i f K[K_LEFT] e l s e (1 i f K[K_RIGHT] e l s e 0 ) ) ;V=Y+1 i f K[K_DOWN] e l s e Y;Q=[( j ,3− i ) f o r i , j in P] i f K[K_UP] e l s e P ; ( P,X,Y)=(P,X,Y) i f L(Q,U,V) e l s e (Q,U,V) ; n%5 or L(P,X,Y+1)and (Y<0 and sys . e x i t ( a+‘S ‘ ) or [B[ j+Y ] . __setitem__( i+X, Z) f o r i , j in P ] ) ; ( P,X,Y, Z)=(P,X,Y, Z) i f n%5 e l s e (O() i f L(P,X,Y+1) e l s e (P,X,Y+1,Z ) ) ; n+=1;D=[z f o r z in B [ : H] i f 0 in z]+B[H : ] ; l=le n ; s=l (B)−l (D) ; ( S ,B)=(S+2**s , [ B[−1][:] f o r j in R( s )]+D) i f s e l s e (S ,B ) ; [ draw . r e c t (F , E [ Z ] i f ( i−X, j−Y) in P e l s e c , ( (i *40 , j *40) ,(40 ,40))) f o r i , j , c in [ ( z%W, z/W, E . get (B[ z/W] [ z%W] , 0 ) ) f o r z in R(W*H ) ] ]TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 25 / 27
  49. 49. . . . . . .One More Example.......用 ctypes 以下犯上TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 26 / 27
  50. 50. . . . . . .The End.Thanks and Question?........My Blog: http://weijr-note.blogspot.comTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 27 / 27

×