比赛的时候一道题都没做出来,哭了,我真的太菜了。回来复盘了两道pwn题:mypypy和Ruuust,简单记录一下。
mypypy
两题都不是常见pwn,刚拿到手有点懵,随便试了一些输入,发现是把python的语法给编译成了asm。
然后仔细地看他是怎么翻译的,首先扫描一遍整个函数中所有出现的变量名,如果函数中有数组的话,就加一个位置存放数组个数,数组变量可以使用加法赋给另一个变量造成数组溢出,可以实现栈上任意数据读和任意数据写。
然后想到的是可以利用libffi中的gadget做rop调用mprotect将栈上的shellcode设为可执行后跳shellcode,但是还是比较复杂的。
回来以后发现如果出现字符串常量,会出现命令拼接的问题,可以直接拼接shellcode。
1 | def main(): |
Ruuust
去符号的rust程序,看了10分钟就不想看了,觉得自己肯定是看不懂的。手动玩了一会也不知道会是什么洞,就放弃了。
回来后动态调试了一下。发现menu是用一个独立的线程打印出来的,主循环是用另外一个线程执行的,不知道这是Rust的特性还是啥的。
发现3选项Talk with me直接是往栈上读的,比赛的时候还以为是malloc的。往栈上读可以溢出。
题目转化为无canary的栈溢出,第一轮leak libc,第二轮跳one gadget。
1 | #!/usr/bin/python |