本帖为记录长右网络空间安全战队第二次考核题内容,希望可以记住自己做过的题,让自己更好地进步。
Sign
签到题,直接提交flag即可。
Misc
1.小熊猫变成小兔叽
附件为一个名为zip的文件,没有后缀,在文件名后加上.zip(压缩文件的后缀名),文件变为压缩文件。打开压缩文件,发现一张图。
根据题目中“小熊猫拉长一下”,猜测需要改变图片的高度或者宽度。鼠标右键查看图片属性:
发现图片高度比较低,于是考虑增加图片的高度。这里用到的工具为WinHex。
具体操作方法请参考CTF 图片隐写之修改图片高宽
简单来说该图片的高度为380像素,于是将380转换成十六进制,为017c,然后在WinHex找到017c,将其改为我们想要改正的数值的十六进制形式。
我在具体操作中将改图片的高度改为420像素(十六进制形式为01a4),成功得到图片下方的字符串:
字符串为:olee{qlr3y_16q51_y3q1l_rc654_yap45}
参考题目中给出的flag形式,发现这串字符形式已经和flag的形式一样了。提示给出“低头看看键盘”,于是去搜和键盘相关的解码,发现键盘密码(键盘上的字母顺序分别对应字母表里的字母顺序,如QWE对应ABC),OLEE正好对应了ISCC,于是使用键盘密码的方式,得到最后的flag.
iscc{asd3f_16a51_f3a1s_dv654_fkj45}
2.Broken WUHAN
下载附件,为一个不可读的图片。使用WinHex打开图片,
发现图片的文件头标志不对(.jpg文件的头标志应该为FFD8FF),于是修改头标志,
保存,成功打开图片,得到flag.
有关文件的头标志,请参考:各类文件的文件头标志
flag{wu_Han_jia_Y0u!}
3. QRQRQRQRQRQRQRQRQRQRQRQRQR
下载附件,是一张二维码的动态图
既然是动态图,那么肯定要逐一查看每一帧,找出最特殊的一帧。可以使用ps打开动态图,进行逐一查看,但是有100帧,这样有些费事。我这里使用一个软件Namo GIF编辑器,比较方便:
于是取出第62帧,
第62帧与其他二维码最大的不同之处就是多了右下角的小方框。对比一般二维码,这张二维码少了三个定位符,于是用ps给这图加上定位符
用微信或者支付宝扫一扫,得到flag.(扫不出来请多扫扫,图片还原度不高会导致识别率较低)
flag{GYSEC_GOGOGO}
4.来玩拼图呀
附送的音乐为:Time,挺好听的。一开始是真的没想到这首歌的意思。附件就是二百多张拼图,而且顺序是乱的,真要拼出来花儿都谢了。其实Time的真正意思是让图片按照时间排序,就可以得到按顺序的图片了,再用ps进行拼图,就很容易了。
flag{fate_stay_nt}
Web
1.var_dump(
打开网页,是一些代码:
虽然不是很懂,于是直接去查题目,得到:var_dump() 函数用于输出变量的相关信息。然后再去查$_REQUEST: 可以获取以POST方法和GET方法提交的数据,在参考众多网站之后,得到在网址后加上index.php?hello=1);print_r(file("./flag.php"),访问网址,即可得到flag.
参考文章
flag{your_php_is_very_good_my_bro}
2.Easy_Challenge
都说了是一道老题了,那就直接上链接吧:我是原题
Reverse
1.Simple_py
这是一道python逆向题,附件为一个.pyc文件,因此需要找到将.pyc文件还原为.py文件的方法。具体方法参考链接:python反编译exe
这篇文章介绍的是把.exe文件先变成.pyc文件再还原成.py文件的方法,在这个题中我们只需要执行.pyc还原.py就够了。
// 这是还原后的.py代码:
// import base64
def encode(mess):
s = ''
for i in mess:
x = ord(i) + 16
x = x ^ 32
s += chr(x)
return base64.b64encode(bytes(s, encoding='utf-8'))
correct = b'VlxRV8KreGFCYU9ZwqNPwqDCqVNPQlVPdmFRV8Kt'
flag = input('input flag:')
if encode(flag) == correct:
print('you are correct')
else:
print('you are wrong')
其中,核心代码只有中间一部分:
// 核心代码
// for i in mess:
x = ord(i) + 16
x = x ^ 32
s += chr(x)
想要得到flag,我们就要将程序反过来写,通过反向运行程序,获得原来的flag,因此,改变核心代码,得到:
// 修改后的代码
// import base64
mess='VlxRV8KreGFCYU9ZwqNPwqDCqVNPQlVPdmFRV8Kt'
s = ''
mess = base64.b64decode(mess)
for i in mess:
x = i ^ 32
x = x - 16
s += chr(x)
print(s)
运行后得到:
flagÒ{H1R1_iÒs_ÒpÒyc_Re_F1agÒ}
将其中明显不是密码的Ò去掉,得到最后的flag:
flag{H1R1_is_pyc_Re_F1ag}
2.Easy Reverse
下载附件,是一个.exe文件,因为不是python文件,因此我们不能用上一题一样的方法去还原其代码了。于是考虑其他的反编译器,这里使用IDA进行反编译,得到C伪代码
// 伪C代码
// #include <stdio.h>
void main() {
int a;
char v4; // [esp+16h] [ebp-1Ah]
char v5; // [esp+17h] [ebp-19h]
char v6; // [esp+18h] [ebp-18h]
char v7; // [esp+19h] [ebp-17h]
char v8; // [esp+1Ah] [ebp-16h]
char v9; // [esp+1Bh] [ebp-15h]
char v10; // [esp+1Ch] [ebp-14h]
char v11; // [esp+1Dh] [ebp-13h]
char v12; // [esp+1Eh] [ebp-12h]
char v13; // [esp+1Fh] [ebp-11h]
char v14; // [esp+20h] [ebp-10h]
char v15; // [esp+21h] [ebp-Fh]
char v16; // [esp+22h] [ebp-Eh]
char v17; // [esp+23h] [ebp-Dh]
char v18; // [esp+24h] [ebp-Ch]
char v19; // [esp+25h] [ebp-Bh]
char v20; // [esp+26h] [ebp-Ah]
char v21; // [esp+27h] [ebp-9h]
int v22; // [esp+28h] [ebp-8h]
int i;
printf("请输入数字:");
while (scanf("%d", &v22))
{
v4 = -125;
v5 = 124;
v6 = -122;
v7 = 127;
v8 = 106;
v9 = -113;
v10 = -109;
v11 = -118;
v12 = -126;
v13 = 119;
v14 = 108;
v15 = 127;
v16 = -122;
v17 = 116;
v18 = 122;
v19 = 102;
v20 = -102;
v21 = 91;
for (i = 0; i <= 17; ++i) {
putchar(v22 - *(&v4 + i) - i);
}
putchar(10);
putchar(10);
printf("请输入数字:");
}
}
flag 第一个字母位“f” asII 码为0x66 ,十进制 102.也就是
x-(-125)=102,x=-23
于是编写代码:
下面展示一些 内联代码片。
//编写出生成flag的代码
// #include <stdio.h>
void main()
{
int i;
int s[]={-125,124,-122,127,106,-113,-109,-118,-126,119,108,127,-122,116,122,102,-102,91};
for(i=0;i<=17;i++)
{
putchar(-23- (s【i】)-i);
}
putchar(10);
}
运行,生成flag:
flag{UPX_is_What?}
参考网站:一个简单的ctf逆向