题目附件https://github.com/nyyyddddn/ctf/tree/main/wkctf_pwn
pwn
baby_stack
在guess number逻辑这里用格式化字符串泄露 libc地址后
1 | __int64 wait() |
echo 这存在一个 off by null的溢出,有大量的leave ret的逻辑,走完这些leave ret 栈就被迁移到了buf上,由于不知道具体位置,找大量的 nop: ret的gadget写满buf,再结尾写一个system binsh的rop就好了,有可能会因为system中 xmm寄存器 rsp对齐的原因失败,多跑几次就好了
1 | __int64 __fastcall echo(unsigned int a1) |
exp
1 | from pwn import * |
easy_heap
glibc 2.23
只有 add edit show三个逻辑,其中show逻辑只能打印八个字节的数据,edit中存在溢出,house of orange,打house of orange的时候,剩余的top chunk大小如果属于fastbin范围,比如说 0x61 就能得到一个fastbin,在sizelist往上部分,有一个位置的值是 0x71,刚刚好满足fastbin的大小,通过fastbin attack可以把堆块申请到那边,然后再配合edit的溢出就能写到chunklist,之后就能实现任意地址读写的原语,通过got泄露libc的基地址,然后将got改成onegadget getshell
1 | int __cdecl __noreturn main(int argc, const char **argv, const char **envp) |
exp
1 | from pwn import * |