前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >angstromctf-2019-部分WriteUp

angstromctf-2019-部分WriteUp

原创
作者头像
轻吻晴雯
修改2019-04-26 18:01:46
1.3K0
修改2019-04-26 18:01:46
举报
文章被收录于专栏:杂文共赏杂文共赏

ångstromCTF

前言

初级CTF,后面的题还是有些难度。Misc比较多,没有安卓。

一、REV

附上所有rev的下载地址

链接: https://pan.baidu.com/s/1FWGmN9Hdp1ooyBnV5zzonw 提取码: c5j6

Intro to Rev

flag在服务器上,但可以在本地先测试。

按照指示,启动程序的时候要加2个参数。然后进去输入angstrom就会显示Flag了。

I Like It

likeit1.png
likeit1.png

要输入2个数,2个数满足如下关系,解方程:

v4+v5=136

v4*v5=3783

One Bite

ontbit.png
ontbit.png

直接在IDA编写解密脚本得到flag:

actf{i_think_im_going_to_be_sick}

High Quality Checks

判断逻辑在这个函数中

check.png
check.png

都是对每一位进行判断。

d函数*a1 == 0x30313763;

0x30313763 = 00110000 00110001 00110111 01100011

说明a12-15为017c

其他函数都不复杂

z函数最麻烦,要先得到前几位才能计算z,但是每一步都认真分析就没问题了。

actf{fun_fun017cn5}

如果动态调试会方便很多,但我是IDA静态分析。

Icthyo

out.png
out.png

程序是对一个图片进行隐写操作。

final.png
final.png

以B表示point_bit2

化简为

B=B|(R^G^is1)&1

可以得出一个结论:

如果B末位为0,那么R^G^is1=0

如果B末位为1,那么R^G^is1=1

html脚本如下:

代码语言:txt
复制
<canvas id="canvas" width="256" height="256">对不你,你的浏览器不支持Canvas</canvas>
<script>

var ctxt = canvas.getContext('2d');
var img = new Image(256,256);
img.src = 'img.png';//src也可以是从文件选择控件中取得。
img.onload = function(){
    ctxt.drawImage(img, 0, 0);
    var data = ctxt.getImageData(0, 0, 256, 256).data;//读取整张图片的像素。
	var pixel = [0,0,0]//像素RGB
	var flag = new Array(256)
	for (var i=0;i<256;i++)
	{

		var chr = 0;//用来存储解密出来的字符
		//k是第k位     读出来的图片自动加了A通道
		for (var j=0,k=0;j<256;j=j+32,k++)
		{
			pixel[0] = data[((i * (256 * 4)) + (j*4)) + 0]; //R值
			pixel[1] = data[((i * (256 * 4)) + (j*4)) + 1]; //G值
			pixel[2] = data[((i * (256 * 4)) + (j*4)) + 2]; //B值
			RxorG = pixel[0]^pixel[1];
			if(pixel[2]%2==0){
				if(RxorG&1==1){
					chr = chr | (1 << k)
				}else{
					chr = chr | (0 << k)
				}
			}else{
				if(RxorG&1==1){
					chr = chr | (0 << k)
				}else{
					chr = chr | (1 << k)
				}
			}
			
		}
		flag[i] = chr;
	}
	console.log(flag);
	var ascii_flag = '';
	for (var m=0;m<flag.length;m++){
		ascii_flag = ascii_flag + String.fromCharCode(flag[m]);
	}
	console.log(ascii_flag);
	
}

</script>

得到flag:

actf{lurking_in_the_depths_of_random_bits}

python脚本如下:

代码语言:txt
复制
from PIL import Image
image = Image.open('out.png')
pixels = list(image.getdata())
flag = [0 for _ in range(256)]
for i in range(256):
	row = pixels[i*256:(i+1)*256]
	for j in range(8):
		pixel = row[j*32]
		bits = [x & 1 for x in pixel]
		bit = bits[0] ^ bits[1] ^ bits[2]
		flag[i] ^= bit << j
flag = bytes(flag)
print(flag)

Bugger

这个我没做出来,听大神说是修复UPX压缩文件,然后动态调试。

二、MISC

IRC

网站内嵌了一个IRC,直接进入频道就有flag。

Survey

问卷调查,填了有flag。

The Mueller Report

strings ./full-mueller-report.pdf | grep actf

用正则表达式搜索

actf{no0o0o0_col1l1l1luuuusiioooon}

Blank Paper

Keli下打开Pdf,在摘要下面有flag。

Windows下打不开,提示不是有效的pdf,应该是要修复某些标志位。但是keli下好像无视了部分不对的问题可以打开。

也可以pdf修复在这里修复一下,就可以打开了。

pdfflag.png
pdfflag.png

Paper Bin

提示file carving(文件包含)

foremost ./paper_bin.data

解压出很多pdf,在其中一个pdf找到了flag。

pdf.png
pdf.png

Paper Trail

pcap流量分析,每个包

pacp.png
pacp.png

每次发送一个字符,连起来就是flag

Scratch It Out

是一个json文件。Scratch是面向少年的简易编程工具,把Json导入Scratch项目中运行可以得到flag。

scrath.png
scrath.png

三、CRYPTO

Classy cipher

class.png
class.png

解密脚本

代码语言:txt
复制
def decrypt(d, s):
	e = ''
	for c in d:
		e += chr((ord(c)+s) % 0xff)
	return e
enc = ':<M?TLH8<A:KFBG@V'
for i in range(256):
	print decrypt(enc,i)

在输出中找到

res.png
res.png

Really Secure Algorithm

代码语言:txt
复制
p = 8337989838551614633430029371803892077156162494012474856684174381868510024755832450406936717727195184311114937042673575494843631977970586746618123352329889
q = 7755060911995462151580541927524289685569492828780752345560845093073545403776129013139174889414744570087561926915046519199304042166351530778365529171009493
e = 65537
c = 7022848098469230958320047471938217952907600532361296142412318653611729265921488278588086423574875352145477376594391159805651080223698576708934993951618464460109422377329972737876060167903857613763294932326619266281725900497427458047861973153012506595691389361443123047595975834017549312356282859235890330349

RSA算法。

代码语言:txt
复制
import gmpy2
import binascii
p = gmpy2.mpz(8337989838551614633430029371803892077156162494012474856684174381868510024755832450406936717727195184311114937042673575494843631977970586746618123352329889)
q = gmpy2.mpz(7755060911995462151580541927524289685569492828780752345560845093073545403776129013139174889414744570087561926915046519199304042166351530778365529171009493)
e = gmpy2.mpz(65537)
phi_n = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi_n)
print ("private key:")
print (d)

c = gmpy2.mpz(7022848098469230958320047471938217952907600532361296142412318653611729265921488278588086423574875352145477376594391159805651080223698576708934993951618464460109422377329972737876060167903857613763294932326619266281725900497427458047861973153012506595691389361443123047595975834017549312356282859235890330349)
print ("plaintext:")
m = pow(c,d,p*q)
print m
m_hex = hex(m)[2:]
print("ascii:\n%s"%(binascii.a2b_hex(m_hex).decode("utf8"),))

得到flag。

res2.png
res2.png

Half and Half

代码语言:txt
复制
from secret import flag

def xor(x, y):
	o = ''
	for i in range(len(x)):
		o += chr(ord(x[i])^ord(y[i]))
	return o

assert len(flag) % 2 == 0

half = len(flag)//2
milk = flag[:half]
cream = flag[half:]

assert xor(milk, cream) == '\x15\x02\x07\x12\x1e\x100\x01\t\n\x01"'

这个题有的部分要靠猜,因为题目把字符串分为2半,每一半对应的字符进行异或操作,谁还能再还原回去呢?

根据flag格式actf{}

可以得到

gs.png
gs.png

这时候要猜了,taste如果是一个单词,后面要跟_(下划线);如果是tastes的话,tastes后面是下划线。通过比对,flag为

actf{coffee_tastes_good}

Runes

代码语言:txt
复制
n: 99157116611790833573985267443453374677300242114595736901854871276546481648883
g: 99157116611790833573985267443453374677300242114595736901854871276546481648884
c: 2433283484328067719826123652791700922735828879195114568755579061061723786565164234075183183699826399799223318790711772573290060335232568738641793425546869

题目提示 Paillier 加密。

百度一下,发现c是密文,g=n+1,但是需要p、q,p*q=n,这时候要分解n得到p、q。

http://www.factordb.com/index.php?query=+99157116611790833573985267443453374677300242114595736901854871276546481648883

在这个网站进行大数分解,得到

big.png
big.png

Github找了一个Paillier 加密解密代码。

修改了一下

pill.png
pill.png

得到flag。actf{crypto_lives}

总结

第一次做出这么多题来,虽然做出来的都是简单的,主要是之前的DDCTF做的我没信心。没有安卓逆向,有点可惜。最近CTF比赛挺多的,继续参加,边做边学。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、REV
    • Intro to Rev
      • I Like It
        • One Bite
          • High Quality Checks
            • Icthyo
              • Bugger
              • 二、MISC
                • IRC
                  • Survey
                    • The Mueller Report
                      • Blank Paper
                        • Paper Bin
                          • Paper Trail
                            • Scratch It Out
                            • 三、CRYPTO
                              • Classy cipher
                                • Really Secure Algorithm
                                  • Half and Half
                                    • Runes
                                    • 总结
                                    相关产品与服务
                                    腾讯问卷
                                    腾讯问卷是专业的在线问卷调查平台,支撑了腾讯核心业务的⽤户、市场、产品研究工作。平台提供基于数据收集的专业调查研究解决方案,覆盖问卷调查、信息上报、在线测评、在线考试、360度评估、投票打卡等工作场景,致力于为客户提供高效的洞察决策工具。同时平台还拥有超百万级的真实样本用户,可以提供高效、精准的问卷有偿投放服务。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档