reverse打题记录(补档1)

1:[MRCTF2020]Transform

无壳,ida

分析函数,flag长度明显33,sub_40E640明显没什么用,毕竟flag长度错了才进入第一个if,直接去看for循环

熟悉的^,一眼异或没得跑,去看那两个数组里储存的字符

数据找到了,脚本爆破

dword = [ 9, 0xA, 0xF, 0x17, 7, 0x18, 0xC, 6, 1, 0x10, 3, 0x11, 0x20, 0x1D, 0xB, 0x1E, 0x1B, 0x16, 4, 0xD, 0x13, 0x14, 0x15, 2, 0x19, 5, 0x1F, 8, 0x12, 0x1A, 0x1C, 0xE, 0 ]
byte = [ 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 ]
ans = [0]*33

for i in range(0,33):
    ans[i] = dword[i] ^ byte[i]
    print(chr(ans[i]),end="")

运行得到flag,吗?:nsthr30TRiTO}_p31pFs_ClCr{z4N_slM

完蛋,前面还有加密过程,回头去看函数

看了一下,合理猜测byte_414040[i]=Str[dword_40F040[i]]就是加密过程,但是没见过这种东西,查

大概意思就是把字符串数组里的值变成Str这个字符串数组的序号,然后再把字符储存进去,重新编写脚本

dword = [ 9, 0xA, 0xF, 0x17, 7, 0x18, 0xC, 6, 1, 0x10, 3, 0x11, 0x20, 0x1D, 0xB, 0x1E, 0x1B, 0x16, 4, 0xD, 0x13, 0x14, 0x15, 2, 0x19, 5, 0x1F, 8, 0x12, 0x1A, 0x1C, 0xE, 0 ]
byte = [ 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 ]
ans = [0]*33    # 需要个中间变量,等下需要用到
flag = [0]*33   # 这里的flag就是题目的v6

for i in range(0,33):           # 异或的解密过程
    ans[i] = dword[i] ^ byte[i]

for i in range(0,33):           # 还原v6的顺序
    flag[dword[i]] = ans[i]

for i in range(0,33):           # 打印flag
    print(chr(flag[i]),end="")

即flag:MRCTF{Tr4nsp0sltiON_Clph3r_1s_3z}

2:[WUSTCTF2020]level2

查壳,UPX,x64

打开就是这样,算了,不手动了,kali

Ida打开

进去就是flag:wctf2020{Just_upx_-d}

3:[SUCTF2019]SignIn

查壳,无壳,ida

分析代码,发现flag的长度是99,最后是v6和v7比较,看中间,调用了一个没见过的函数__gmpz_init_set_str,去搜一下

不是很看得懂,大概意思就是这是一个精度高的运算函数,同时这个函数的运行判定也很严苛

继续往下看,发现65537这个数字,前两台刚写一题RSA,马上应激反应是RSA,同时最后是v6和v7比较,则易得v7就是密文,那么v4就是n,65537就是e,线上直接分解n

所以可得p:282164587459512124844245113950593348271

Q:366669102002966856876605669837014229419

上脚本跑

import gmpy2
import binascii

p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
e = 65537
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n = p * q
d = gmpy2.invert(e, (p-1) * (q-1))
m = gmpy2.powmod(c, d, n)

print(binascii.unhexlify(hex(m)[2:]).decode(encoding="utf-8"))

得到flag:suctf{Pwn_@_hundred_years}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值