之前一直不知道怎么做,因为这几天做的题一直用到修改rip,所以突发奇想,看看能不能这道题也修改rip来动调到主函数(因为之前其实我是找到了可以断下来的点以及无法动调却调用的地方)
先是输入34个字符赋给v4,之后v4进行相邻两位的xor,然后进入sub14001142e
一顿下来,发现如此简单是必不可能的
这是个假main函数,根本没地方调用它……
问题就是这里将rip改成了sub1400113a7
加上这里根本无法f7
修改rip虽然无法使它正常调试,但是还能看看函数作用的
进入neww函数
v7,v8,v9和后面sub1400110fa的第一个参数都是地址,g转到地址,找到内容,发现v7是base64转换表,v8一段无规则码,v9是flag{i_am……}
动调出来发现sub1400110fa将flag{}变成了一段字符,很明显是将它按字母顺序重排序
下面部分,没看出来也感觉不太重要,先放放
分析下个函数
这里v8运算下来竟然是input:
多截几幅图来表达我内心的卧槽……菜鸡第一次见到这样的隐藏函数和假函数,原来是这样实现的,学会了!
所以这个函数是print(input)
分析这个函数
有一个cin,cin下面经分析是blowfish
可以看到有点像blowfish的sbox,pbox,但是每个的最后两位又不一样
key=who_am_i
接着分析
看看byte140021150
这特征,太像vm了
所以总体流程是
从头分析各个函数
startAddress:
v12通过地址的运算变成了blowfish不标准s_box的首地址,动调发现s_box变成了正宗的s_box
p_box同理
经此,完成了blowfish的初始盒
然后经过了输出input→输入flag→blowfish(key=who_am_i )→vm
动调vm部分
重复的部分很多,直接断点f9看rax,直到变化再步入看函数
这里我因为是修改rip,所以我的cin_str的数据都为0,为了方便调试,我把它的数据也改了
case1:
这样看得可能不是很明白,r一下,
将输入的字符进行hexlify
case5:
将v8=3f值置零
然后会发现不停的44-3和33-3,一直调到switch(v5)
会发现在57前都逆转了一下,逆转了32个字符串,与v8最大到3f对应
接下来会有几个循环
30,3,30,3,30,3,30,3,5f,9,d,6循环
当rax=d时,记录RDX数据
49,102,49,53,53,53,101,49,50,99,56,98,48,51,54,57
调试下来,发现经过case d发生改变
当v8=0x350时
步过后
35+50=85
42+3=45
记录v8的数值
0x00c4, 0x0330, 0x024c, 0x0350, 0x0424, 0x04f8, 0x0b0c, 0x0620,0x0708, 0x0f78, 0x09a0, 0x1260, 0x09c0, 0x0b28, 0x0ca8, 0x0e40
8,6循环,edx不停数据更新
dump出栈数据
unsigned char ida_chars[] ={
246, 50, 99, 53, 148, 55, 101, 54, 175, 55,
53, 56, 135, 104, 49, 57, 84, 57, 48, 101,
89, 59, 101, 97, 64, 111, 57, 51, 130, 108,
56, 57, 64, 104, 56, 49, 218, 63, 51, 55,
214, 57, 49, 54, 153, 66, 101, 102, 248, 64,
100, 50, 97, 60, 55, 55, 224, 61, 51, 100,
113, 113, 54, 48};
3,63循环
case63:
a2=rdx,与变化后的cin作比较,相等a3+1
记录出rdx数据
0x356332F6,0x36653794,0x383537AF,0x39316887,0x65303954,0x61653B59,0x33396F40,0x39386C82,0x31386840,0x37333FDA,0x363139D6,0x66654299,0x326440F8,0x37373C61,0x64333DE0,0x30367171
就是前面8—6循环的分组
走到34,发现输出了error
case34:判断之前的a3是否等于16
流程:输入→blowfish→hexlify→逆转→加数值→比较
写脚本
from binascii import unhexlify
from Crypto.Cipher import Blowfish
import codecs
compare=[0x356332F6,0x36653794,0x383537AF,0x39316887,0x65303954,0x61653B59,0x33396F40,0x39386C82,0x31386840,0x37333FDA,0x363139D6,0x66654299,0x326440F8,0x37373C61,0x64333DE0,0x30367171]
plus=[0x00c4, 0x0330, 0x024c, 0x0350, 0x0424, 0x04f8, 0x0b0c, 0x0620,0x0708, 0x0f78, 0x09a0, 0x1260, 0x09c0, 0x0b28, 0x0ca8, 0x0e40]
for i in range(16):
compare[i]-=plus[i]
#print(hex(compare[i]))
result = []
for a in range(16):
for i in range(4):
result.append(compare[a]>>(i*8)&0xff)
result=result[::-1]
result = bytearray(result)
#print(result)
key="who_am_i"
def Decrypt(enc,key):
key=key.encode("utf-8")
cl = Blowfish.new(key, Blowfish.MODE_ECB)
ciphertext = codecs.decode(enc, 'hex_codec')
code = cl.decrypt(ciphertext)
return code
flag = Decrypt(result, key)
print(flag)