antctf记录一

Re-white give

1.查壳为无壳,并且为x64的exe程序。

2.ida分析

运行程序,输出2行字符串。但是在ida中没有找到相应的字符串,猜测应该是把字符串加密了。

3.动态调试

antctf记录一

 

 得到这样的基本流程。

antctf记录一

 

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

antctf记录一

 

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

antctf记录一

 

 再创建一张在后面用来置换的置换表。

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

antctf记录一

 

 到这里输入的数据就完成了加密。

然后和指定的数据进行比较,一样则显示成功。

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下来。

上一篇:Liunx之Lamp搭建笔记


下一篇:吴裕雄--天生自然Numpy库学习笔记:NumPy 字节交换