re刷题续

[SUCTF2019]SignIn

查壳,拖入ida,根据其特征发现其为RSA加密算法
__gmpz_init_set_str都属于GNU 高精度算法库

int mpz_init_set_str (mpz_t rop, const char *str, int base)
这三个参数分别是多精度整数变量,字符串,进制。
这个函数的作用就是将str字符数组以base指定的进制解读成数值并写入 rop所指向的内存。

import gmpy2
import binascii
 
p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n = 103461035900816914121390101299049044413950405173712170434161686539878160984549
e = 65537
d = gmpy2.invert(e,(p-1)*(q-1))
m = gmpy2.powmod(c,d,n)
print(binascii.unhexlify(hex(m)[2:]).decode(encoding="utf-8"))

[MRCTF2020]Transform

查壳,拖入64位IDA
LOBYTE8位就是一个字节,在此处无意义,因为我们输入的本来就是按字节输入的
tap1

设 a = byte_414040,b=dword_40F040,c=byte_40F0E0,输入的字符串为flag;

从题目里得到 加密代码

a[i] = flag[b[i]];
a[i] ^= b[i];
c == a
即c[i] = a[i] ^ b[i]
解密就反过来 ,因为a是不知道的,所以就先解除a
a = a ^ b 即 a = c ^ b
然后 flag[b[i]] = a[i]

b = [0x9, 0x0A, 0x0F, 0x17, 0x7, 0x18, 0x0C, 0x6, 0x1, 0x10, 0x3, 0x11, 0x20, 0x1D, 0x0B, 0x1E, 0x1B, 0x16, 0x4, 0x0D, 0x13, 0x14, 0x15, 0x2, 0x19, 0x5, 0x1F, 0x8, 0x12, 0x1A, 0x1C, 0x0E, 0]
a = [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(b)):
    a[i] ^= b[i]

for i in range(len(b)):
    flag[b[i]] = a[i]
print (''.join([chr(x) for x in flag]))

[ACTF新生赛2020]usualCrypt

拖入IDA32位,跟进main函数

tap1
判断与否的字符串如下

tap2

跟进加密函数很显然是一个base64的加密函数,不过其中有了些许的变化,函数开始与结束都做了部分操作

tap3
tap4

操作如下,sub_401000函数是将byte_40E0AA的低6~14位与byte_40E0A0的6~14位进行互换,总共换9位;(其中的6~14均要向后移一位,因为数组下标位0)
sub_402030函数是对字符进行大小写的互换;

tap5
tap6
tap7

经过换表后的base64表为

ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/

待解flag为

ZmxhZ3tiGNXlXjHfaDTzN2FfK3LycRTpc2L9

base在线解密,利用在线解密进行解密即可
大佬写下的脚本参考链接

[HDCTF2019]Maze

  1. 下载文件查壳,upx壳,脱壳如下
    脱壳

  2. IDA32位,发现错误,分析

    jnz跳转,跳转了个寂寞,就是跳转到下一行的指令上去了
    下面还有一个错误的call指令,也要进行修改
    tap1

  3. 修改call指令,选中0040102E,首先按D,形成数据,接着按C形成代码,其中E8为call的硬编码,直接nop掉
    形成数据
    形成代码

    • Edit/Patch program/Change byte将要修改的byte改成90,修改完后Edit/Patch program/Apply patches to input file保存修改后的文件
    • Edit/Patch program/Assemble直接输入nop,然后同样要保存
  4. 重要的是保存后重启,重启后直接F5,就能出现伪代码
    伪代码
    6. 分析代码,最初为如下(7,0),变成了(5,-4),提取maze地图
    初始位置

    地图
        并没有特殊的其它函数,就是输入的字符串长度为14,从(7,0)走到(5,-4),只要符合这个条件即可得到flag
        当然跟着题目走会比较的简单,画出地图,找到对应坐标,跟着走,就是14个字符ssaaasaassdddw,得到flag
    maze

flag

[MRCTF2020]Xor

  1. 查壳后拖入IDA,反汇编出现以下情况,跟进401095地址
    tap1
  2. 401095地址处汇编进行反汇编,在返回原main函数反汇编,得到反汇编代码
    tap2
  3. 根据提示就是亦或可得flag
    tap3
    byte_41EA08 = 'MSAWB~FXZ:J:`tQJ"N@ bpdd}8g'
    
    flag = ''
    for i in range(len(byte_41EA08)):
        flag += chr(i ^ ord(byte_41EA08[i]))
    print(flag)	# flag{@_R3@1ly_E2_R3verse!}
    
    直接汇编分析传送阵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值