一.hackme
1,查壳
无壳,64位。
2.IDA反编译。
逻辑:对flag进行异或后与byte_6B4270比较。异或的值为while循环后的值,由于比较时,是对应比较,所以while循环在那儿都可以。
3.exp
x=[0x5f,0xf2,0x5e,0x8b,0x4e,0xe,0xa3,0xaa,0xc7,0x93,0x81,0x3d,0x5f,0x74,0xa3,0x9,
0x91,0x2b,0x49,0x28,0x93,0x67]
flag=""
for i in range(len(x)):
a=i+1
c,b=0,0
while b < a:
b=b+1
c=1828812941*c+12345
flag+=chr((x[i]^c)&0xff)
print(flag)
4.get flag
flag{d826e6926098ef46}
二.BABYRE
1.查壳,
无壳,64位。
2.IDA反编译。
可以看出flag长度为14,关键是judge函数, 但是前面有judge[i]^0xc(这个东西给我整迷了。),跟进judge报错。
直接动调看汇编代码。
这个汇编逻辑还是比较简单的 :看到计算操错有一个xor看edx和ecx的值,
edx就是之前存的14个值,ecx是从0开始依次加一,(也就是对存入的14个值与其下表异或。)
3.exp
x=[0x66,0x6d,0x63,0x64,0x7f,0x6b,0x37,0x64,0x3b,0x56,0x60,0x3b,0x6e,0x70]
flag=""
for i in range(len(x)):
flag+=chr(x[i]^i)
print(flag)
4.get flag
flag{n1c3_j0b}
三.android-app-100
1.jadx 反编译。
找到关键函数a:分析逻辑可知editable为输入的flag,分别结果经过processObjectArrayFromNative和IsCorrect两个方法从MainActivity中得知这两个为native关键字(native:Java语言和其他语言进行梦幻联动的标志。)
2.改.apk后缀名为.zip 解压。在android-app-100\lib\armeabi中找到.so文件IDA反编译。
找到两个加密文件。都是一些比较操作。得到字符串ef57f3fe3cf603c03890ee588878c0ec
3,用夜神模拟器打开apk文件输入ef57f3fe3cf603c03890ee588878c0ec
4.get flag
Sharif_CTF(833489ef285e6fa80690099efc5d9c9d)
四.reverse-for-the-holy-grail-350
1.查壳:无壳,46位。
2.IDA反编译
关键函数在stringMod:
逻辑:开始的if是flag的0,3,6,9,12,15,18的值为firstchar的值。
然后对flag执行异或循环,异或的值为v7 (v7+=v7%5,起始为666),
之后就是比较,异或后的flag的2,5,8,11,14,17为thirdcher。然后是第二个if可以用爆破得到flag其余位置的值
3.exp
4.get flag
tuctf{AfricanOrEuropean?}