Logo WP

SomeNSS

1. Base64自定义表#

简单学习下Base64

文件{:download="simple_RE.exe"}

v11 += 4;
v13 = input[v12];
*(v11 - 4) = aQvejafhmuyjbac[v13 >> 2];
v14 = input[v12 + 1];
*(v11 - 3) = aQvejafhmuyjbac[(v14 >> 4) | (16 * v13) & 0x30];
v15 = input[v12 + 2];
v12 += 3i64;
*(v11 - 2) = aQvejafhmuyjbac[(v15 >> 6) | (4 * v14) & 0x3C];
*(v11 - 1) = aQvejafhmuyjbac[v15 & 0x3F];

这里就是base64加密,其中 aQvejafhmuyjbac 是自定义的加密表

乘法其实就是位操作

v11 += 4;
v13 = input[v12];
*(v11 - 4) = aQvejafhmuyjbac[v13 >> 2];
v14 = input[v12 + 1];
*(v11 - 3) = aQvejafhmuyjbac[(v14 >> 4) | (v13 << 4) & 0b00110000];
v15 = input[v12 + 2];
v12 += 3i64;
*(v11 - 2) = aQvejafhmuyjbac[(v15 >> 6) | (v14 << 2) & 0b00111100];
*(v11 - 1) = aQvejafhmuyjbac[v15 & 0x3F];

代码#

import base64

enc = '5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8=='
table = 'qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD'
real_table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
print(len(table))
print(len(real_table))

result = ''
for c in enc:
    if c == '=':
        result += '='
    else:
        result += real_table[table.index(c)]

print(base64.b64decode(result))
# 这里换成
# print(base64.b64decode(enc.translate(str.maketrans(table, real_table))))
# 也可以

2. 模的逆运算#

flag = 'xxxxxxxxxxxxxxxxxxxxx'
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = ''
for i in range(len(flag)):
    s1 = ord(flag[i])//17 # 最大的ascii码 // 17 = 7,s1的范围是0-7
    s2 = ord(flag[i])%17 # s2 的范围0 - 16
    result += s[(s1+i)%34]+s[-(s2+i+1)%34] # 字符拼接
print(result)
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'

#题目为以上部分

enc_flag = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
result = ''
for i in range(0, len(enc_flag), 2):
    i_origin = i // 2
    s1 = (s.index(enc_flag[i]) - i_origin) % 34
    s2 = (-(s.index(enc_flag[i + 1]) - 34) - i_origin - 1) % 34
    result += chr(s1 * 17 + s2)

print(result)

3. Wordy#

使用ida看不出什么东西,动态调试一下

文件{:download="wordy"}

ida目录/dbgsrv/linux_server64 扔进wsl,然后运行

  • ida里选择Debugger-Remote Linux Debugger,
  • Debugger-Process Options,填上ip:port
  • Debugger-Start Process即可

调试发现,jmp命令非常奇怪,导致无法一次性反汇编,只能边调试边反汇编

这属于花指令的一种

但这题比较简单,一直在 putchar,所以一边搜索 0xBF,一边按C反汇编

在程序较末尾的地方就可以找到flag

看了下其他师傅的wp

运行idapython脚本,即可一次性去除掉花指令

start = 0x55BE0E39D136
end = 0x55BE0E39F100
for i in range(start, end):
    if get_wide_byte(i) == 0xEB and get_wide_byte(i + 1) == 0xFF:
        patch_byte(i, 0x90) # nop