【ZJNU】reverse集训

位运算

异或运算(^):同0异1

按位或运算(|)

0|0=0、0|1=1、1|0=1、1|1=1

与运算(&)只有两个都为1结果才为1

左移运算(<<):x2

取反运算(~)

右移运算(>>):除2

汇编基础

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1:【BUUCTF】level2

使用upx脱壳

在这里插入图片描述

打开即可发现flag:

在这里插入图片描述

flag{Just_upx_-d}

如果无法没有见到flag,也可以先找到main,然后按F5

在这里插入图片描述

在这里插入图片描述

这里没有直接给出,我们点what进去看看

在这里插入图片描述

看到main,继续点进去

即可找到

在这里插入图片描述

2:xor1

打开发现是一堆乱码

在这里插入图片描述

看来有壳,使用upx

在这里插入图片描述

点进main函数按F5

在这里插入图片描述

告诉我们先输入一个数,再进行异或,点进xor:

在这里插入图片描述

表示与0X72进行异或

点击0x72右键可进行更改进制

在这里插入图片描述

qmemcpy(a, &unk_404020, sizeof(a));表示将&unk_404020复制到a中

我们点进unk_404020看看

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

114是十六进制

脚本

a=[0x00000014,0x0000001E,0x00000013,0x00000015,0x00000009,0x00000017,0x00000013,0x00000001,0x00000000,0x0000002D,0x0000000A,0x0000001D,0x00000000,0x0000002D,0x00000043,0x00000046,0x00000047,0x00000043,0x00000046,0x0000000F]
flag=""
for i in a:
    flag+=chr(i^114)
print(flag)

如果没有convert也可以,按shift+e提取数据:

在这里插入图片描述

写出脚本

a=[0x14, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x13, 0x00, 
  0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 
  0x17, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 
  0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 
  0x0A, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 
  0x43, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x47, 0x00, 
  0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 
  0x0F]

b=0
chs=[]
flag=' '
for ch in a:
    if ch==0x00:
        continue
    else:
        b+=1
        chs.append(ch)
print(chs)
for i in chs:
    flag=flag+chr(i^114)
print(flag)

输出:[20, 30, 19, 21, 9, 23, 19, 1, 11, 45, 10, 29, 45, 67, 67, 70, 71, 67, 70, 15]
flag{easy_xo_114514}

动态调试

在这里插入图片描述

在这里插入图片描述

3:【BUUCTF】level1

打开有两个文件:level1和output

在mian函数处按F5:

在这里插入图片描述

i表示下标,与上1为0,只有偶数才&1恒为0,所以偶数需要进行乘法运算,奇数需要左移,但是我们看到的是output

在这里插入图片描述

所以奇数下标需要右移,偶数下标需要除法运算

但是因为原来的函数是从1开始遍历的,所以原来的第一个字符变成了输出的第0个字符

所以应该为偶数下标需要右移,奇数下标需要除法运算

a=[198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000]
flag=' '
count=0
for i in a:
    if(count&1==0):
        flag=flag+chr(i>>(count+1))
        count+=1
    else:
        flag=flag+chr(i//(count+1))
        count+=1

print(flag)

输出: ctf2020{d9-dE6-20c}

【BUUCTF】IgniteMe

使用IDA打开:

在这里插入图片描述

点进去

在这里插入图片描述

就是将v1列表与v4进行异或,然后将异或后的值给v4

在这里插入图片描述

动态调试一下看v4的值

image-20220429160118249

在左边点一下或者按f2下断点,点击运行
在这里插入图片描述

在弹出的窗口随便输入数字:

在这里插入图片描述

找到v4的值为4:

在这里插入图片描述

点进v1的byte_403000看看

在这里插入图片描述

在这里插入图片描述

然后即可编写脚本;

a=[0x0D, 0x26, 0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C, 0x5D, 0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44, 0x6F, 0x6E, 0x56, 0x09, 0x5F, 0x45, 0x47, 0x73, 0x26, 0x0A, 0x0D, 0x13, 0x17, 0x48, 0x42, 0x01, 0x40, 0x4D, 0x0C, 0x02, 0x69]
flag=' '
l=len(a)
v4=4
for i in range(l-1,-1,-1):
    a[i]=a[i]^v4
    v4=a[i]
    a[i]=chr(a[i])
print("".join(a))

输出:R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com

常见算法

Base、RC4、TEA XTEA XXTEA、AES、MD5

python逆向

1:如果是exe文件,则使用pyinstxtractor

python pyinstxtractor.py xxx.exe

2:pyc文件

在线反编译工具

https://tool.lu/pyc/

4:【BUUCTF】pyre

打开发现是pyc文件,在线反编译得到

print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128
    code += num

for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]

print code
code = [
    '\x1f',
    '\x12',
    '\x1d',
    '(',
    '0',
    '4',
    '\x01',
    '\x06',
    '\x14',
    '4',
    ',',
    '\x1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '\x01',
    'D',
    ';',
    '%',
    '\x13']

异或:0异或1再异或1得到0,所以往回异或可以得到code列表。ord()函数主要用来返回对应字符的ascii码,chr()主要用来表示ascii码对应的字符的数字

num = ((input1[i] + i) % 128 + 128) % 128其实就相当于(input1[i] + i) % 128,同时使数字的值不要超过128而已

exp为:

code = [ '\x1f','\x12','\x1d','(','0','4','\x01','\x06','\x14', '4',',','\x1b', 'U', '?', 'o','6','*',':', '\x01',  'D',';','%','\x13']
l=len(code)
for i in range(l-2,-1,-1):
    code[i]=chr(ord(code[i+1])^ord(code[i]))
flag=' '
for i in range(l):
    flag=flag+chr((ord(code[i])-i-128)%128)
print(flag)

输出flag:

GWHT{Just_Re_1s_Ha66y!}

Pyexe逆向

5:【BUUCTF】Overlong

使用IDA打开:

在这里插入图片描述

表示有28个输入的数据,我们点击unk_402008中

在这里插入图片描述

发现数据肯定不止28个,所以我们需要增加数据容量

使用od打开exe文件,然后找到1c的位置,因为1C正好为28

在这里插入图片描述

修改1C为8C将更多的数据可以push进去

在这里插入图片描述

一直按f8进行运行直到右边出现:

在这里插入图片描述

所以flag是:flag{I_a_M_t_h_e_e_n_C_o_D_i_n_g@flare-on.com}

安卓逆向

6:【BUUCTF】简单注册器

打开来看是一个apk文件,我们使用jadx-gui打开:

在这里插入图片描述

打开idea,直接使用把有flag的那段字母拖进去即可

public class login {
    public static void main(String[] args) {
        char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray();
        x[2] = (char) ((x[2] + x[3]) - 50);
        x[4] = (char) ((x[2] + x[5]) - 48);
        x[30] = (char) ((x[31] + x[9]) - 48);
        x[14] = (char) ((x[27] + x[28]) - 97);
        for (int i = 0; i < 16; i++) {
            char a = x[31 - i];
            x[31 - i] = x[i];
            x[i] = a;
        }
        System.out.println(String.valueOf(x));
    }
}

输出:59acc538825054c7de4b26440c0999dd

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值