Mgnt Uploads 2 Attachment for Product Rnx N150ube Driver
Bài này code giống hệt bài 1, khác mỗi cái là biến op bây giờ cũng không được chứa các ký tự trong mảng ['(',')','[',']','\'','"'] nữa, do đó không thể dùng kiểu +' để break giá trị của value2 ra ngoài chuỗi. Nói cách khác, value1 và value2 đều sẽ chỉ là các string đơn thuần.
Mình search thử thì thấy Python3.6 có một tính năng mới là Formatted cord literals, hoạt động như sau:
Python three.6.1 (v3.half dozen.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 fleck (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> a = 'thirty' >>> f'{a}' 'xxx' >>> f'{0 if two > three else one}' '1' Có thể thấy đây gần như là hướng duy nhất của bài này.
Nếu op = +f, chuỗi được eval sẽ có dạng calc_eval = 'value1'+f'value2' . Tương tự bài i, chúng ta muốn dựa vào output của hàm eval để leak flag, mà output chỉ được in ra khi kết quả eval là số, là 'True' hoặc 'False'. Như thế dẫn đến một số suy luận sau:
- Vì
value1kiểu gì cũng chỉ là chuỗi đơn thuần, nên sau khi eval nó sẽ vẫn là chính nó. Mặt khác,value1không thể là số vì nếu thế,value2cũng phải là số, chẳng có tác dụng gì. Vậy,value1là chữ. - Nếu
value1là chữ, thì kết quả sau khi eval không thể là số, nghĩa là chúng ta chỉ có thể thấy được output nếu eval raTruthfulhoặcFake, thìvalue1cần là một phần củaTruehoặcImitation(ví dụTrhoặcFals, để sau khi kết hợp vớivalue2sẽ ra giá trị hoàn chỉnh). Về lý thuyết chúng ta có thể đểvalue2trả về đầy đủ chuỗiTruehoặcFalse, tuy nhiên đề bài không cho phépvalue1là một chuỗi rỗng. - Dạng biểu thức
f'{0 if 2 > three else 1}'có thể cho phép chúng ta leak flag giống bài 1, kiểu nhưf'{'eastward' if 'MeePwn' in FLAG else 'x'}'. Với biểu thức này, kết hợp vớivalue1 = Truthì khi nhận được output làTruthful, chúng ta kết luận được FLAG có chứa chuỗiMeePwn, và ngược lại.
Tất nhiên ở trên chỉ là ví dụ thôi, vì thực tế đề bài không cho dùng' trong value2. Sau một hồi ngồi nhìn màn hình, mình nghĩ ra một hướng khá là cần cù bù thông minh.
Content-Disposition: form-data; name="value1" Tru ----------954427002 Content-Disposition: grade-information; name="op" +f ----------954427002 Content-Disposition: form-data; name="value2" {source % 101 if source % 77 in FLAG else x} ----------954427002 Content-Disposition: form-information; name="source" %c Output nhận được là Truthful (hợp lý vì FLAG có chứa chữ M trong từ MeePwn).
Nhưng check từng ký tự thì chỉ có thể tìm được charset của FLAG mà thôi, mình cần check được nhiều hơn. Exercise value2 dài tối đa 64 ký tự, mình cố gắng xóa bớt mấy khoảng trắng, được như sau:
Content-Disposition: form-data; proper noun="value1" Tru ----------954427002 Content-Disposition: form-data; proper name="op" +f ----------954427002 Content-Disposition: form-information; proper name="value2" {source%101 if source%77+source%101+source%101 in FLAG else 10} ----------954427002 Content-Disposition: form-data; proper noun="source" %c three ký tự một lúc là khá ổn, đủ để mình tìm được đến MeePwnCTF{python3.six[_strikes_backk. Sau đó thì phát sinh một vấn đề, đó là với 2 ký tự kk, mình tìm được two chuỗi thỏa mãn là kkk và kk}. Cái sau chắc là phần kết của FLAG rồi, nhưng cái đầu thì khá là bế tắc, do không biết cần chính xác bao nhiêu chữ k. Mình có thể thử submit dần luôn trên scoreboard, nhưng ngại nhỡ bị ban thì mang tội với team, còn nếu clone một nick mới để thử thì lại làm tăng số đội giải được, điểm của mình cũng bị ảnh hưởng. Đều không vẹn toàn.
Tự nhiên mình nghĩ đến một hướng, mặc dù đoán là không được nhưng vẫn quyết định thử:
>>> '%c' % 49 * 3 '111'
Kỳ diệu. Mình cứ sợ là nó sẽ thành '%c' % 147.
FLAG: MeePwnCTF{python3.vi[_strikes_backkkkkkkkkkkk)}
P.S: Bài này Jinmo làm theo một cách thực sự rất đẹp và đáng được ngợi ca, mọi người có thể đọc tại đây. Kudos to him!
Source: https://babyphd.net/2018/07/meepwn-ctf-2018-pycalx2/?unapproved=45208&moderation-hash=2e4e62dd9bfff1920dd31505526d92a4
0 Response to "Mgnt Uploads 2 Attachment for Product Rnx N150ube Driver"
Post a Comment