WHUCTF2025 pwn wp
repeater_handout
首先常规泄露canary,调试发现栈上存的返回地址是libc上的地址,可以用来leak libc。接下来常规ret2libc即可。
1 |
|
ezvm
通过选项5和6的负溢出可以造成一定范围内地址读写,刚好可以读写到printf
的got表项,利用vm中的运算指令,可以通过读取printf地址再根据偏移计算system地址的方式,覆写printf的got至system
,再把printf输出的那个字符串修改成sh即可get shell
1 |
|
shell_for_shell
给了shellcode,但寄存器全部清零,禁止输入syscall。由于没开pie,可以直接通过plt表调用函数(在shellcode里就是用call plt地址)。
解法1(重read)
这里调用mprotect
修改当前内存段的权限为7并利用read
函数重新读取shellcode来执行syscall
1 |
|
解法2(自修改)
这里修改权限后自修改代码。
1 |
|
shell_for_another_shell
和上一题一样,但开了pie,现在考虑利用fs
寄存器泄露tls,进而泄露libc。拿到libc后我们可以通过environ
变量获取栈帧地址,恢复栈帧,进而调用system函数get shell
为什么不用syscall
?
当我们使用syscall调用execve("/bin/sh", NULL, NULL)
打远程时会发现远程打不通。我们认为这是远程环境使用busybox的原因。
如果你曾经调试过shellcraft
生成的shellcode就会发现,它实际上会给execve
的argv
传参,这样做之后远程也能正常打通了。这是因为busybox 是通过 argv[0]
定位程序的,如果没有argv
参数,busybox就不能识别功能,抛出applet not found
错误。
可以参考busybox源码:https://elixir.bootlin.com/busybox/0.50/source/applets/busybox.c#L88
exp
1 |
|
高版本内核下的新情况
在6.8版本内核中,tls和libc的偏移不再固定。考虑到2.35libc下只有一个syscall,我们可以通过在shellcode搜索syscall的字节码的方式定位libc。
1 |
|
heap
堆块大小无下限,也就是有tcache,还有非常巨大的堆溢出,直接tcache poison
+house of apple2
一把梭即可
tcache在libc2.32版本加入了指针异或保护,需要leak堆地址才能正常投毒
1 |
|