antctf记录一
Re-white give
1.查壳为无壳,并且为x64的exe程序。
2.ida分析
运行程序,输出2行字符串。但是在ida中没有找到相应的字符串,猜测应该是把字符串加密了。
3.动态调试

得到这样的基本流程。

此处为输入数据的sha256加密,不过在一开始的时候没有认出来是sha256,大写的菜。

然后生成一张伪随机数的数表。

再创建一张在后面用来置换的置换表。
后面的操作就是根据置换表把sha256的数据进行置换,再创建一张异或的数据表。

到这里输入的数据就完成了加密。
然后和指定的数据进行比较,一样则显示成功。
exp:
import hashlib
fp_byte_table=open('byte_table.bin',"rb")
byte_table=list(bytearray(fp_byte_table.read(0x100)))
fp_byte_table.close()
fp_check_table=open('check_table.bin',"rb")
check_table=list(bytearray(fp_check_table.read(0x200)))
fp_check_table.close()
fp_rand_table=open('rand_table.bin',"rb")
rand_table=list(bytearray(fp_rand_table.read(0x100)))
fp_rand_table.close()
file_name='rand_table_2.bin'
for i in range(8):
fp_r_table = open(file_name, "rb")
r_table=list(bytearray(fp_r_table.read(0x100)))
rand_table=rand_table+r_table
file_name_list=[ord(file_name[ii]) for ii in range(len(file_name))]
file_name_list[-5]=file_name_list[-5]+1
file_name_list=[chr(k) for k in file_name_list]
file_name=''.join(file_name_list)
#print(file_name)
fp_r_table.close()
file_name='rand_table_10.bin'
for i in range(7):
fp_r_table=open(file_name,"rb")
r_table = list(bytearray(fp_r_table.read(0x100)))
rand_table = rand_table + r_table
file_name_list=[ord(file_name[ii]) for ii in range(len(file_name))]
file_name_list[-5]=file_name_list[-5]+1
file_name_list=[chr(k) for k in file_name_list]
file_name=''.join(file_name_list)
#print(file_name)
fp_r_table.close()
for n in range(0xf,-1,-1):
for i in range(0x100):
check_table[i+0x100] = (check_table[i+0x100] - i)%0x100
check_table[i+0x100] ^= rand_table[i+0x100*n]
for i in range(0x100):
for j in range(0x100):
if check_table[i+0x100]==byte_table[j]:
check_table[i+0x100]=j
break
for n in range(0xf,-1,-1):
for i in range(0x100):
check_table[i] = (check_table[i] - i)%0x100
check_table[i] ^= rand_table[i+0x100*n]
for i in range(0x100):
for j in range(0x100):
if check_table[i]==byte_table[j]:
check_table[i]=j
break
alpha=list("abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
flag=""
for i in range(0x10):
sucess = False
print("round: {}".format(i))
for a in alpha:
for b in alpha:
for c in alpha:
for d in alpha:
sha256 = hashlib.sha256()
slice = a+b+c+d
sha256.update(slice.encode('ascii'))
sliceresult = sha256.digest()
if sliceresult[0:0x20] == bytes(check_table[i*0x20:i*0x20+0x20]):
flag += slice
print(flag)
sucess = True
break
if sucess:
break
if sucess:
break
if sucess:
break
print(flag)
程序中的所有表都可以通过x64dbg调试器dump下来。

浙公网安备 33010602011771号