[CodeEngn] Basic RCE – Level 10

http://codeengn.com/challenges/basic/10

After finding the OEP, find the OPCODE of the branch instruction going to the “goodboy routine”
The solution should be in this format : OEP + Serial
EX) 00400000EB03

Kiểm tra bằng PEiD, Packer là ASPack 2.000. Google cách unpack, ta có các thao tác sau để đến OEP:

  1. F8, chuột phải ESP > Follow in Dump.
  2. Quét chọn 2 byte đầu, chuột phải > Breakpoint > Hardware, on access > Word.
  3. F9, F8, F8, F8.

Ta đã dừng tại OEP = 00445834:

Chuột phải > Search for > All referenced text strings, thấy ngay goodboy. Nhấn vào để tìm câu lệnh nhảy quyết định:

Nó nằm ở 004454D4, với OPCODE = 75 55.

→ flag = 004458347555.

 

[CodeEngn] Basic RCE – Level 09

http://codeengn.com/challenges/basic/09

Find the StolenByte
Ex) 75156A0068352040

Kiểm tra bằng PEiD ta thấy Packer là UPX. Đặt BP tại câu lệnh JMP huyền thoại ở 00407387, F9, F8:

Một dãy dài những dòng bị NOP chính là các byte ta cần tìm, vì hàm MessageBoxA nhận đầu vào là 4 tham số chứ không phải 1. Quay về 00407387:

Ta thấy từ 0040737A đến 00407384 là rác, còn lại có 3 lệnh PUSH ở trên phù hợp những thứ ta đang tìm. Nếu thử ghi đè những byte đó vào các dòng bị NOP ở trên, ta thấy chúng trùng khớp:

→ flag = 6A0068002040006812204000.

 

[CodeEngn] Basic RCE – Level 07

http://codeengn.com/challenges/basic/07

Assuming the drive name of C is CodeEngn, what does CodeEngn transform into in the process of the serial construction

Lần theo goodboy, ta thấy đoạn mã kiểm tra như sau:

Có thể đọc code, cũng có thể debug, ta có được trình tự thực hiện:

  1. Lấy DriveName của ổ C (biến X)
  2. Ghép với xâu 4562-ABEX
  3. Thực hiện 2 lần thao tác: Tăng 1 đơn vị của mã ASCII đối với 4 ký tự đầu của X. Như vậy về bản chất là tăng 2 đơn vị.

Các quá trình sau không còn thuộc về yêu cầu của bài này, chúng ta sẽ bỏ qua. Bước 2 cũng không liên quan trực tiếp đến X, ta cũng bỏ qua.

Như vậy: CodeEngn được chuyển thành EqfgEngn.

→ flag = EqfgEngn.

[OverTheWire] Natas – Level 22

http://natas22.natas.labs.overthewire.org/

only admins can reveal the password…

Nhấn View sourcecode:

Do không hiểu cơ chế của cái hàm header() nên mình rơi vào bế tắc, rất cảm ơn Nam Tóc Xù đã hint mình bài này sweet_kiss

Thực chất vấn đề redirect bằng header() như trên do phía trình duyệt xử lý, chứ không phải là server redirect trực tiếp. Hay nói cách khác, toàn bộ nội dung của file trước khi redirect vẫn được tải về chứ không hề bị ngắt sau khi gọi hàm header(). Ta có thể dễ dàng kiểm tra điều này bằng cách xem tab Network trong Web Developer Tools của trình duyệt.

Để nhận nội dung mà không redirect, ta có thể dùng curl ở chế độ mặc định:

You are an admin. The credentials for the next level are:<br><pre>Username: nata
s23
Password: D0vlad33nQF0Hz2EP255TP5wSW9ZsRSE

→ flag = D0vlad33nQF0Hz2EP255TP5wSW9ZsRSE.

[OverTheWire] Natas – Level 21

http://natas21.natas.labs.overthewire.org/

Note: this website is colocated with http://natas21-experimenter.natas.labs.overthewire.org

You are logged in as a regular user. Login as an admin to retrieve credentials for natas22.

Nhấn View sourcecode:

Thua, đố làm được emo_popo_beat_plaster

Chuyển qua trang kia và chú ý ở:

Xong, còn có thể mong chờ một bài dễ hơn được nữa ở level này không hả trời surrender

Rõ ràng ta có thể edit cái form submit để trang thứ 2 này lưu $_SESSION với các giá trị tùy ý, trong khi trang 1 lại dùng chung session với trang 2. Thế là emo_popo_look_down

  1. Submit trang 2 với một thuộc tính có name:value = admin:1
  2. Đổi biến PHPSESSID của trang 1 thành PHPSESSID của trang 2.
  3. Done.
You are an admin. The credentials for the next level are:

Username: natas22
Password: chG9fbe1Tq2eWVMgjYYD1MsfIvN461kJ

→ flag = chG9fbe1Tq2eWVMgjYYD1MsfIvN461kJ.

[OverTheWire] Natas – Level 20

http://natas20.natas.labs.overthewire.org/

You are logged in as a regular user. Login as an admin to retrieve credentials for natas21.

Nhấn View sourcecode:

Chúng ta sẽ đi lần lượt theo quy trình xử lý của bài này. Đầu tiên khi ta submit form login:

Quá trình set giá trị cho biến $_SESSION được thực hiện qua hàm mywrite(), đáng chú ý ở:

Tức là giá trị của biến $_SESSION sẽ được lưu vào file thành 1 dòng. Sau đó là quá trình đọc thông tin login của user:

Thao tác lấy giá trị được đảm nhiệm bởi hàm myread():

Có một điểm đặc biệt là, nếu xét đúng bản chất, biến $_SESSION chỉ có thể chứa một thuộc tính có tên là name, tuy nhiên ở hàm myread(), code vẫn đọc từng dòng từ file để gán giá trị, và nó dẫn đến một cánh cửa vô cùng sáng cho ta lao vào, đó là inject ký tự xuống dòng vào username để tạo ra một thuộc tính 2 trong 1 khi đưa vô file still_dreaming

Kết quả:

You are an admin. The credentials for the next level are:<br><pre>Username: nata
s21
Password: IFekPyrQXftziDEsUr3x21sYuahypdgJ

→ flag = IFekPyrQXftziDEsUr3x21sYuahypdgJ.

[OverTheWire] Natas – Level 19

http://natas19.natas.labs.overthewire.org/

This page uses mostly the same code as the previous level, but session IDs are no longer sequential…

Please login with your admin account to retrieve credentials for natas20.

Không có View sourcecode, tuy nhiên dựa vào lời tựa, ta có thể hiểu là nó cũng tương tự bài 18, chỉ khác là giá trị của PHPSESSID sẽ không còn đơn giản nữa.

Thử login với:

username:password = yeuchimse:123456

Kiểm tra cookie:

PHPSESSID=3334332d7965756368696d7365

Khá giống một xâu HEX, decode:

343-yeuchimse

Đơn giản đến không ngờ. Như vậy ta chỉ cần dò giống hệt bài trước, khác mỗi cái cơ chế encode của biến PHPSESSID:

Kết quả là ta tìm được admin tại id = 176

→ flag = eofm3Wsshxc5bwtVnEuGIlr7ivb9KABF.