2025hgame
去年的唯唯诺诺,今年的重拳出击😁
week1
format
无数次格式化字符串漏洞,但是一次只有三个字节,vuln可以直接用-1绕过,关键是利用格式化字符串漏洞泄露出libc地址
可以用%*d+%s来泄露libc地址,后续直接打system的rop链子


1 | from pwn import* |
方法二
可以直接用栈溢出做,这里主要利用printf的gadget
我们需要做出合理的栈布局

1 | payload=b'a'*0x5+p64(stack)+p64(0x4012CF)+p64(1)+b'%29$p\x0011'+p64(1)+p64(0)+p64(0x000000000040119d)+p64(stack+0x24)+p64(0x4011D9) |

可以泄露出libc地址,后续走system的rop链会卡栈,需要用ret2syscall打system
1 | from pwn import* |
counting petals
数组越界,v7最后一个越界到v8,v9,我们可以任意越界写,后边打印也会外带出libc地址,并且不是偶数有两次机会,第一次利用数组越界泄露libc地址,第二次走rop链子

1 | from pwn import* |
ezstack
webpwn
主体就是一个栈迁移,有0x10字节溢出,并且开启沙盒

这里给出gift,跟正常相比的就是fd位是4,最后orw的参数分别是0,5,4

1 | from pwn import* |
week2
Hit list

add

edit

gift

典菜单堆题,漏洞点uaf
add限制堆块大小<=0x3f0,这样就不能进行largerbin attack了,每次申请堆块会申请0x20的信息堆块
同时给出gift,可以任意地址free,触发条件是malloc(0)
edit是先将堆块free之后利用申请堆块的部分将堆块再次申请出来写入
首先就是泄露堆地址,申请两个共同大小的堆块,释放后申请0x20大小的堆块,就可以得到堆地址
其次是泄露libc地址,释放大于0x88的堆块,先将tcachebin添慢,中间0x30的堆块如果满的话没办法free,我们可以申请0x20的堆块再次释放,就可以拿到libc地址
最后我们申请一个大堆块,伪造好合适的size,利用gift将伪造的堆块释放,之后edit大堆块就可以完成tcachebin attack,攻击IO_list_all,写入我们伪造fake_io的堆地址,走house of apple2,exit退出触发getshell
1 | from pwn import* |
Where is the vulnerability
菜单堆题,2.39
add,edit,free,show四个功能正常
存在uaf漏洞,这里直接走house of cat就行
存在沙盒,走orw
三个库patch一下就行,不要忘了更改权限
1 | patchelf --replace-needed libc.so.6 路径 文件 |
1 | from pwn import* |
signin2Heap
菜单堆题,2.27
add,free,show三个功能函数
add中存在of by null漏洞,限制大小<0xff
因为add会将最后一个字符转为\x00会将打印函数截断
这里我们先把tcache塞满,之后能得到进入unsortdbin堆块,控制好堆布局,将下一个堆块的pr_size和pr_inuse位修改,释放触发堆块合并,之后将第一个堆块申请出来,libc地址就会进入第二个堆块中,这个堆块还没有释放,泄露得到libc
之后再次造成堆块合并,同时申请出第一个堆块包含第二个(未释放)fd位,释放第二个堆块,我们就可以更改它的fd位,完成tcachebin attack,攻击free_hook,getshell
原理的话可以看这篇文章https://www.jianshu.com/p/056c9db22d81

1 | from pwn import* |