CTF - 텀 블 러. - WEB 의 비밀 을 찾 아 주세요.
15241 단어 '라 고 말한다.
** -WEB **
이 문제 에 대해 나 는 그래도 좀 깨 달 았 다.여러분 과 나 눠 보도 록 하 겠 습 니 다!!늘 그 렇 듯 이 홈 페이지 에 들 어가 소스 코드 를 벗기다.하지만 이번 에는 이것 이 좀 특이 해서 한꺼번에 구 할 수 있 는 것 이 아니 라 그 js 스 크 립 트 에 중점 을 두 었 습 니 다. 다음은 제 가 상세 하 게 설명 하 겠 습 니 다.
4. 567917. 절차 1: 전체 페이지 를 복사 하고 관찰 한 결과 이 js 스 크 립 트 는 정상 적 인 스 크 립 트 가 아니 라 는 것 을 알 수 있 습 니 다.사실 이것 은 암호 화 된 스 크 립 트 입 니 다. 복호화 코드 를 아래 에 붙 였 습 니 다
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JS title>
head>
<body>
<script>
a=62;
function encode()
{
var code = document.getElementById('code').value;
code = code.replace(/[ ]+/g, '');
code = code.replace(/'/g, "\'");
var tmp = code.match(/(w+)/g);
tmp.sort();
var dict = [];
var i, t = '';
for(var i=0; iif (tmp[i] != t) dict.push(t = tmp[i]);
}
var len = dict.length;
var ch;
for(i=0; inew RegExp('\b'+dict[i]+'\b','g'), ch);
if(ch == dict[i]) dict[i] = '';
}
document.getElementById('code').value = "eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}("
+ "'"+code+"',"+a+","+len+",'"+ dict.join('|')+"'.split('|'),0,{}))";
}
function num(c)
{
return(c'':num(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36));
}
function run()
{
eval(document.getElementById('code').value);
}
function decode()
{
var code = document.getElementById('code').value;
code2 = code.replace(/^eval/, '');
//alert(code);
document.getElementById('code').value = eval(code2);
}
script>
<textarea id=code cols=80 rows=20>
textarea>
< input type = button onclick = encode () value = 인 코딩 >
< input type = button onclick = run () value = 실행 >
< input type = button onclick = decode () value = 디 코딩 >
body>
html>
2. 단계 2: txt 문 서 를 새로 만 들 고 아래 코드 를 복사 한 다음 html 로 형식 을 바 꿉 니 다.암호 화 된 js 코드 를 복사 합 니 다.메모: 코드 를 복사 할 때 첫 줄 에 빈 칸 을 남 겨 두 면 안 됩 니 다. 첫 줄 앞의 빈 칸 을 모두 없 애 는 뜻 입 니 다.안 그러면 복호화 가 안 돼.3. 단계 3: 복호화 한 후 에는 다음 과 같은 코드 가 있어 야 합 니 다.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>simple js decodetitle>
head>
<body>
<form id="levelQuest" method="post">
<p>
password:p>
<p>
<input id="password" class="input" name="password" type="password">
<input class="button" value="Go" type="submit">
p>
form>
<p id="errorMessage">
p>
<script>
function pseudoHash(string, method)
{
if (!('ENCRYPT' == method || 'DECRYPT' == method))
{
method = 'ENCRYPT'
}
if ('ENCRYPT' == method)
{
var output = '';
for(var x = 0,y=string.length,charCode, hexCode; x < y; ++x)
{
charCode = string.charCodeAt(x);
if (128 > charCode)
{
charCode += 128
}
else if (127 < charCode)
{
charCode -= 128
}
charCode = 255 - charCode;
hexCode = charCode.toString(16);
if (2 > hexCode.length)
{
hexCode = '0' + hexCode
}
output += hexCode
}
return output
}
else if('DECRYPT' == method)
{
return string
}
}
document.getElementById('password').value = pseudoHash('1a4d494e4b47461e1d464b4d4b4d461e49494f4f1c4e1c4b4e4d4e1e1c4e4b1b', 'DECRYPT');
script>
<p id="tip">
p>
body>
html>
아마 이런 코드 는 초보 자 들 에 게 는 좀 알 아 볼 수 없 을 것 이다.그래서 본인 은 특별히 그의 c \ # 코드 를 썼 습 니 다.
public string pseudoHash(string str, string method)
{
// Default method is encryption
if (!("ENCRYPT" == method || "DECRYPT" == method))
{
method = "ENCRYPT";
}
// Run algorithm with the right method
if ("ENCRYPT" == method)
{
// Variable for output string
string output = "";
// Algorithm to encrypt
char[] ch = str.ToCharArray();
char charCode;
string hexCode;
for (int x = 0, y = str.Length; x < y; ++x)
{
charCode = ch[x];
if (charCode < 128)
{
charCode = (char)(charCode + 128);
}
else if (charCode > 127)
{
charCode = (char)(charCode - 128);
}
charCode = (char)(255 - charCode);
hexCode = Convert.ToString(charCode,16);
if (hexCode.Length < 2)
{
hexCode = '0' + hexCode;
}
output += hexCode;
}
// Return output
return output;
}
else if ("DECRYPT" == method)
{
return str;
}
return "";
}
, js , , c# :
public string getIt(string str)
{
char[] ch = str.ToCharArray();
string s = "";
for(int i = 0; i < str.Length - 1; i+=2)
{
s += (char)(255-Convert.ToInt32(ch[i] + "" + ch[i + 1], 16)-128) + "";
}
return s;
}
이것 은 스스로 그것 을 호출 하 는 방법 입 니 다. 해 제 된 문자열 은 "e261489Ab 942429a 6600 c1c 4121 ac14d" 입 니 다. 이것 은 32 비트 문자열 입 니 다. md5 로 복호화 해 보십시오.http://cmd5.com/풀다마지막 으로 문제 가 생 겼 습 니 다. 7415 를 채 워 서 시스템 에 답 이 틀 렸 습 니 다.어이, 마음 있 는 사람 이 도와 주세요. 어떻게 된 일 인지 알려 주세요!!처음 블 로 그 를 써 서 미흡 한 점 은 양해 해 주시 기 바 랍 니 다