题目来源
1.拿到题目后发现这一行始终看不懂
2.点进去看后发现根本不是一个函数
根据题目名称,查资料才得知这是一个SMC自修改,这些数字都是被加密后的,要想还原出这个函数,必须知道加密byte_403040的逻辑
3.打开sub_401042,查看逻辑
得知是byte_403040的前38位与byte_403068的前四位依次异或,点进去能得到二者的数值,提取出来
4.打开ida脚本编辑,输入python自解密脚本:
import idc
def xor_setp1():
addr = 0x00403040 # 这里填入要解密字节串的起始地址
B = [0x11, 0x22, 0x33, 0x44]
for i in range(38): # 循环结束的条件为字节串的结束地址
curr_byte = idc.get_wide_byte(addr + i)
curr_byte ^= B[i & 3]
idc.patch_byte(addr + i, curr_byte) # 异或的数字根据情况修改
def main():
xor_setp1()
main()
5.修改之后的byte_403040如下:
6.在起始位置按住C再右键create function
7.还原得到原本的函数,非常简单,提取出403020,减去5再异或0x11
8.代码编写
A = [0x7C, 0x82, 0x75, 0x7B,0x6F, 0x47, 0x61, 0x57,
0x53, 0x25, 0x47, 0x53,0x25, 0x84, 0x6A, 0x27,
0x68, 0x27, 0x67, 0x6A,0x7D, 0x84, 0x7B, 0x35,
0x35, 0x48, 0x25, 0x7B,0x7E, 0x6A, 0x33, 0x71]
flag = ''
for i in range(len(A)):
flag+=chr((A[i]-5)^0x11)
print(flag)
flag:flag{SMC_1S_1nt3r3sting!!R1ght?}