初级CTF,后面的题还是有些难度。Misc比较多,没有安卓。
附上所有rev的下载地址
链接: https://pan.baidu.com/s/1FWGmN9Hdp1ooyBnV5zzonw 提取码: c5j6
flag在服务器上,但可以在本地先测试。
按照指示,启动程序的时候要加2个参数。然后进去输入angstrom就会显示Flag了。
要输入2个数,2个数满足如下关系,解方程:
v4+v5=136
v4*v5=3783
直接在IDA编写解密脚本得到flag:
actf{i_think_im_going_to_be_sick}
判断逻辑在这个函数中
都是对每一位进行判断。
d函数*a1 == 0x30313763;
0x30313763 = 00110000 00110001 00110111 01100011
说明a12-15为017c
其他函数都不复杂
z函数最麻烦,要先得到前几位才能计算z,但是每一步都认真分析就没问题了。
actf{fun_fun017cn5}
如果动态调试会方便很多,但我是IDA静态分析。
程序是对一个图片进行隐写操作。
以B表示point_bit2
化简为
B=B|(R^G^is1)&1
可以得出一个结论:
如果B末位为0,那么R^G^is1=0
如果B末位为1,那么R^G^is1=1
html脚本如下:
<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脚本如下:
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)
这个我没做出来,听大神说是修复UPX压缩文件,然后动态调试。
网站内嵌了一个IRC,直接进入频道就有flag。
问卷调查,填了有flag。
strings ./full-mueller-report.pdf | grep actf
用正则表达式搜索
actf{no0o0o0_col1l1l1luuuusiioooon}
Keli下打开Pdf,在摘要下面有flag。
Windows下打不开,提示不是有效的pdf,应该是要修复某些标志位。但是keli下好像无视了部分不对的问题可以打开。
也可以pdf修复在这里修复一下,就可以打开了。
提示file carving(文件包含)
foremost ./paper_bin.data
解压出很多pdf,在其中一个pdf找到了flag。
pcap流量分析,每个包
每次发送一个字符,连起来就是flag
是一个json文件。Scratch是面向少年的简易编程工具,把Json导入Scratch项目中运行可以得到flag。
解密脚本
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)
在输出中找到
p = 8337989838551614633430029371803892077156162494012474856684174381868510024755832450406936717727195184311114937042673575494843631977970586746618123352329889
q = 7755060911995462151580541927524289685569492828780752345560845093073545403776129013139174889414744570087561926915046519199304042166351530778365529171009493
e = 65537
c = 7022848098469230958320047471938217952907600532361296142412318653611729265921488278588086423574875352145477376594391159805651080223698576708934993951618464460109422377329972737876060167903857613763294932326619266281725900497427458047861973153012506595691389361443123047595975834017549312356282859235890330349
RSA算法。
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。
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{}
可以得到
这时候要猜了,taste如果是一个单词,后面要跟_(下划线);如果是tastes的话,tastes后面是下划线。通过比对,flag为
actf{coffee_tastes_good}
n: 99157116611790833573985267443453374677300242114595736901854871276546481648883
g: 99157116611790833573985267443453374677300242114595736901854871276546481648884
c: 2433283484328067719826123652791700922735828879195114568755579061061723786565164234075183183699826399799223318790711772573290060335232568738641793425546869
题目提示 Paillier 加密。
百度一下,发现c是密文,g=n+1,但是需要p、q,p*q=n,这时候要分解n得到p、q。
在这个网站进行大数分解,得到
Github找了一个Paillier 加密解密代码。
修改了一下
得到flag。actf{crypto_lives}
第一次做出这么多题来,虽然做出来的都是简单的,主要是之前的DDCTF做的我没信心。没有安卓逆向,有点可惜。最近CTF比赛挺多的,继续参加,边做边学。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。