Logo WP

何须像死猪余年

何须相思煮余年#

为什么没有代码呀?

出题人:@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]

概览#

  1. 🌟看出来第一段是汇编指令
  2. 扔进exe
  3. 扔进ida64 - 按c拿代码
  4. 静态分析
  5. 写解密代码

怎么看出来#

问gpt(逃~

  • 0x55 比较常见,代表 push rbp
  • 0x8b 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#

会提示选择模式

Article Image

这里都试一次

进去在函数头按 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#

有四段非常相似的代码,只是判断的条件不同

要素:类似的代码,不同的判断条件,判断失败就进行下一次判断

  1. mov edx, [rbp-0A4h] 中间一些运算然后 test edx, edx
  2. mov eax, [rbp-0A4h]--...=> cmp eax, 1
  3. mov ecx, [rbp-0A4h]--...=> cmp r9d, 2
  4. 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)