SimpleVM

Posted by rk700 on September 16, 2014

这是tiger给的一个ELF文件,普通用户似乎无法执行?以root执行后要输入东西,然后有判断

具体地,用readelf -a可以发现文件是比较畸形的。而且entry point还在mmap映射区域之外?但从网上搜的结果,映射时还是会映射page size的整数倍;而想这个文件区域13c7之后还有内容,也会被映射到内存。所以entry point处的内容为

hexdump -C -v -s 5084 SimpleVM`

反汇编可得到其语句

tail -c +5085 SimpleVM | ndisasm -b 32 -

之后就是一步步来了。我用gdb调试一步步走。

奇怪的地方是int 0x80,似乎参数是从栈上传递的?否则的话解释不通?int 0x80调用mmap,flags里设了MAP_ANONYMOUS,所以fd给了-1。这样把0xc03000后面0x1000个bytes设为0了。

后来遇到了大量的跳转,开始还一直跟下来看每条指令的,但后来发现太多了,估计是混淆用的,因为输入一直没出现。值得注意的是如果用gdb设了断点,那么不往下面走会一直死循环,可能是因为int 3改变了eip的走向

后来总算遇到了int 0x80,这次是函数readlink, 参数似乎是从寄存器传的。链接路径地址是’/proc/self/exe’

然后发现实在是太繁琐了,读不下去了……

后来发现可以直接检查syscall的地方,就是在gdb里catch syscall。这样很快就定位到输出Input的地方。然后发现距离开始好长……要真是一步步走不知道要走到什么时候

折腾了一晚上还是没搞明白……后来看好像是会启动子进程,然后父进程里有虚拟机,还要转化指令什么的……放弃了