mmapped
3-Cipher
위 두 문제는 내가 공부한 분야도 아니고 대회 끝나기 1시간 전부터 문제를 풀기 시작해서 풀이에 도전하지 않았다.
64se64
문제 코드는 아래와 같다.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Welcome</title>
</head>
<body>
<h1>Welcome! 👋</h1>
<form method="POST">
<input type="hidden" name="64se64_encoding" value="IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwphc2M9WzY4LCA3MiwgMTIzLCA5OCwgMTAxLCA0OCwgNTIsIDU0LCA5OCwgNTUsIDUzLCA1MCwgNTAsIDk3LCA5NywgNTAsIDEwMSwgNTAsIDU2LCAxMDIsIDUwLCA1NSwgNTQsIDEwMSwgNDgsIDk5LCA1NywgNDksIDQ4LCA1MywgNTAsIDQ5LCAxMDIsIDUwLCA1MSwgOTcsIDQ4LCA1MywgNTYsIDU1LCA0OCwgNDgsIDUzLCA5NywgNTYsIDUxLCA1NSwgNTUsIDUxLCA1NSwgNDgsIDk3LCA0OSwgNDksIDEwMSwgNTMsIDEwMSwgNTIsIDEwMCwgOTksIDQ5LCA1MywgMTAyLCA5OCwgNTAsIDk3LCA5OCwgMTI1XQphcnI9WzAgZm9yIGkgaW4gcmFuZ2UoNjgpXQpmb3IgaSBpbiByYW5nZSgwLDY4KToKICAgIGFycltpXT1jaHIoYXNjW2ldKQpmbGFnPScnLmpvaW4oYXJyKQpwcmludChmbGFnKQ==">
</form>
</body>
</html>
value 안에 있는 값을 복사해서 base64로 디코딩하면 아래와 같은 코드가 나온다. 이 코드를 파이썬으로 실행시키면 플래그가 출력된다.
#!/usr/bin/env python3
asc=[68, 72, 123, 98, 101, 48, 52, 54, 98, 55, 53, 50, 50, 97, 97, 50, 101, 50, 56, 102, 50, 55, 54, 101, 48, 99, 57, 49, 48, 53, 50, 49, 102, 50, 51, 97, 48, 53, 56, 55, 48, 48, 53, 97, 56, 51, 55, 55, 51, 55, 48, 97, 49, 49, 101, 53, 101, 52, 100, 99, 49, 53, 102, 98, 50, 97, 98, 125]
arr=[0 for i in range(68)]
for i in range(0,68):
arr[i]=chr(asc[i])
flag=''.join(arr)
print(flag)
phpreg
index.php와 step2.php 코드가 있다. 중요한 부분만 보겠다.
아래의 index.php에서 step2.php 페이지로 post 메소드를 통해 2가지 값을 보낸다.
<form method="post" action="/step2.php">
<input type="text" placeholder="Nickname" name="input1">
<input type="text" placeholder="Password" name="input2">
<input type="submit" value="제출">
</form>
step2.php 코드를 보면 첫번째 입력값은 input_name에 두번째 입력값은 input_pw에 들어간다.
input_pw에 a부터 z까지 A부터 Z까지의 알파벳 대소문자가 존재하는지 확인하고 존재한다면 "alphabet in the pw :(" 문자열을 출력한다.
input_name에 nyang(대소문자 구분 X)이라는 문자열이 들어갔다면 없애고
input_pw에는 특정한 정규 표현식이 들어간다면 "d4y0r50ng"문자열로 치환한다.
마지막 if문에서는 name변수에 "dnyang0310", pw변수에 "d4y0r50ng+1+13"이 들어갔는지 확인한다.
<?php
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$input_name = $_POST["input1"] ? $_POST["input1"] : "";
$input_pw = $_POST["input2"] ? $_POST["input2"] : "";
// pw filtering
if (preg_match("/[a-zA-Z]/", $input_pw)) {
echo "alphabet in the pw :(";
}
else{
$name = preg_replace("/nyang/i", "", $input_name);
$pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8]\!/", "d4y0r50ng", $input_pw);
if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>';
index.php의 input1에 "dnynyangang0310" input2에 "2@123319!+1+13"를 입력하면 step2.php페이지의 cmd라인 코드가 있는 곳으로 접근할 수 있다. 아래는 step2.php의 cmd라인 코드 부분이다.(보기 불편해도 정리하긴 귀찮아서 어쩔 수 없다.)
$cmd = $_POST["cmd"] ? $_POST["cmd"] : "";
if ($cmd === "") {
echo '
<p><form method="post" action="/step2.php">
<input type="hidden" name="input1" value="'.$input_name.'">
<input type="hidden" name="input2" value="'.$input_pw.'">
<input type="text" placeholder="Command" name="cmd">
<input type="submit" value="제출"><br/><br/>
</form></p>
';
}
// cmd filtering
else if (preg_match("/flag/i", $cmd)) {
echo "<pre>Error!</pre>";
}
else{
echo "<pre>--Output--\n";
system($cmd);
echo "</pre>";
}
}
else{
echo "Wrong nickname or pw";
}
}
}
// GET request
else{
echo "Not GET request";
}
?>
입력창(cmd)에 "flag"라는 문자열을 입력하면 "Error"문자열을 출력하기 때문에 "fl*.txt" 등으로 우회해야한다.
일단 flag파일이 어디에 있는지 모르기 때문에 "ls -al ../../../" 명령어를 통해 파일을 찾았다.
"ls -al ../"을 입력하니 dream이라는 디렉터리가 존재하였고 "ls -al ../dream"명령어를 통해 들어가보니 flag.txt 파일이 있었다. "cat ../dream/fl*.txt"명령어로 플래그가 출력된다.
'CTF' 카테고리의 다른 글
EBucket CTF Write up (1) | 2023.04.11 |
---|