-
-
[原创]KCTF2024 第九题 题解(什么pwn题)
-
发表于: 2024-9-2 14:44 3052
-
有点脑电波的题,三段flag分别:字符匹配+字符串反向toint+四皇后求解,(只能用)缓冲区溢出修改四皇后最后的目标值,根据md5爆破最后一位任意值。
主函数逻辑:
四皇后唯二解法:
其中最巧妙的是第三段约束的设置,这里的条件一定有:
这样第三段输入就确定了每段的长度,同时第三段输入的两种可能为
第二段根据刚才的分析已经知道前8字节等于20211205
,如果每段长度都是9的话,为保证转int不变只能补前导0,第二段输入只能为
第一段输入前8字节为hellocat
,最后一字节任意。
结合给定的md5值爆一下:
40d511825ecbc207eb6ef9a7b1c6e34b:hellocatx202112050a3b1c4d29
hashcat -m 0 -a 3 -2 ?l?d 40d511825ecbc207eb6ef9a7b1c6e34b hellocat?2202112050a3b1c4d29
`hashcat -m 0 -a 3 -2 ?l?d 40d511825ecbc207eb6ef9a7b1c6e34b hellocat?2202112050a2b4c1d39
hashcat -m 0 -a 3 -2 ?l?d 40d511825ecbc207eb6ef9a7b1c6e34b hellocat?2202112050a3b1c4d29
`hashcat -m 0 -a 3 -2 ?l?d 40d511825ecbc207eb6ef9a7b1c6e34b hellocat?2202112050a2b4c1d39
40d511825ecbc207eb6ef9a7b1c6e34b:hellocatx202112050a3b1c4d29
1
2
|
hashcat -m 0 -a 3 -2 ?l?d 40d511825ecbc207eb6ef9a7b1c6e34b hellocat?2202112050a3b1c4d29 `hashcat -m 0 -a 3 -2 ?l?d 40d511825ecbc207eb6ef9a7b1c6e34b hellocat?2202112050a2b4c1d39 |
- 读入flag,换行结束不读换行。要求:
- 长度是3的倍数
- 字符集为0-9a-z
- 将flag均分三段,丢到三个检查里
- 第一段(sub_666BCB)检查:
- 记录当前时间
- 比较前8字符等于
hellocat
- 第二段(check_Rev)检查:
- 反转输入的字符串
- 在sub_666B21中检查当前时间是否比之前记录的时间长了5s,如果是就修改乘数x=2
- 乘数默认值x=3,检查int(反转的字符串)*x是否等于0x8FA7C86
(str(0x8FA7C86 / 3)[::-1] =20211205
)
- 第三段(sub_666E78)检查:
- 拷贝输入到0x00741E94,最后的结果位于0x00741E9C(正好是输入的第9位)
- 将最后的结果 |= 0x10000000
- 要求第三段输入aibjckdl的a<b<c<d,否则设置目标值为不予通过(即使溢出也无法修改回来)
- 要求顺利求解四皇后,abcd对应x轴,ijkl对应y轴(笛卡尔坐标系),否则设置目标值为不予通过(即使溢出也无法修改回来)
- 要求最后的值低位为0x10000039,这个条件只能通过溢出覆盖低位满足。
- 第一段(sub_666BCB)检查:
- 长度是3的倍数
- 字符集为0-9a-z
- 第一段(sub_666BCB)检查:
- 记录当前时间
- 比较前8字符等于
hellocat
- 第二段(check_Rev)检查:
- 反转输入的字符串
- 在sub_666B21中检查当前时间是否比之前记录的时间长了5s,如果是就修改乘数x=2
- 乘数默认值x=3,检查int(反转的字符串)*x是否等于0x8FA7C86
(str(0x8FA7C86 / 3)[::-1] =20211205
)
- 第三段(sub_666E78)检查:
- 拷贝输入到0x00741E94,最后的结果位于0x00741E9C(正好是输入的第9位)
- 将最后的结果 |= 0x10000000
- 要求第三段输入aibjckdl的a<b<c<d,否则设置目标值为不予通过(即使溢出也无法修改回来)
- 要求顺利求解四皇后,abcd对应x轴,ijkl对应y轴(笛卡尔坐标系),否则设置目标值为不予通过(即使溢出也无法修改回来)
- 要求最后的值低位为0x10000039,这个条件只能通过溢出覆盖低位满足。
- 记录当前时间
- 比较前8字符等于
hellocat
- 反转输入的字符串
- 在sub_666B21中检查当前时间是否比之前记录的时间长了5s,如果是就修改乘数x=2
- 乘数默认值x=3,检查int(反转的字符串)*x是否等于0x8FA7C86
(str(0x8FA7C86 / 3)[::-1] =20211205
)
- 拷贝输入到0x00741E94,最后的结果位于0x00741E9C(正好是输入的第9位)
- 将最后的结果 |= 0x10000000
- 要求第三段输入aibjckdl的a<b<c<d,否则设置目标值为不予通过(即使溢出也无法修改回来)
- 要求顺利求解四皇后,abcd对应x轴,ijkl对应y轴(笛卡尔坐标系),否则设置目标值为不予通过(即使溢出也无法修改回来)
- 要求最后的值低位为0x10000039,这个条件只能通过溢出覆盖低位满足。
- 第三段的长度必须为9,超过8才能覆盖最后的值,超过9的部分又无法通过已有的运算满足最后的目标值。
- 第三段四皇后的输入顺序就是abcd,这样第三段前8字节只有两种可能:
a2b4c1d3
a3b1c4d2
- 通过溢出修改低位为chr(0x39) =
9
a2b4c1d3
a3b1c4d2
a2b4c1d39
a3b1c4d29
202112050
- 长度是3的倍数
- 字符集为0-9a-z
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: