“安康杯” 青年网络安全技能大赛

“安康杯” 青年网络安全技能大赛

RocketDev

之前帮上海的一队培训awd,他们就是培训的下一周要参加这个竞赛了。虽然他们的pwn 能力没有提高很多,但是patch是会了,最后也是取得了一个不错的成绩。

附件可以从CTFWriteup的Releases 下载。

chall

比赛里有唯一一道awdp pwn题,程序里有后门,patch掉就过了。但是漏洞不止一个。

文件属性

属性
Arch amd64
RELRO Full
Canary on
NX on
PIE on
strip no

潜在漏洞点

漏洞点一:后门

bug1

chall_menu中可以输入数字,只要等于0xaaadbeef就可以进入后门,写一段shellcode。

参考修复方案:

使用无条件跳转指令jmp跳过后门函数。

1
2
3
4
5
6
7
@@ -13cd,18 +13cd,18 @@
E8 C1 FF FF FF # call chall_menu
89 45 FC # mov dword ptr [rbp - 4], eax
81 7D FC EF BE AD AA # cmp dword ptr [rbp - 4], 0xaaadbeef
-75 1D # jne 0x2e
+EB 1D # jmp 0x2e
48 8D 3D 54 02 00 00 # lea rdi, [rip + 0x254]

参考攻击方案:

输入该数字,并输入一段shellcode拿shell。

漏洞点二:信息泄露

bug2

NAME上读取了0x20字节,由于紧邻RANDBUF且打印NAME时使用puts, 因此刚好输入0x20字节可以在打印时泄露RANDBUF上放的指针,泄露程序基址。

参考修复方案:

修改读取大小为0x1f。

1
2
3
4
5
6
@@ -12f7,16 +12f7,16 @@
-BA 20 00 00 00 # mov edx, 0x20
+BA 1f 00 00 00 # mov edx, 0x1f
48 8D 35 DD 0D 20 00 # lea rsi, [rip + 0x200ddd]
BF 00 00 00 00 # mov edi, 0
E8 F3 F6 FF FF # call read@PLT

参考攻击方案:

输入0x20字节后执行print_username推算出程序基址,然后使用set_username 设置NAME"/dev/zero",同时设置RANDBUF指向NAME。这样在game中猜数时, 就会打开/dev/zero,读取出4个0x00,只要猜数字是0就可以继续到chall2

漏洞点三:UAF

bug3

copy函数中,如果指定源索引和目标索引为同一个,那么由于其对应的size是一致的, 指针会被保存下来并在free后还原回去,从而造成UAF。

参考修复方案:

验证源堆块和目标堆块大小时,只允许目标堆块比源堆块大,避免使用同一个索引。(偷懒了)

1
2
3
4
5
6
7
@@ -f12,e +f12,e @@
8B 04 01 # mov eax, dword ptr [rcx + rax]
39 C2 # cmp edx, eax
-7C 1B # jl 0x22
+7E 1B # jle 0x22
8B 45 F4 # mov eax, dword ptr [rbp - 0xc]
48 C1 E0 04 # shl rax, 4

参考攻击方案:

利用同一个索引造成UAF,泄露堆指针,然后如法炮制,多释放几个。接着申请堆块放上任意分配的地址, 用copy把任意分配地址写到bin里,就可以进行下一步利用(泄露libc/打free_hook等)

  • 标题: “安康杯” 青年网络安全技能大赛
  • 作者: RocketDev
  • 创建于 : 2024-12-25 19:01:00
  • 更新于 : 2024-12-27 13:01:00
  • 链接: https://rocketma.dev/2024/12/25/ankangCup/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
“安康杯” 青年网络安全技能大赛