asis-ctf的writeup收集

1. Random Image

官方给出的加密代码如下:

#!/usr/bin/env python

import Image
import random

def get_color(x, y, r):
  n = (pow(x, 3) + pow(y, 3)) ^ r
  return (n ^ ((n >> 8) << 8 ))

flag_img = Image.open("flag.png")
im = flag_img.load()
r = random.randint(1, pow(2, 256))
print flag_img.size

enc_img = Image.new(flag_img.mode, flag_img.size)
enpix = enc_img.load()

for x in range(flag_img.size[0]):
  for y in range(flag_img.size[1]):
    t = random.randint(1, pow(2, 256)) % 250
    enpix[x,y] = t


for x in range(flag_img.size[0]):
  for y in range(flag_img.size[1]):
    if im[x,y] < 250 :
      s = get_color(x, y, r)
      enpix[x,y] = s

enc_img.save('enc' + '.png')

加密后的图片如下(enc.png):


分析加密代码主要就是当原来的像素小于250的时候就经过get_color()来获得相应的像素值。

get_color()这个函数就是取(x**3+y**3)^r的最后8位,虽然不能直接求出r,但是只要知道其最后八位就可以了。可以用暴力从0-255。初始化enc.png的像素的时候都是取250的模的所以应该都是小于250,对于那些大于250的值一定是从get_color()中获得。

(1) 先获得像素点大于250的点

import Image

enc_img=Image.open('enc.png')
im=enc_img.load()
count=0

for x in range(enc_img.size[0]):
    for y in range(enc_img.size[1]):
        if im[x,y]>=250:
            print x,y,im[x,y]
            count+=1

print count

一部分的结果如下:

1317 64 251
1323 29 254
1325 27 254
1326 61 251
1330 43 253
1334 44 254
1335 45 250
1344 37 251
1345 54 255
1347 32 253
1347 40 253
1347 48 253
1347 56 253
1350 32 254
1350 56 254
1353 59 250
1366 29 251
1366 59 253
1368 37 251
1372 54 254

在其中随便选中一点来实现暴力求解r

def get_color(x, y, r):
    n = (pow(x, 3) + pow(y, 3)) ^ r
    return (n ^ ((n >> 8) << 8 ))

for i in range(256):
    if get_color(1372,54,i)==254:
        print i
        break

beyond@beyond ~/下载
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值