[ACTF新生赛2020]easyre
upx,脱
第43行就可以知道我们输入的字符串就是flag
第48行for语句可以知道flag{}括号里的字符串长度为12
第50行v4=byte_402000[数组内的值-1]
v4=[42,70,39,34,78,44,34,40,73,63,43,64]
看byte_402000:
写脚本
v4 = [42,70,39,34,78,44,34,40,73,63,43,64]
string = chr(0x7E)+"}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(" + chr(0x27) + '&%$# !"'
A=""
for i in v4:
for k in range(1,len(string)):
if i == ord(string[k]):
A+=chr(k+1)
print ("flag{"+A+"}")
[SUCTF2019]SignIn
程序调用了 __gmpz_init_set_str 函数,搜索后知道这其实是一个 GNU 高精度算法库(GNU Multiple Precision Arithmetic Library)。
很显然这个函数的作用就是将 str 字符数组以 base 指定的进制解读成数值并写入 rop 所指向的内存。该程序通过调用这个函数来实现数据的初始化赋值。
之后调用的一个函数 __gmpz_powm 在文档中的定义是这样的:
void mpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod) [Function]
Set rop to base^exp mod mod.
该函数将计算 base 的 exp 次方,并对 mod 取模,最后将结果写入 rop 中。
这种计算与RSA中的加密过程如出一辙。
代码中的敏感字符串,显然就是RSA
C=ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
N=103461035900816914121390101299049044413950405173712170434161686539878160984549
E=65537
在线网站分解N得到p,q
在线网站
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{Pwn_@_hundred_years}
相册
apk文件,用jadx-gui打开
搜索mail
查看调用sendMailByJavaMail的位置
MAILSERVER就是我们要的邮箱,右键跳到声明
进入NativeMethod,发现里面都是空的
MAILSERVER就是加载外部so文件中NativeMethod.m1m()函数所返回的值,再进行base64解密。因此我们只需要找到so文件中经过base64加密的字符串。
将文件解压找到libcore.so用ida打开
发现base64字符串
解密
flag{18218465125@163.com}