[Writeup] [DIMVA CTF 2013] Trivia II (50)

Standard

Lời nói đầu

Nội dung chính

Truy cập:

http://dimvactf.0x90.eu:8002/

Hiện ra một thư mục, trong đó có 1 file crapchecker.php kích thước ~1KB. Nhấn vào file đó, ra trang mới.

Có một form để nhập, chỉ bao gồm 1 textbox. Đại loại là ta input một xâu x, server trả về một xâu y. Mục tiêu của ta là xâu y phải = 10000000.

Thử check bằng một vài trường hợp, nhận thấy y thay đổi rất chóng mặt dù x chỉ thay đổi đôi chút. Với x = ”, y = 0000000

Suy nghĩ… suy nghĩ… với một file PHP có kích thước nhỏ như vậy, thì bên trong không thể có gì đó cao siêu được. Thử tìm các hàm mã hóa có sẵn trong php, mà không ra (search ngu không chịu được >”<).

Mà đã không ra, thì chuyển cách khác. Nhập đại dài thật dài, đến một mức nào đó, nhận ra y không thay đổi nữa dù có nhập thêm bất cứ cái gì. Dừng ở:

x=101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010
y=410102d

Tiến hành thay đổi dần dần các ký tự ở cuối (mò dần thôi chứ biết làm sao), nhận thấy ký tự thứ 2 từ cuối trở lại trong xâu x ảnh hưởng trực tiếp đến ký tự thứ 2 từ cuối trở lại trong xâu y.

x=101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000
y=410101d

Tương tự như vậy, phát hiện ra các ký tự tiếp theo tính từ cuối lên trong xâu x sẽ lần lượt ảnh hưởng trực tiếp đến các ký tự ở vị trí sau trong xâu y:

410101d

Lưu ý rằng chúng ta cũng có thể giảm gián tiếp các ký tự ở bên trái của những ký tự màu đỏ, vì chúng giảm đều đặn từng bước 1. Ví như 41 giảm 1 còn 40, 40 giảm 1 còn 3f.

Ngoài ra, vì x là tham số của url, chúng ta có thể thay ‘0’ = %30, như vậy sẽ dễ giảm giá trị để kiểm tra hơn.

Sau một hồi tăng giảm nhẹ nhàng, nhận được kết quả:

x=10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010%00///
y=100000d

Ok, dấu chấm hết cho một kỷ nguyên và cũng là bắt đầu cho một tình duyên mới. Vấn đề đặt ra là ta cần thay đổi được ký tự cuối cùng trong y.

Với x có length = 132, việc thử từng trường hợp sẽ không khả thi. Code một cái hàm nhỏ để thay từng ký tự trong x và kiểm tra kết quả y trả về. Quan trọng là d cần phải được thay bằng 0, đồng thời các giá trị khác không thể quá lớn – bởi giả như thu được y = 4101520 thì ta cũng không làm sao giảm được 52 về 00 (khoảng cách = 0x52), khi mà lượng giảm tối đa của ta cũng chỉ là:

'1' - '' = 0x31 - 0x00 = 0x31

Tuy nhiên, thật may mắn rằng điểm sáng đã xuất hiện:

x=10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101a
y=4101030

Với y thế này, khả năng về 1000000 là rất khả quan, và cuối cùng thì…

x=10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010%00%2F.a

Kết quả:

Your target is: 1000000
We received: 1000000

But you are in! Your flag is c0ffee1613278e04a0a96c9417653af9

Lời giải tốt hơn

Tóm tắt

  1. Test input = 123, nhận được y = 4f68465.
  2. Duyệt các hàm hash có sẵn trong PHP, kiểm tra xem với input = 123 thì output trả về có bắt đầu bằng y hay không:
    <?php
    $arr=hash_algos();
    for($i=0;$i<count($arr);$i++){
        if(preg_match('/^4f68465/', hash($arr[$i],"123")))
            echo $arr[$i]."\n";
    }
    ?>
  3. Tiến hành brute force, nhận được x = 460825513:
    <?php
    for($i=1;$i<9999999000;$i++){
       if(preg_match('/^1000000/', hash("salsa20",$i)))
            echo $i."::::::::".hash("salsa20",$i)."\n";
    }
    ?>

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s