NATAS11
현재 기본 데이터의 값은 위와 같다.
if($data["showpassword"] == "yes") {
print "The password for natas12 is <censored><br>";
}
data["showpassword"]의 값이 yes이면 패스워드가 출력될 것이다.
function saveData($d) {
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}
쿠키는 위의 함수에 의해 생성된다.
function xor_encrypt($in) {
$key = '<censored>';
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
XOR 암호화 함수는 위와 같이 정의되어 있다..
data["showpassword"]의 값을 yes로 주기 위해서 먼저 key의 값을 알아내야 한다.
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
쿠키 생성을 위한 함수의 실행 순서는 다음과 같다.
json_encode() -> xor_encrypt() -> base64_encode()
=> base64_decode()의 반환 값과 key를 XOR 연산하면 json_encode()의 반환 값이 나올 것이다.
★ XOR 연산(^)의 특징
A^B=C
A^C=B
-> 이 특징을 통해서
base64_decode()의 반환 값과 json_encode()의 반환 값을 XOR 연산하면 key 값이 나온다는 것을 알 수 있다.
개발자 도구에서 setcookie()에 의해 생성된 쿠키의 값을 확인하고 key를 구하기 위한 PHP 코드를 작성했다.
코드 //(키 값 구하는 코드)
<?php
$defaultdata = json_encode(array( "showpassword"=>"no", "bgcolor"=>"#ffffff"));
$cookie = base64_decode("ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=");
function xor_encrypt($in, $cookie) {
$key = $cookie;
$text = $in;
$outText = '';
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
print xor_encrypt($defaultdata, $cookie);
?>
쿠키값 구하는 코드
<?php
$defaultdata = json_encode(array( "showpassword"=>"yes", "bgcolor"=>"#ffffff"));
function xor_encrypt($in) {
$key = qw8J;
$text = $in;
$outText = '';
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
print base64_encode(xor_encrypt($defaultdata));
?>
'WARGAME > NATAS' 카테고리의 다른 글
overthewire.org[natas] level12->level13 (0) | 2018.01.27 |
---|---|
overthewire.org[natas] level11->level12 (0) | 2018.01.27 |
overthewire.org[natas] level9->level10 (0) | 2018.01.17 |
overthewire.org[natas] level8->level9 (0) | 2018.01.17 |
overthewire.org[natas] level7->level8 (0) | 2018.01.17 |