[攻防世界]进阶区pwn1
这个题除了PIE基本都开了,可能是要绕过canary或者泄露canary再栈溢出
运行程序发现选1是写入,选2是输出,选3是退出
IDA打开静态分析一波
发现没有system和/bin/sh,但是有write和puts,并且题目附件给了个libc,所以应该是要用write或puts泄露自身地址,计算system的真实地址
这个程序的主体部分都在main函数里
read这里有一个明显的栈溢出,字符串s定义的长度只有0x90,但是read了0x100
看栈结构可知,canary( 即图中var_8 )值位于s下方
低地址会向高地址溢出,并且程序里有puts
canary的值前两位是\x00,而puts遇到\x00就会停止输出,所以要用s溢出覆盖掉canary的前两位,然后输入1让puts输出canary的值,拿到canary值以后就可以为所欲为的栈溢出了,想去哪就去哪
我的思路:
- 选1,让s溢出至canary
- 选2,让puts把连着的canary也输出出来
- 接收canary值,选1,覆盖返回地址到write或puts (puts更简单点,只用传一个参) ,计算libc基地址
- 计算system和/bin/sh实际地址
- 选1,return到system构造system(“/bin/sh”),拿到shell
但是发现这么做不行,报错
于是乎去看了看别的大佬的wp,好像是服务器里没有sh,所以没法用/bin/sh,需要用一段one_gadget
,调用execve(“/bin/sh”)来拿到shell,就是说不用计算system和/bin/sh的地址,只用计算one_gadget的地址,跳转过去即可
EXP:
1 | from pwn import * |