首页
社区
课程
招聘
[原创]KCTF2024 第九题 题解(什么pwn题)
发表于: 2024-9-2 14:44 1875

[原创]KCTF2024 第九题 题解(什么pwn题)

2024-9-2 14:44
1875

有点脑电波的题,三段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,这个条件只能通过溢出覆盖低位满足。
  • 长度是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
  • 读入flag,换行结束不读换行。要求:
    • 长度是3的倍数
    • 字符集为0-9a-z
  • 长度是3的倍数

  • [培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

    收藏
    免费 1
    支持
    分享
    最新回复 (0)
    游客
    登录 | 注册 方可回帖
    返回
    //