1.查壳
64位elf文件,没有壳
2.用64位IDA打开
找到主函数,F5查看伪代码
有一个sub_96A
函数对输入的字符串做了处理,双击进去看一下内容
对于熟悉汇编代码的人,这里应该是可以看出来的
这里右移四位把高四位放到低四位返回的是一个字节的高四位的值,然后下一行,& 0xF
是把高四位清零了然后将低四位返回,其实就是把一个字符的ascii码值返回了。
这个函数的作用就是返回字符串对应的ASCII码值。
接着往下看,出现的是一堆不认识的函数,我们得去查他们的作用
__gmpz_init_set_str(x,a,b):以b进制保存a到x中
__gmpz_powm(v6, v6, v5, v4); v6的v5次方再%v4存储到v6中
__gmpz_cmp(v6, v7); 比较,v6 == v7 返回0
这里就可以看出这是一个rsa加密,v7是密文
N=103461035900816914121390101299049044413950405173712170434161686539878160984549
e=65537
而将n分解的话我们一个用一个网站
http://www.factordb.com/
然后上脚本
import gmpy2
import binascii
N=103461035900816914121390101299049044413950405173712170434161686539878160984549
p=282164587459512124844245113950593348271
q=366669102002966856876605669837014229419
v7=0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
e = 65537
d=gmpy2.invert(e,(p-1)*(q-1))
m=gmpy2.powmod(v7,d,N)
byte_202010=[0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66]
print(binascii.unhexlify(hex(m)[2:]).decode(encoding="utf-8"))
>>>suctf{Pwn_@_hundred_years}
flag{Pwn_@_hundred_years}