buuctf
1.easyre
查壳:
没有壳,且为64位程序
分析:
使用ida64分析该文件发现,只是简单的判断我们的输入相等则输出flag。
#flag{this_Is_a_EaSyRe}
2.reverse1
查壳:
无壳,64位程序
分析:
使用ida64分析
输入的Str1字符串与Str2字符串比较,若相等则为flag。而Str2在进行比较之前做了一个变化,将 字符串中的字符 o 替换为 0.
故将Str2简单的替换一下即为flag
#{hell0_w0rld}
3.reverse2
查壳:
无壳,且为64位elf文件
分析:
跟上题一样的套路,如果将flag中的i和r字符,替换为1
手动还原即为flag
#{hack1ng_fo1_fun}
4.内涵的软件
查壳:
无壳,32位程序
分析:
分析了一段时间也没出来,突然回去看了一样hint。
结合hint
flag就是加上花括号里面的值
(这真的很内涵
#flag{49d3c93df25caad81232130f3d2ebfad}
5.新年快乐
查壳:
有upx壳,32位程序。
脱壳:
可以有工具脱也可以用esp定律法手脱。
分析:
输入与v4进行判断。
v4=HappyNewYear!
结合hint
#flag{HappyNewYear!}
6.[BJDCTF 2nd]guessgame
查壳:
分析:
明文显示。
#BJD{S1mple_ReV3r5e_W1th_0D_0r_IDA}
7.helloword
查壳:
分析:
#flag{7631a988259a00816deda84afb29430a}
8.xor
查壳:
分析:
对输入的字符进行了异或加密。
流程是下个字符异或上一个字符,然后与global中的字符进行比较。
解密即global中的字符与下一个字符进行异或即可。
解密:
str=[ 0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
0x47, 0x32, 0x4F]
flag=''
for i in range(0,len(str)-1):
str[i]^=str[i+1]
flag+=chr(str[i])
print(chr(0x66)+flag)
#flag{QianQiuWanDai_YiTongJiangHu}
9.reverse3
查壳:
无壳,32位程序
分析:
IDA打开,查看字符串
出现base64的表,猜测存在base64编码
加密流程:
base64编码-->每个字符的acii码+下标-->与Str2比较
解密流程:
Str2的每个字符的acii码-下标-->base64解码
解密:
import base64
str='e3nifIH9b_C@n@dH'
flag=''
for i in range(len(str)):
flag+=chr(ord(str[i])-i)
print(base64.b64decode(flag).decode('utf-8'))
#{i_l0ve_you}
flag{i_l0ve_you}
10.不一样的flag
查壳:
无壳,32位程序
分析:
发现有上下左右,猜测为迷宫题。开始那串01可能为地图。
分为5个一组有
解密:
走一下
# *1111
# 01000
# 01010
# 00010
# 1111#
222441144222
flag{222441144222}
11.SimpleRev
查壳:
无壳,64位程序
分析:
将KEY变成小写。
然后规定输入的字符为大写,然后进行一系列变化后字符与test的字符相等。
脚本:
一套逆向算法,一套爆破
test = 'killshadow'
key = 'ADSFKNDCLS'
for i in key:
i += chr(ord(i) + 32)
print(i[1:], end='')
flag1 = [0]*len(test)
key = 'adsfkndcls'
for i in range(len(test)):
flag1[i]=(ord(test[i])-97)
print(flag1,end='')
flag2=[0]*len(test)
for i in range(len(test)):
flag2[i]=(97-ord(key[i%10])-39)
print(flag2)
for i in range(len(test)):
for f in range(ord('A'),ord('Z')+1):
enc=f
if flag1[i]==(enc-39-ord(key[i%10])+97)%26:
print(chr(f),end='')
flag=''
for i in range(len(test)):
for f in range(ord('A'),ord('Z')+1):
enc=f
if test[i]==chr((enc-39-ord(key[i%10])+97)%26+97):
flag+=chr(f)
print(flag)
#flag{KLDQCUDFZO}
12.Java逆向解密
分析:
输入的字符串中的字符+‘@’后的acii与32异或。然后与KEYList里面的值相等。
解密就是KEYList减去‘@’再与32异或
脚本:
str=[180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
flag=''
for i in str:
i=(i-ord('@'))^32
flag+=chr(i)
print(flag)
#This_is_the_flag_!
13.刮开有奖
查壳:
32位未加壳
分析:
重新初始化v7的值,使用动态调试直接获得变化后的值。
然后发现该函数位base64编码函数。
base64的值给出了,直接获得原值,然后
求一下剩下的值。
最后得到flag为
flag{UJWP1jMp}
14.[BJDCTF 2nd]8086
查壳:
未知文件?
打开ida查看
密文异或了。
直接解密看看
s=']U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;'
flag=''
for i in range(len(s)):
flag+=chr(ord(s[i])^0x1f)
print(flag)
#BJD{jack_de_hu1b1an_xuede_henHa0}
15.[GKCTF2020]Check_1n
查壳:
无壳,32位程序
分析:
首先要找开机密码。
发现一串疑似base64的字符串,拿去解密
接着还发现一串。编码。
这是非预期解,我们继续,正常分析。
打砖块死亡后出现flag
flag{f5dfd0f5-0343-4642-8f28-9adbb74c4ede}
16.findit
查壳:
未加固
分析:
把代码扣下来,直接解密就行了
脚本:
c++
#include <iostream>
int main()
{
char a[] = { 'T', 'h', 'i', 's', 'I', 's', 'T', 'h', 'e', 'F', 'l', 'a', 'g', 'H', 'o', 'm', 'e' };
char b[] = { 'p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}' };
unsigned char x[17] = {};
unsigned char y[38] = {};
for (int i = 0; i < 17; i++) {
if ((a[i] < 'I' && a[i] >= 'A') || (a[i] < 'i' && a[i] >= 'a')) {
x[i] = (char)(a[i] + 18);
}
else if ((a[i] < 'A' || a[i] > 'Z') && (a[i] < 'a' || a[i] > 'z')) {
x[i] = a[i];
}
else {
x[i] = (char)(a[i] - '');
}
}
for (int i2 = 0; i2 < 38; i2++) {
if ((b[i2] < 'A' || b[i2] > 'Z') && (b[i2] < 'a' || b[i2] > 'z')) {
y[i2] = b[i2];
}
else {
y[i2] = (char)(b[i2] + 16);
if ((y[i2] > 'Z' && y[i2] < 'a') || y[i2] >= 'z') {
y[i2] = (char)(y[i2] - 26);
}
}
}
for (int i = 0; i < 38; i++) {
printf("%c", y[i]);
}
}
python
b=['p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}']
y=[0]*len(b)
for i in range(len(b)):
if ((b[i] < 'A' or b[i] > 'Z') and (b[i] < 'a' or b[i] > 'z')) :
y[i] = b[i]
else:
y[i] = chr(ord(b[i] )+ 16)
if ((y[i] > 'Z' and y[i] < 'a') or y[i] >= 'z') :
y[i] = (chr) (ord(y[i]) - 26)
for i in y:
print(i,end='')
17:[GXYCTF2019]luck_guy
查壳:
无壳,64位程序
分析:
照着流程分析下去,解密即可
脚本:
str='icug`ofx7F'
print(len(str))
flag1='GXY{do_not_'
flag2=''
for i in range(8):
if (i%2==1):
flag2+=chr(ord(str[i])-2)
else:
flag2+=chr(ord(str[i])-1)
print(flag1+flag2)
#GXY{do_not_hate_me}
#注意,题目提交是flag{***}形式
18.简单注册器
查壳:
未加壳
分析:
分析代码流程发现,会对输入的字符串进行判断,输入不正确就跳出,那我们改smali代码,使其条件永远成立即可得flag
另外一种解法,就是直接扣出这段代码,跑一下
flag{59acc538825054c7de4b26440c0999dd}
19.[GWCTF 2019]pyre
分析:
使用umcompyle6反编译pyc文件
简单的逆向一下就出来了
脚本:
# l = len(input1)
# for i in range(l):
# num = ((input1[i] + i) % 128 + 128) % 128
# code += num
#
# for i in range(l - 1):
# code[i] = code[i] ^ code[(i + 1)]
code = ['x1f', 'x12', 'x1d', '(', '0', '4', 'x01', 'x06', 'x14', '4', ',', 'x1b', 'U', '?', 'o', '6', '*', ':', 'x01', 'D', ';', '%', 'x13']
str=[0]*len(code)
print()
for i in range(len(code)):
str[i]=ord(code[i])
print(str)
str=str[::-1]
print(str)
for i in range(len(str)-1):
str[i+1]=str[i]^str[i+1]
str=str[::-1]
print(str)
for i in range(len(str)):
for f in range(0x20,0x7f):
enc=f
if(str[i]==((enc + i) % 128 + 128) % 128):
print(chr(f),end='')
#GWHT{Just_Re_1s_Ha66y!}
20.RSA
解析key.得到N和e
写脚本解密即可。
import gmpy2
import rsa
e=65537
n=86934482296048119190666062003494800588905656017203025617216654058378322103517
p=285960468890451637935629440372639283459
q=304008741604601924494328155975272418463
phin = (p-1) * (q-1)
d=gmpy2.invert(e, phin)
key=rsa.PrivateKey(n,e,int(d),p,q)
with open("flag.enc","rb") as f:
f=f.read()
print(rsa.decrypt(f,key))
#flag{decrypt_256}
21.[BJDCTF2020]JustRE
查壳:
32位无壳
分析:
动调直接改条件成立即可得到flag
22.CrackRTF
查壳:
无壳32位
分析:
第一步是的输入的6个数字,与“@DBAapp”进行拼接,然后经过sub_40100A后与40位的字符串进行比较。
我们打开sub_40100A发现
好家伙,就看到hash,想到hash加密,但是有很多类型,拷贝函数名去网上现学了一波。
CryptCreateHash的第二参数如下图,为sha1加密
我们直接爆破。
import hashlib
flag2='@DBApp'
for i in range(100000,999999):
h2 = hashlib.sha1(str(i).encode()+flag2.encode())
flags = h2.hexdigest()
if "6e32d0943418c2c33385bc35a1470250dd8923a9" == flags:
print (str(i)+flag2)
print (flags)
可以得到我们输入的六个数字为
123321
进入第二关
也是有一个加密函数加密了,我们继续分析。
查看官方文档可知,此处为MD5加密
在线破解了一下,都破解不了。
那只能继续看程序流程
读取AAA文件然后取内容进入sub_401005进行异或操作,然后传出来写入.rtf。
(然后下面百度的,不知道怎么做了)
原来是.rtf的文件头是固定的,而异或后传进来的前六个数刚好是文件头,所以在百度找到前六个数在做异或就可得到加密前的密文了。
s = "{\rtf1"
a = [0x05, 0x7D, 0x41, 0x15, 0x26, 0x01]
flag = ""
for i in range(0, len(s)):
x = ord(s[i]) ^ a[i]
flag += chr(x)
print(flag)
#~!3a@0
然后按循序输入我们的答案即可,
然后当前目录下生成了
23.
查壳:
无壳64位
分析:
shift+f12发现
了base64的表,猜测存在base64加密。
--------------复习了期末了,考完下再写了------------------------------------