HCTF GAME - Week 1

Posted by JHSN on January 21, 2017

主要做了一下 Web Misc Pentest Crypto 的题目,有一道做不出,很难受

Web 1 这TM是啥

查看源码,有一堆被混淆的代码,直接扔console里,即出现了alert
改变混淆代码,使其出现源码内容,删去了最后一个括号

function anonymous() {
var f = "hctf{j5fuck_1z_m1233}"; alert("Hack by LoRexxar, 你的flag被我拿走了")
}

hctf{j5fuck_1z_m1233}

Web 2 我是谁我在哪

源码啥都没有所以直接查看Network内容
hctf{1t_iz_4_4mall_tr1ck}

Web 3 不可能拿到的flag

复习了一下HackBar然而并不会做
看了狗头爸爸给的解答得知PHP的sha1()和md5()的函数漏洞对array类型进行加密时会返回错误
所以只需要构造post: name[]=a&password[]=sdf
hctf{o0k!!g3t_f14g_s0_ez}

Web 4 神奇的数字

is_string($req["number"]) && is_numeric($req["number"]); # 数值字符串

$n1 = intval($req["number"]);
$n2 = intval(strrev($req["number"]));
$n1 && $n2 && $n1 == $n2; # n1, n2相等且不为0

$req["number"] != intval($req["number"]);

!is_palindrome_number($req["number"]); # 非回文字符串

对于第三个条件有
当数值与字符串进行 “==” 的比较时 会将字符串转化为数值 然后进行比较 所以可以利用其精度不足的特点 构造奇葩的小数
例如post: number=9223372036854775807.00000000000000000000001

find a strange dongxi: hctf{go0d_job_intv4l_iz_g00d}

Web 5 php真可怕我要回农村

题目对于$b的要求

1. $b != '' # 非空
2. is_numeric($b) == false # 非数值或数值字符串
3. (int)(("0.1" + $b) * 10) == "8"
4. $b[10] == false # 长度 <= 10

对于第三点有 当字符串和数值进行加法时 会将字符串转化为数值
而对字符串进行数值类型的转换时 有从头开始转换直到遇到非法数值为止
所以最终$b可以为 属于(0.7,0.8)的一个小数 + 非法字符长度 <= 10
例如post: b=0.71q
hctf{wochubuxiaqule_over}

MISC 1 & 2 & 3 Explorer的图库

第一个 Flag 就躺在文件里 搜一下就有了
hctf{2e3e3}

binwalk -e一下 第二个 Flag 就躺在分离出来的文件里 搜一下就有了
hctf{nizh1dao_tuzh0ngm4}

第三个 Flag 题目提示了LSB 所以用 Stegsolve 提取一下最低位
观察可发现开头有一段连续的可见字符串aGN0Znsxc2JfYWFiYmJfaXpfZXp6enp6en0=
嗯 base64
hctf{1sb_aabbb_iz_ezzzzzz}

MISC 4 explore的奇怪番外1

Socket题
询问你很多次 “ready?:” 需要你输入 “yes”
询问完后后输入一次 “ready”
现学的直接上代码

import socket
import time
HOST = '121.42.25.113'
PORT = 20000
s = socket.socket()
s.connect((HOST, PORT))
time.sleep(0.5)  # wait for connecting
data = s.recv(64)
# print data
data = b"ready?:"
# tot = 0
while data == b"ready?:":
    s.send(b"yes\n")
    data = s.recv(64)
    # tot += 1
    # print data, tot
s.send(b"ready\n")
data = s.recv(64)
print data
s.close()



Pentest lightless的渗透教室入门篇

几个脑洞题 无感 最后一个编码题不会 其它题目懒得写wp


Crypto 1 密码学教室入门一

给定p, q, e, d, c, 求m
即求 c^d (mod pq)

ans = hex(pow(c, d, p * q))
print ans[2 : len(ans) - 1].decode('hex')

hgame{rsa_1s_v3ry_e4sy!}

Crypto 2 密码学教室入门二

mlfrj{Hfjxfw_hnumjw_8x_ozxy_ktw_kzs}
裸Caser全部跑一下即可
其中的数字解出来是1s 有点莫名其妙的 用生命在出题的出题人wcnm : )
hgame{Caesar_cipher_1s_just_for_fun}

Crypto 3 密码学教室入门三

对于维吉尼亚密码 可以找出其中相同的单词 计算两处单词的位移 则分组长度必为其因数

s = "ET. PESFVWI, AJGZII BU D LJSQ ISW IKV MRQTLWTOOHRY JP WLJ CCVXNMNH, XJTVLJNFU RR IBTQED'T DHLFMH DX MJU WVNBN. GEWOCB MX SGOIFTGG, SSMA WS GF CUVJTVHH FHCLR QBVHV YICW HFZ. C QIB UTLEQ CGJMST QQ XMF HRPQPYLRL ECB, YSEGU RJX EKEWHGV FWPWJLY CA WLJ EGIEWHGV ESE C WLNSF LRIJXLHZBN ZLT JU VSTO THZJBNHH FT FU. QFOGWXJ. IG KEI XTLXYFP DR FDERYSU QI LNT KPTWJURRRFPW EY UJH LFOFV SK ECURFZ'U IEYIGU ESE JLHIFP LX NO JLW HFNO; HJGCUKJ GQXRI JV ZLNMG VIFSEKMSH VKI HFNO HZSKQK YIG VXTSOLRL PH WLJ CCVXNMNH."
s = s.replace('.', ' ')
s = s.replace(';', ' ')
s = s.replace(',', ' ')
s = s.replace('\'', ' ')
dc = s.split(' ')
dc.sort()
i = 0
while (i < len(dc)):
    while i < len(dc) and len(dc[i]) < 2:
        dc.pop(i)
    i += 1
s = s.replace(' ', '');
for i in range(1, len(dc)):
    if dc[i] == dc[i - 1]:
        print dc[i], s.rfind(dc[i]) - s.find(dc[i]) # 此处为了方便 假设就两个相同

Output:

CCVXNMNH 345
ESE 110
HFNO 35
WLJ 345
WLJ 345

由此可知分组长度为5
再根据标点各种拼凑得密钥为'ZYXWV'
查询得双城记
hgame{A_Tale_of_Two_Cities}

Crypto 4 密码学教室入门四

观察到 e = 1
有 m^e = c (mod n)
所以 c 即为 m
hgame{rsa_1s_sti1l_e4sy_now!}

Crypto 5 密码学教室番外篇

又一个Caeser: yxrdv{uxwupytip19954902180//+/%}
脑洞题 个人感觉挺没意思的
hgame{dgfdyhcry42287235413//+/%}




评论区加载中