[Round 1] giaopwn
这一题覆盖完rbp后,只能输入三个p64()数据,这里可以找到cat flag
的字符串,所以我们考虑先控制rdi为cat flag
的地址,后返回到system函数(此次返回要返回到call _system
的位置,如果直接返回到system的plt表位置,将会因为栈未对齐导致失败,因为我们不知道system函数的真实地址,同时没有空间让我们插入ret
,所以采取这个方式)
exp如下:
[Round 1] ezfmt
可以看到,这里存在格式化字符串的漏洞,在read时也可以同步覆盖rbp和返回地址
我们可以考虑,一次性修改printf的got表地址,让它变成system的真实地址
我们可以控制格式化字符串和返回地址达到循环执行vuln的目的
第一次循环,泄露libc基址
第二次循环,修改printf的got表地址
第三次循环,执行system(“/bin/sh”)
exp如下:
[Round 1] ezorw
可以看到,程序通过mmap申请了一块区域,从gdb中可以看到,这一块区域可读可写可执行.我们可以通过read注入shellcode来获取flag
从这里可以看到,程序开启了沙箱机制,禁用了read write等函数,于是我们考虑openat+sendfile
exp如下:
[Round 1] canary_orw
可以看到,程序采用了沙箱机制,禁用了execve函数,我们可以考虑openat/open+sendfile或者open+read+write,也可以直接ShellcodeMall.amd64.cat_flag
在主函数中,我们可以修改返回地址到vuln
在vuln中,我们可以溢出buf来修改v3的数据,再通过sys_read来实现任意地址写,我们考虑通过这个任意地址写,修改___stack_chk_fail的got表为leave ret
的地址,这样就可以绕过canary
通过这一串汇编,我们可以让rip跳转到栈顶执行shellcode
exp如下:
[Round 1] ezstack
思路一:
可以看到,stack函数内存在栈溢出,如果返回到vuln的顶部,则要想办法通过过滤拿到shell.初步探索可得system函数执行$SHELL
或$0
在一定程度上来说,可以拿到shell
exp如下:
思路二:
通过这一串汇编代码,一方面在指定位置输入数据,另一方面进行栈迁移
再通过这一串汇编执行system
exp如下:
[Round 2] ezstack2
控制rdi为1131796再返回vuln即可
exp如下:
[Round 2] magicread
考虑通过这一串汇编实现输入+栈迁移
本题要栈迁移四次
exp如下:
[Round 2] shortshell
可以执行shellcode,但是只有五字节…
存在后门函数,也就是说,shellcode只需要实现跳转
这里想到jmp跳跃,由于jmp是以目前的地址为基础的,我们可以算出jmp -0x2df9
exp如下:
[Round 3] Secret
太简单,懒得说
[Round 3] ezstack3
可以看到,我们可以控制ebp和返回地址,优先考虑栈迁移
用这一串汇编来实现输入新数据+栈迁移
exp如下:
这道题貌似有bug,不知道为什么,如果将/bin/sh的地址整一个作为参数,则在执行system的时候会覆盖/bin
四个字符,于是我们考虑执行system("sh")
.
这道题如果将payload改为payload = b"/bin/sh\x00"+p32(elf.plt["system"])+p32(0)+p32(ebp1+5)+b"A"*(0x20-4)+p32(ebp1+4)+p32(leave_ret)
,无法执行;改为payload = b"/bin/sh\x00"+p32(elf.plt["system"])+p32(0)+p32(ebp1)+b"A"*(0x20-4)+p32(ebp1+4)+p32(leave_ret)
也无法执行,详细原因不明确