BUUCTF REVERSE

re

下载附件,拖入XEXE,发现有壳
在这里插入图片描述
用kali脱壳后拖入64位IDA,找到关键函数
在这里插入图片描述
跟进sub_4009AE
脚本:

flag=''
flag+=chr(166163712//1629056)
flag+= chr(731332800 // 6771600)
flag += chr(357245568 // 3682944)
flag += chr(1074393000 // 10431000)
flag += chr(489211344 // 3977328)
flag += chr(518971936 // 5138336)
flag+='?'
flag += chr(406741500 // 7532250)
flag += chr(294236496 // 5551632)
flag += chr(177305856 // 3409728)
flag += chr(650683500 // 13013670)
flag += chr(298351053 // 6088797)
flag += chr(386348487 // 7884663)
flag+= chr(438258597 // 8944053)
flag+= chr(249527520 // 5198490)
flag+= chr(445362764 // 4544518)
flag+= chr(981182160 // 10115280)
flag+= chr(174988800 // 3645600)
flag+= chr(493042704 // 9667504)
flag += chr(257493600 // 5364450)
flag+= chr(767478780 // 13464540)
flag+= chr(312840624 // 5488432)
flag += chr(1404511500 // 14479500)
flag+= chr(316139670 // 6451830)
flag+= chr(619005024 // 6252576)
flag+= chr(372641472 // 7763364)
flag+= chr(373693320 // 7327320)
flag+= chr(498266640 // 8741520)
flag+= chr(452465676 // 8871876)
flag+= chr(208422720 // 4086720)
flag+= chr(515592000 // 9374400)
flag+= chr(719890500 // 5759124)
print(flag)
 
#flag{e?65421110ba03099a1c039337}

差一位,穷举得出
别人用z3处理器的脚本

from z3 import *
s = Solver()
a1 = [0]*32
for i in range(32):
    a1[i] = Int('a1['+str(i)+']')

s.add( 1629056 * a1[0] == 166163712 )
s.add( 6771600 * a1[1] == 731332800 )
s.add( 3682944 * a1[2] == 357245568 )
s.add( 10431000 * a1[3] == 1074393000 )
s.add( 3977328 * a1[4] == 489211344 )
s.add( 5138336 * a1[5] == 518971936 )
s.add( 7532250 * a1[7] == 406741500 )
s.add( 5551632 * a1[8] == 294236496 )
s.add( 3409728 * a1[9] == 177305856 )
s.add( 13013670 * a1[10] == 650683500 )
s.add( 6088797 * a1[11] == 298351053 )
s.add( 7884663 * a1[12] == 386348487 )
s.add( 8944053 * a1[13] == 438258597 )
s.add( 5198490 * a1[14] == 249527520 )
s.add( 4544518 * a1[15] == 445362764 )
s.add( 3645600 * a1[17] == 174988800 )
s.add( 10115280 * a1[16] == 981182160 )
s.add( 9667504 * a1[18] == 493042704 )
s.add( 5364450 * a1[19] == 257493600 )
s.add( 13464540 * a1[20] == 767478780 )
s.add( 5488432 * a1[21] == 312840624 )
s.add( 14479500 * a1[22] == 1404511500 )
s.add( 6451830 * a1[23] == 316139670 )
s.add( 6252576 * a1[24] == 619005024 )
s.add( 7763364 * a1[25] == 372641472 )
s.add( 7327320 * a1[26] == 373693320 )
s.add( 8741520 * a1[27] == 498266640 )
s.add( 8871876 * a1[28] == 452465676 )
s.add( 4086720 * a1[29] == 208422720 )
s.add( 9374400 * a1[30] == 515592000 )
s.add(5759124 * a1[31] == 719890500)
s.check()
print(s.model())

Transform

拖入64位IDA,F5反编译
在这里插入图片描述
跟进dword_40F040,快捷字符转换
在这里插入图片描述
脚本:

a1 = [9,10,15,23,7,24,12,6,1,16,3,17,32,29,11,30,27,22,4,13,19,20,21,2,25,5,31,8,18,26,28,14,0]
a2 = [0x67,0x79,0x7B,0x7F,0x75,0x2B,0x3C,0x52,0x53,0x79,0x57,0x5E,0x5D,0x42,0x7B,0x2D,0x2A,0x66,0x42,0x7E,0x4C,0x57,0x79,0x41,0x6B,0x7E,0x65,0x3C,0x5C,0x45,0x6F,0x62,0x4D]
flag = [0]*33
for i in range(len(a2)):
    a2[i]^=a1[i]
    flag[a1[i]]=a2[i]
for j in range(len(flag)):
    flag[j]=chr(flag[j])
Mc="".join(flag)
print(Mc)

运行得到flag

level2

简单脱壳题

SignIn

拖入64位IDA,F5反编译,找到main函数
程序调用了 __gmpz_init_set_str 函数,通过搜索得知这是一个 GNU 高精度算法库
有三段字符串,查找知道其中65537在RSA其中常见
在这里插入图片描述
c=ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n=103461035900816914121390101299049044413950405173712170434161686539878160984549
e=65537
分解n,得到
p=366669102002966856876605669837014229419
q=282164587459512124844245113950593348271
RSA解密脚本:

import gmpy2
import binascii

p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n = 103461035900816914121390101299049044413950405173712170434161686539878160984549
e = 65537
phi_n = (p - 1) * (q - 1)
d = gmpy2.invert(gmpy2.mpz(e), phi_n)
flag = gmpy2.powmod(c, d, n)
print(binascii.unhexlify(hex(flag)[2:]))

运行得到flag

usualCrypt

拖入32位IDA,反编译
sub_401080是加密函数,跟进看看
主体代码是base64加密,但在加密前执行了sub_401000()
在这里插入图片描述
byte_40E0AA,byte_40E0A0,快捷键R转换字符型,调用table
在这里插入图片描述
加密后,该函数又调用了sub_401030
这个子函数把字符串每个英文字符进行了大小写转换,最后形成数据段保存的密码byte_40E0E4在这里插入图片描述
这个子函数把字符串每个英文字符进行了大小写转换,最后形成数据段保存的密码byte_40E0E4
脚本:

import base64

flag = ''; dict = {}; offset = 10
orgin = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for i in range(len(orgin)):
    dict[orgin[i]] = orgin[i]
for i in range(6, 15): #sub_401000()
    dict[orgin[i]] , dict[orgin[i+offset]] = dict[orgin[i+offset]] , dict[orgin[i]] # 恢复base64密钥表
secret = 'zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'.swapcase() #sub_401030()
for i in range(len(secret)):
    flag += dict[secret[i]] 
flag = base64.b64decode(flag)
print(flag)

Maze

这道题考察的就是花指令和封装函数
首先附件下载后拖入exe查壳,有壳,用kali脱壳拖入32位IDA,发现不能F5反编译
看汇编,jnz跳转到下一条指令,相当于没跳转,nop掉。下面call了一个错误地址,按d转为数据,nop掉第一个字节(改成90)。
此时仍然无法反编译
选中所有核心代码,p键封装函数,F5反汇编看到迷宫判断条件
在这里插入图片描述

*******+**
*******s**
****aaas**
**aas*****
**s**F****
**sddd****
**********