鹏城杯 2023 初赛 Pwn WriteUp
现实世界开始上压力了。
鹏城杯 2023 初赛 Pwn WriteUp
十点上号,脑子不太清醒。
先过了一遍,大致确认难度silent ~= coffee < heap < 6052(vmpwn)
。
然后四点半准时下班。vmpwn直接开摆。
还算成功(嘿嘿)
atuo_coffee_sale_machine
卖完free掉没同步库存,后台修改操作就能UAF。
但uaf改指针之前记得先清库存(aka同步库存),要不然后台直接“虚空上货”了(前台没货后台有货,直接同步到前台)
把最开始那个0x6c大小的coffee结构体指针改到stdout泄露libc(改got表有可能会把got表项改掉)
然后打freehook即可。
|
|
silent
跟之前巅峰极客初赛linkmap差不多。
这种一般都会落到造syscall和ret2csu。
目标就可以被拆解为找三种gadgets。
- got表 -> 寄存器
- 寄存器修改,比如add rax,dl
- 寄存器 -> 内存
对于linkmap来说三种gadget都有,但本题没有第一种gadget。
但stdin/stdout也是libc相关地址,可以用第二种gadget算出来一个syscall地址。
不过按理来说byte ptr
和dword ptr
应该没有区别,但是byte ptr
远程死活出不来,换成dword ptr
之后秒出。
|
|
baby heap
off by null板子,甚至还给了堆基址。
整个假的堆块,清掉下一个堆块的inuse位,向前合并打堆重叠,转化为UAF。
风水一下,把指针推到之前堆块的对应位置即可。这里的指针需要推到largebin,unsortedbin低位为0无法泄露。
addr1 | addr2 | chunk1 | chunk2 |
---|---|---|---|
0x2c0 | chunk1 0x431 | ||
0x2d0 | fake chunk 0x421 | ||
0x6d0 | 0x6d0 | chunk2 0x431 | overlap chunk 0x431 |
0x6e0 | 0x6e0 | fd | 遗留指针泄露地址 |
如上表布局,利用unsordbin/largebin切割把libc/heap指针推到overlap前遗留的指针地址即可。
然后常规largebin attack
打_IO_list_all
,house of apple 2
即可。
|
|
6502
孩子的第一个vm题。
稍微总结了一点做vm的思路。(虽然样本只有一个)
除了got是黄的全绿,且最后给了一个read随后puts,不得不让人想到改elf.got.puts
->libc.sym.system
。
程序一开始直接把所有指令读入并送入vm执行,那就先去看看vm的write_mem
有没有什么问题。
看起来似乎好像没什么问题,但有个强行转成signed short
就很怪,最后也证实这里可以负向溢出改got表。
然后看访存模式。
abs模式允许在命令中直接指定(short)addr_abs,正好拿他来做溢出。
poc逻辑就有了。
|
|