何须像死猪余年
何须相思煮余年#
为什么没有代码呀?
出题人:@upsw1ng
没代码,好像又有代码
何须像死猪余年.txt
0x55 0x8b 0xec 0x81 0xec 0xa8 0x0 0x0 0x0 0xa1 0x0 0x40 0x41 0x0 0x33 0xc5 0x89 0x45 0xfc 0x68 0x9c 0x0 0x0 0x0 0x6a 0x0 0x8d 0x85 0x60 0xff 0xff 0xff 0x50 0xe8 0x7a 0xc 0x0 0x0 0x83 0xc4 0xc 0xc7 0x85 0x58 0xff 0xff 0xff 0x27 0x0 0x0 0x0 0xc7 0x85 0x5c 0xff 0xff 0xff 0x0 0x0 0x0 0x0 0xeb 0xf 0x8b 0x8d 0x5c 0xff 0xff 0xff 0x83 0xc1 0x1 0x89 0x8d 0x5c 0xff 0xff 0xff 0x83 0xbd 0x5c 0xff 0xff 0xff 0x27 0xf 0x8d 0xed 0x0 0x0 0x0 0x8b 0x95 0x5c 0xff 0xff 0xff 0x81 0xe2 0x3 0x0 0x0 0x80 0x79 0x5 0x4a 0x83 0xca 0xfc 0x42 0x85 0xd2 0x75 0x25 0x8b 0x85 0x5c 0xff 0xff 0xff 0x8b 0x8c 0x85 0x60 0xff 0xff 0xff 0x3 0x8d 0x5c 0xff 0xff 0xff 0x8b 0x95 0x5c 0xff 0xff 0xff 0x89 0x8c 0x95 0x60 0xff 0xff 0xff 0xe9 0xac 0x0 0x0 0x0 0x8b 0x85 0x5c 0xff 0xff 0xff 0x25 0x3 0x0 0x0 0x80 0x79 0x5 0x48 0x83 0xc8 0xfc 0x40 0x83 0xf8 0x1 0x75 0x22 0x8b 0x8d 0x5c 0xff 0xff 0xff 0x8b 0x94 0x8d 0x60 0xff 0xff 0xff 0x2b 0x95 0x5c 0xff 0xff 0xff 0x8b 0x85 0x5c 0xff 0xff 0xff 0x89 0x94 0x85 0x60 0xff 0xff 0xff 0xeb 0x73 0x8b 0x8d 0x5c 0xff 0xff 0xff 0x81 0xe1 0x3 0x0 0x0 0x80 0x79 0x5 0x49 0x83 0xc9 0xfc 0x41 0x83 0xf9 0x2 0x75 0x23 0x8b 0x95 0x5c 0xff 0xff 0xff 0x8b 0x84 0x95 0x60 0xff 0xff 0xff 0xf 0xaf 0x85 0x5c 0xff 0xff 0xff 0x8b 0x8d 0x5c 0xff 0xff 0xff 0x89 0x84 0x8d 0x60 0xff 0xff 0xff 0xeb 0x38 0x8b 0x95 0x5c 0xff 0xff 0xff 0x81 0xe2 0x3 0x0 0x0 0x80 0x79 0x5 0x4a 0x83 0xca 0xfc 0x42 0x83 0xfa 0x3 0x75 0x20 0x8b 0x85 0x5c 0xff 0xff 0xff 0x8b 0x8c 0x85 0x60 0xff 0xff 0xff 0x33 0x8d 0x5c 0xff 0xff 0xff 0x8b 0x95 0x5c 0xff 0xff 0xff 0x89 0x8c 0x95 0x60 0xff 0xff 0xff 0xe9 0xf7 0xfe 0xff 0xff 0x33 0xc0 0x8b 0x4d 0xfc 0x33 0xcd 0xe8 0x4 0x0 0x0 0x0 0x8b 0xe5 0x5d 0xc3
enc = [88,88,134,87,74,118,318,101,59,92,480,60,65,41,770,110,73,31,918,39,120,27,1188,47,77,24,1352,44,81,23,1680,46,85,15,1870,66,91,16,4750]
概览#
- 🌟看出来第一段是汇编指令
- 扔进exe
- 扔进ida64 - 按c拿代码
- 静态分析
- 写解密代码
怎么看出来#
问gpt(逃~
0x55
比较常见,代表 push rbp0x8b 0xec
是 mov ebp,esp,建立当前栈帧0x81 0xec 0xa8 0x00 0x00 0x00
是 sub esp, 0A8h
所以确定就是汇编指令
扔进exe#
with open("a.exe", 'wb') with file:
file.write(bytes(bs))
扔进ida64#
会提示选择模式
这里都试一次
进去在函数头按 c 即可将二进制转换成汇编指令
最后试出来是 x64 能还原出所有代码,开始分析
静态分析#
是个循环#
要素1:自加1
seg000:000000000000003F loc_3F:
seg000:000000000000003F mov ecx, [rbp-0A4h]
seg000:0000000000000045 add ecx, 1
seg000:0000000000000048 mov [rbp-0A4h], ecx
要素2:判断局部变量 [rbp-0A4h]
是否小于 0x27,即 enc
的长度
seg000:000000000000004E loc_4E:
seg000:000000000000004E cmp dword ptr [rbp-0A4h], 27h
seg000:0000000000000055 jge loc_148
要素3:一大堆程序之后又返回开头
seg000:0000000000000143 loc_143:
seg000:0000000000000143 jmp loc_3F ; 相当于 continue
有个switch#
有四段非常相似的代码,只是判断的条件不同
要素:类似的代码,不同的判断条件,判断失败就进行下一次判断
mov edx, [rbp-0A4h]
中间一些运算然后test edx, edx
mov eax, [rbp-0A4h]
--...=>cmp eax, 1
mov ecx, [rbp-0A4h]
--...=>cmp r9d, 2
mov edx, [rbp-0A4h]
--...=>edx, 3
这里的中间运算看不太懂,是这样的:
seg000:000000000000005B mov edx, [rbp-0A4h]
seg000:0000000000000061 and edx, 80000003h
seg000:0000000000000067 jns short near ptr loc_6D+1
seg000:0000000000000069 or rdx, 0FFFFFFFFFFFFFFFCh
seg000:000000000000006D
seg000:000000000000006D loc_6D:
seg000:000000000000006D test edx, edx ; 这里判断是否为0
但是既然有 0,1,2,3
的判断,猜测是取模运算
破案了,又是msvc的优化,扔文章末尾了
代码#
enc = [88,88,134,87,74,118,318,101,59,92,480,60,65,41,770,110,73,31,918,39,120,27,1188,47,77,24,1352,44,81,23,1680,46,85,15,1870,66,91,16,4750]
dec = []
for i in range(len(enc)):
match i % 4:
case 0:
dec.append(enc[i] - i)
case 1:
dec.append(enc[i] + i)
case 2:
dec.append(enc[i] / i)
case 3:
dec.append(enc[i] ^ i)
r = ''
for i in range(len(dec)):
r += chr(int(dec[i]))
print(r)