-
-
[原创]攻防世界pwn高手进阶区pwn1
-
发表于:
2019-9-9 22:55
18514
-
64位程序,动态链接,然后保护开的差不多了
程序无system(),无"/bin/sh",但是程序有libc(有libc表示有获得shell的函数),这就比较好办了,
在libc中找以一下shell的地址
继续,分析main()
v8就是那个标志canary,程序有个输出puts(),有read(),并且read()有一个非常明显的溢出(s的大小只有0x90,但是read读取了0x100大小的数据)
然后程序要求输入1/2/3进行选择下一步的操作
需要利用puts()泄露出标志canary,标志canary在rbp的上面,也就是在s的底部,所以当我们输入0x88个字节 的时候,puts()就能够将标志canary输入出来
上图为输入0x88个a之后的堆栈情况其中0x00007FFFF8B292A8处标志canary(这个不是真正的canary,下面会说明),0x00007FFFF8B292ABB为返回地址,继续运行程序能够得到标志canary
需要注意的是:canary的真实值应该是0x502CB52AB5572700,而不是0x502CB52AB557270A,这是因为在我们输入0x88个'a'时还输入了一个回车,这个回车将标志canary尾部的'\x00'覆盖为'\x0A'。另外正是因为这个回车覆盖掉'\x00',才使得puts()能够输出标志canary,不然的话puts()在遇到'\0‘时就停止输出了
所以我们可以用以下这段代码获得标志canary
在获得到标志canary之后,我们可以再次利用puts()泄露出put()的真实地址,这是为了应对ASLR
由于是64位程序,所以需要一个gadget,这个可以直接找到
调用我们找到的execve("/bin/sh")
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)