前言
本文主要记录[ACTF新生赛2020]easyre、[SUCTF2019]SignIn的做题过程和相关思路
[ACTF新生赛2020]easyre
首先下载得到一个tar包,解压后得到easyre.exe,查壳,发现有UPX壳
使用OD手工脱壳,利用ESP堆栈平衡下硬件断点找到OEP,dump下来,并将脱壳后的文件用32位IDA打开,发现明显多了很多函数
进入到main函数,发现用到了一个byte_402000
数组
点击查看数组的元素注意别把7E漏了
而flag中元素的ASCII值减一就是v4中的元素在byte_402000
数组中的下标(所以在逆向的时候要进行加一),直接写脚本
v4 = "*F'\"N,\"(I?+@"
byte_402000 = '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'
x = ""
idx = []
for c in v4:
for i in range(len(byte_402000)):
if c == byte_402000[i]:
idx.append(i) # 先找到对应元素的下标
for n in idx:
x += chr(n + 1)
print(x) # U9X_1S_W6@T?
[SUCTF2019]SignIn
首先查壳,无壳,且为64位ELF文件
用对应IDA打开,查找字符串,发现有一句'TTTTTTTTTTql!'
,查看引用,进入主函数
发现在主函数中还调用了一个子函数sub_96A
,作用是将字符串转为对应的十六进制字符串
接着看看main函数中用到的三个函数
__gmpz_init_set_str
__gmpz_powm
__gmpz_cmp
其实可以理解为是RSA
算法
把v7理解为密文,v6为明文,v5为公钥,v4为模,套上加密公式,即
v7 = (v6 ^ v5) mod v4
现在已知密文,求明文,利用解密公式,即
v6 = (v7 ^ x) mod v4
x就是目标,其实也就是私钥,私钥与选取的两个质数p、q有关,而p*q=v4
,问题的关键是能否从v4中分离出p、q,这里使用yafu
工具进行质数分解
得到p、q后,先计算出公私钥供共有的部分N=p*q
,接着根据欧拉公式计算出T=(p-1)*(q-1)
,同时又拥有公钥E
,即通过模逆运算可以计算出私钥D
,使用gmpy2
来进行模逆运算
import gmpy2
p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
E = 65537
N = p * q
T = (p - 1) * (q - 1)
D = int(gmpy2.invert(E, T))
m = gmpy2.powmod(c, D, N)
hex_m = str(hex(m)[2:]) # 去掉'0x'
byte_value = bytes.fromhex(hex_m)
flag = byte_value.decode('utf-8')
print(flag) # suctf{Pwn_@_hundred_years}