暗泉杯2021 WP
暗泉杯Writeup
Re
Signin
flag{REVERSE_1s_Very_3asy!}
happyCTF
s = 'rxusoCqxw{yqK`{KZqag{r`i' |
Remember Crypt 4
RC4加密
# cryto |
EasyRe
信号量的题目之前没见过,
相关信号量的函数
一、sigqueue函数
功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。
原型:int sigqueue(pid_t pid, int sig, const union sigval value);
参数:
sigqueue的第一个参数是指定接收信号的进程id,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值。
返回值:成功返回0,失败返回-1
二、__sighandler_t signal(int signum, __sighandler_t handler);
参数
signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数由handler给出,handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void
handler也可以是两个特殊值:SIG_IGN 忽略该信号;SIG_DFL 恢复默认行为
sigaction 结构体定义如下
struct sigaction { |
分析题目
题目中使用的是 SA_SIGINFO
,对信号处理程序提供了附加信息:一个指向 siginfo
结构的指针以及一个指向上下文标识符的指针
主程序中,为 2
信号注册了一个处理函数,这个函数是用于对最终加密结果进行判断的,随后进行了一个初始化,接下来进入一个死循环,等待子程序发送 2
信号
根据return sub_400A0D(&unk_4019C0, s1);
第一个参数是vm的指令码,s1是输入的 flag
这个函数是由 while
循环和 switch
语句实现的
大致分为三类
第一类
case 0: |
第二类
case 1: |
猜测 qword_6030C8 +16 ,qword_6030C8+17,qword_6030C8+18 为不同的寄存器
第三类
case 21: |
只有kill,该类只传递了全局变量
int sub_40144B() |
解题
看大佬解的Wp
经过对每条指令的分析,以及动调查看内存,确定 qword_6030C8[19]
是 esp
,*(_QWORD *)qword_6030C8
模拟了栈,*((_QWORD *)qword_6030C8 + 1)
是输入的开始地址,qword_6030C8[16, 17, 18]
是三个寄存器,qword_6030C8[21]
是跳转用的 ZF
标志位
先反汇编
code = [ |
结果
_00: push(eip+2); eip = 0x34; |
发现其实是调用了几个函数,分别在0x34、0x40、0x1D
0x34处的函数判断了长度,0x1D处的函数从后往前异或数字,每次加2,0x40处的函数从后往前进行加法,数字每次加1
所以最后的加密算法为:首先从后往前 ^36, ^38, ^40,随后从后往前+0, +1, +2…,最后从后往前 ^72, ^74, ^76…
反向解密即可
s2 = [ |
Crypto
素数
使用gmpy2生成10个大素数,然后依次提交即可
键盘侠
将密文放入键盘的对应位置后,发现一组密文在键盘上构成一个图案,这个图案是一个字母
Pwn
[签到]NssShop
输个负数就能出flag
flag{Pwn_Is_Vary_Ez}
Misc
[签到]签到
题目描述,直接提交
[萌新]在哪儿呢
PDF里面有很多不可见字符,直接复制粘贴到就可以看到flag
flag{hey_there_is_no_thing}
只是个PNG,别想太多了.png
压缩包压缩包压缩包压缩包
import zipfile |
Copy
解出23333.zip
密码根据规律猜测是3-6位,爆破得到756698是密码
010editor搜索flag得到flag
flag{Unz1p_i5_So_C00l##}