1.强网
64位无壳,ida拖入。
复制qiangwangxianfengjiushini到v6缓冲区,拷贝ZmxhZ3ttYWZha3VhaWxhaXFpYW5kYW9ifQ==前36个字符(正好是36)到v5缓冲区,因为存在“==”符号,应该是base64,下文for循环遍历v4与v5的每个字符(即解码base64),对应相等则成功解出,此题没有任何加密手段。
利用在线网站或编译软件都可解码。
import base64
base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
plaintext = "ZmxhZ3ttYWZha3VhaWxhaXFpYW5kYW9ifQ=="
base64_strings = [i for i in plaintext]
#print(base64_strings)
base64_strings = base64.b64decode(plaintext)
#print(base64_strings)
flag = ""
for i in base64_strings:
flag += chr(i)
print(flag)
2.mingyue
检查64位无壳。
ida64点击main函数。
分配了一个0x10的字节给到140004618,之后又将其空间地址给到620,此时620指向所分配的地址空间,之后给到618往后偏移8字节的空间设置为0。
ui64:unsigned integer 64位
推测140001080即是类printf或scanf类输入输出函数,格式化“lld”数字(long long int长整型十进制数据),进入1400010E0,跟进查看。
应该是某种加密操作,db字符串的第一处存储处是a4890572163,双击即可查看,如图为")(*&^%489$!057@#><:2163qwe",后面条件判断进入两个函数。
代码理解如下:(个人能力有限,真的好难QAQ)
函数给定参数a1,a2,a1转为64整型给到v3,下面较重要的是do while循环,v4 v2递增,v3整除26取整乘以-26(应该是以整除的取作偏移量),接着v3整除26重新赋值给v2。v2又给到v6,依次递减遍历每个字符给到v7,以v7异或7的值作为参数进入1400011E0,之后跟进1400001220。
内存分配,和main函数的部分差不多,主要是下方的利用此函数参数的v7^7作为result进入。
db字符串第二处存储的是在aV4pY59,之前在main中分配的内存空间620现在用来存储v5和v0作为if判断条件,之前的链表结构定义的每个节点位置进行遍历,判断字符是否对应等于aV4pY59字符表中的字符,判断长度到达14停止(每次判断两个节点),相等则结束循环,认证成功flag。(已晕(φ(◎ロ◎;)φ,真的不会啊QAQ)
编写脚本:(最后再解释下,原本最开始输入的lld长整型根据此得出,原文件是PE类,是要运行输入,得到正确显示框则成功)
str1 = ')(*&^%489$!057@#><:2163qwe'
str2 = '/..v4p$$!>Y59-'
def help(a):
for i in range(0,26): #判断对应相等
if str1[i] == a:
return i
str = [0]*14 #预先定义空数组
flag = 0 #下面每次遍历取偏移26
for i in range(0,14):
flag *= 26
str[i] = help(chr(ord(str2[i])^7))
flag += str[i]
print(flag)