pico-CTF1(공개용)
6142 단어 picoCTF
pico CTF
이 CTF는 초보자를 위한 상설 CTF입니다.
3개월 동안 꾸준히 해 왔는데, 그중에서도 좋은 해법이 있다. 총결산 가치가 있는 것을 고르는 것이다.
logon(web)
해본 일
사용자 이름과 암호를 입력한 로그인 양식이 있습니다.
SQL 주입 같은 걸 쳤는데 주입할 수 있는 것 같아서 통과했어요.
하지만 flag이 표시되지 않습니다.
이어 잡다한username과password를 시도해 보았고 인증도 통과했지만 flag는 없었다.
입력은 상관없다는 것을 알게 된 것이다.
페이지의 스크립트를 보고 pico로 검색해도 flag이 나오지 않았어요. 어떻게 해야 할지 몰라서 찾아봤어요.
해법
Edit this cookie라는 Chrome의 확장 기능을 사용하여username과password 외에도 admin 정보가 기록되어 있으므로 True로 읽어 넣으면 flag이 표시됩니다.
"Where are the robots"(web)
해본 일
이 문제의 홈페이지에 입력 형식은 표시되지 않고 칠흑 같은 화면에 빨간색 문자로welcome를 표시하고 흰색 문자로?그냥 써있어요.
배경색과 문자가 동화될 가능성을 느껴 CSS의 색상 설정을 바꾸려 했지만 아무것도 보이지 않았다.
또 내용이 다시 뒷면으로 돌아갈지 여부를 고려해 순서를 바꿔 봤지만 아무것도 바뀌지 않았다.
해법
robots.txt 파일이란 검색엔진 클로라가 클로라가 웹사이트에서 어떤 페이지나 파일을 요청할 수 있는지 또는 요청할 수 없는지 알게 하는 것(Google Search Constore 도움말)
이 기능을 사용하여 지정된 페이지의 URL/robots입니다.txt에 접근했습니다.
그리고 거기에 적힌 (요청할 수 없는) 디렉터리에 접근할 때 flag을 발견했습니다.
Client-Side-again(Web)
해본 일
소스 코드를 보고 flag의 요소가 배열에 들어간 것을 확인했습니다.
이후if문구를 사용하여 판정한다.
해법
자바스크립트의 코드 성형 도구를 이용하여 청소를 합니다. var _0x5a46 = ['25df2}', '_again_b', 'this', 'Password Verified', 'Incorrect password', 'getElementById', 'value', 'substring', 'picoCTF{', 'not_this'];
(function (_0x4bd822, _0x2bd6f7) {
var _0xb4bdb3 = function (_0x1d68f6) {
while (--_0x1d68f6) {
_0x4bd822['push'](_0x4bd822['shift']());
}
};
_0xb4bdb3(++_0x2bd6f7);
}(_0x5a46, 0x1b3));
var _0x4b5b = function (_0x2d8f05, _0x4b81bb) {
_0x2d8f05 = _0x2d8f05 - 0x0;
var _0x4d74cb = _0x5a46[_0x2d8f05];
return _0x4d74cb;
};
function verify() {
checkpass = document[_0x4b5b('0x0')]('pass')[_0x4b5b('0x1')];
split = 0x4;
if (checkpass[_0x4b5b('0x2')](0x0, split * 0x2) == _0x4b5b('0x3')) {
if (checkpass[_0x4b5b('0x2')](0x7, 0x9) == '{n') {
if (checkpass[_0x4b5b('0x2')](split * 0x2, split * 0x2 * 0x2) == _0x4b5b('0x4')) {
if (checkpass[_0x4b5b('0x2')](0x3, 0x6) == 'oCT') {
if (checkpass[_0x4b5b('0x2')](split * 0x3 * 0x2, split * 0x4 * 0x2) == _0x4b5b('0x5')) {
if (checkpass['substring'](0x6, 0xb) == 'F{not') {
if (checkpass[_0x4b5b('0x2')](split * 0x2 * 0x2, split * 0x3 * 0x2) == _0x4b5b('0x6')) {
if (checkpass[_0x4b5b('0x2')](0xc, 0x10) == _0x4b5b('0x7')) {
alert(_0x4b5b('0x8'));
}
}
}
}
}
}
}
} else {
alert(_0x4b5b('0x9'));
}
}
javascript의 밑줄은 자주 사유 변수로 정의됩니다.
몇 가지 세부적인 의문
var _0x5a46 = ['25df2}', '_again_b', 'this', 'Password Verified', 'Incorrect password', 'getElementById', 'value', 'substring', 'picoCTF{', 'not_this'];
(function (_0x4bd822, _0x2bd6f7) {
var _0xb4bdb3 = function (_0x1d68f6) {
while (--_0x1d68f6) {
_0x4bd822['push'](_0x4bd822['shift']());
}
};
_0xb4bdb3(++_0x2bd6f7);
}(_0x5a46, 0x1b3));
var _0x4b5b = function (_0x2d8f05, _0x4b81bb) {
_0x2d8f05 = _0x2d8f05 - 0x0;
var _0x4d74cb = _0x5a46[_0x2d8f05];
return _0x4d74cb;
};
function verify() {
checkpass = document[_0x4b5b('0x0')]('pass')[_0x4b5b('0x1')];
split = 0x4;
if (checkpass[_0x4b5b('0x2')](0x0, split * 0x2) == _0x4b5b('0x3')) {
if (checkpass[_0x4b5b('0x2')](0x7, 0x9) == '{n') {
if (checkpass[_0x4b5b('0x2')](split * 0x2, split * 0x2 * 0x2) == _0x4b5b('0x4')) {
if (checkpass[_0x4b5b('0x2')](0x3, 0x6) == 'oCT') {
if (checkpass[_0x4b5b('0x2')](split * 0x3 * 0x2, split * 0x4 * 0x2) == _0x4b5b('0x5')) {
if (checkpass['substring'](0x6, 0xb) == 'F{not') {
if (checkpass[_0x4b5b('0x2')](split * 0x2 * 0x2, split * 0x3 * 0x2) == _0x4b5b('0x6')) {
if (checkpass[_0x4b5b('0x2')](0xc, 0x10) == _0x4b5b('0x7')) {
alert(_0x4b5b('0x8'));
}
}
}
}
}
}
}
} else {
alert(_0x4b5b('0x9'));
}
}
_0x2d8f05 = _0x2d8f05 - 0x0;
이게 무슨 의미야->앞으로 정수로 처리하니까분할 범위는if문장의 조건으로 checkpass의 매개 변수 ()의 두 수치 사이입니다.
writeup을 참고하여 위에 붙인 코드를 쓴 후 출력 처리
console.log(_0x4b5b('0x3')) // -> picoCTF{
console.log(_0x4b5b('0x4')) // -> not_this
console.log(_0x4b5b('0x5')) // -> 9f266}
console.log(_0x4b5b('0x6')) // -> _again_1
console.log(_0x4b5b('0x7')) // -> this
console.log(_0x4b5b('0x8')) // -> Password Verified
console.log(_0x4b5b('0x9')) // -> Incorrect password
다음 출력을 얻었습니다.picoCTF{
not_this
9f266}
_again_1
this
Password Verified
Incorrect password
checkpass의 매개 변수 수치를 참고하여 한데 배열하면 flag를 얻을 수 있습니다.picobrowser(Web)
사용자 에이전트로 위장하다.
문제의 링크에 올라가서 개발 도구로 맨 오른쪽에 있는 추가 도구를 선택하십시오.
more tools에서 network condition을 선택하고 UA의 에이전트를custom으로 설정하고 이번에 지정한picobrowser를 업데이트하면 flag가 나온다.
Irish-Name-Repo 1(Web)
문제는 사용자 이름과 비밀번호가 필요한 로그인 페이지에서 빼낼 수 있느냐는 것이다.
SQL 주입을 사용합니다.
' OR 'A' = 'A'
넣으면 될 줄 알았는데 안 넣어서 손에 넣기 좋은'안전한 웹 앱 만드는 법'(데마루본)을 봤다.' OR 'A' = 'A' --
따라서 향후 SQL에 대한 설명이 필요합니다.JPEG 파일에서 문자열 추출
여러 가지 방법이 있어요.
hexdump -C
명령을 사용하여 16진수와 ASCII 문자를 출력할 수 있습니다.이미지에서 flag이 발견되면
바이너리 편집기를 사용한 Ghex!
다음 명령으로 맥에 ghex를 설치할 수 있습니다.
brew install ghex
그리고 열려는 jpeg 파일을 매개 변수로 ghex 명령을 두드려라.마지막에 flag이 있다는 것을 알고 끝까지 굴렀어요.
문자열 검색 기능이 있지만 사용해 보면 잘 작동하지 않는다.
Easy1
비씨 비밀번호에 관한 문제.열쇠와 암호화된 문자열을 가르쳐 주세요.
Vi Junel 암호를 해결하는 프로그램을 만들었습니다.
또한 키와 밀문 길이가 같은 키에만 대응합니다. (키 길이를 반복하기만 하면 됩니다.)
import sys
print("input crypted string in CAPITAL LETTER")
crypted = []
key = []
crypted = input()
print("input key in CAPITAL LETTER")
key = input()
# keyの文字の行まで下がる(行列では下方向)
# keyの文字から始まって、cryptedの文字が何列目かを求める(行列で右方向)
# Aから(左から)何列目かわかったら、それが復号した文字(行列で上方向)
if(len(crypted) != len(key)):
print("key and crypted don't match")
sys.exit()
original = []
for i in range(len(crypted)):
c = ord(crypted[i])-64 # Aから何文字目か(Aは65なので一文字目)
k = ord(key[i])-64
if(c >= k):
num = c-k+65
else:
num = 91-k+c # Zは90
original.append(chr(num)) # 一文字ずつ復号した文字を格納
print(''.join(original))
Reference
이 문제에 관하여(pico-CTF1(공개용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/comedy_love/items/7fd4086cea79e98db50c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)