kangsecu's B1og

[wargame.kr] strcmp 문제풀이 본문

Web Hacking/wargame.kr

[wargame.kr] strcmp 문제풀이

Kangsecu 2018. 2. 18. 02:18

[wargame.kr] 에 strcmp 문제를 풀어보도록 하겠습니다.

문제에서 만약 너가 strcmp를 우회하는걸 안다면 너는 flag를 얻을 수 있어! 라고 합니다.

Start를 누르면 이러한 화면이 출력됩니다. 소스를 보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
    require("../lib.php"); // for auth_code function
 
    $password = sha1(md5(rand().file_get_contents("/var/lib/dummy_file")).rand());
 
    if (isset($_GET['view-source'])) {
        show_source(__FILE__);
        exit();
    }else if(isset($_POST['password'])){
        sleep(1); // do not brute force!
        if (strcmp($_POST['password'], $password== 0) {
            echo "Congratulations! Flag is <b>" . auth_code("strcmp") ."</b>";
            exit();
        } else {
            echo "Wrong password..";
        }
    }
 
?>
<br />
<br />
<form method="POST">
    password : <input type="text" name="password" /> <input type="submit" value="chk">
</form>
<br />
<a href="?view-source">view-source</a>
cs

이렇게 코드가 있습니다. 랜덤값으로 password를 가져오는데 입력값이 password와 같아야 문제가 해결됩니다. brute force를 광속으로 하지 않는 이상 거의 불가능에 가깝습니다. 하지만 strcmp함수의 취약점을 이용하면 쉽게 문제해결이 가능합니다. strcmp 함수는 문자열과 배열을 비교했을때 NULL,0을 반환합니다.

Exploit Vector

strcmp함수는 두 문자열을 비교해서 같을 경우 0을 반환하는데, 문자열과 배열을 비교하면 같지 않더라도 0 을 출력하게 됩니다.


Exploit

하지만 그냥 password[]=123이라는 값을 전송하기엔 post형식이라 싫습니다.

이렇게 name에 password를 배열형식의 password[]로 변경해주면 됩니다. 그럼 자연스럽게 strcmp가 랜덤으로 가져오는 password값과 배열형식의 password[]로 부터 입력받는 값을 비교하여 0을 출력합니다.

strcmp Clear!