數學不及格
strtol 函數
long strtol(char str, char **endptr, int base);
將字符串轉換為長整型
就是解這個方程組了
主要就是 v4, v9的關系,
3v9-(v10+v11+v12)=62d10d4673
v4 + v12 + v11 + v10 = 0x13A31412F8C
得到 3*v9+v4=19D024E75FF(1773860189695)
重點,斐波那契后面相差很大
又因為v4只在1至200的范圍內,數字很小因此可以忽略不記求出v9的近似值
? v9=1773860189695/3(591286729898)
然后找個在線網站查看一下斐波那契數列找到v9的近似值
可以看到數列的第58位與v9十分相似,因此可以得出v9為591286729879,v4為58,
得到四個參數,然后轉字符串
output = "666c61677b6e65776265655f686572657d"
flag = [''] * (len(output) // 2)
mapTable = "30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66".split(' ')
#print(mapTable)
mapTable = [chr(int(i, 16)) for i in mapTable]
#print(mapTable)
# ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
for i in range(0, len(output), 2):high4Bit = mapTable.index(output[i]) # 得到高 4 位#print(high4Bit)low4Bit = mapTable.index(output[i+1]) # 得到低 4 位curByte = high4Bit << 4 | low4Bit # 合成 char 型#print(curByte)flag[i//2] = chr(curByte)
print(''.join(flag))
#flag{newbee_here}
有時候不是完全代碼可以得到所有信息,逆向真的比較考驗腦洞啊!
flag白給
彈出兩個對話框
都沒有什么信息,說是用 dbg 試試搜索關鍵字錯誤
x32dbg 搜索字符串也不行
試試 OD 可以,有一個中文搜索插件,選擇 ASCII 搜索
往下慢慢找
直接動調吧
就是這兩個字符比較了,試試
主要考察的是對中文字符串的搜索,目前只知道有 OD ,之后有其他辦法再記一下,有師傅知道也可以說一下。
簽退
import string
c_charset = string.ascii_uppercase + string.ascii_lowercase + string.digits + '()'
flag = 'BozjB3vlZ3ThBn9bZ2jhOH93ZaH9'
#print(string.ascii_uppercase)def encode(origin_bytes):c_bytes = [('{:0>8}').format(str(bin(b)).replace('0b', '')) for b in origin_bytes]#print(c_bytes)resp = ''nums = len(c_bytes) // 3remain = len(c_bytes) % 3integral_part = c_bytes[0:3 * nums]while integral_part:tmp_unit = ('').join(integral_part[0:3])tmp_unit = [int(tmp_unit[x:x + 6], 2) for x in [0, 6, 12, 18]]resp += ('').join([c_charset[i] for i in tmp_unit])integral_part = integral_part[3:]if remain:remain_part = ('').join(c_bytes[3 * nums:]) + (3 - remain) * '0' * 8tmp_unit = [int(remain_part[x:x + 6], 2) for x in [0, 6, 12, 18]][:remain + 1]resp += ('').join([c_charset[i] for i in tmp_unit]) + (3 - remain) * '.'return rend(resp)def rend(s):def encodeCh(ch):f = lambda x: chr((ord(ch) - x + 2) % 26 + x)if ch.islower():return f(97)if ch.isupper():return f(65)return chreturn ('').join(encodeCh(c) for c in s)
看著挺嚇人的,其實就是一個 base64 + 凱撒加密,偏移量為2
直接改一點就行了
if __name__ == '__main__':enc=''for c in flag:enc+=encodeCh(c)print(base64.b64decode(enc))
#b'flag{c_t_f_s_h_0_w_!}'
還是要增強代碼閱讀能力
生成映射表:
c_charset = string.ascii_uppercase + string.ascii_lowercase + string.digits + ‘()’
c_bytes = [(‘{:0>8}’).format(str(bin(b)).replace(‘0b’, ‘’)) for b in origin_bytes]
#change each byte into eight BIN string in c_bytes
f = lambda x: chr((ord(ch) - x + 2) % 26 + x)
# 凱撒密碼
if ch.islower():
return f(97)
if ch.isupper():
return f(65)
return ch
還是對字節的操作,一些復合寫法需要學習,還有就是 lambda 寫匿名函數