文章目录
位运算
异或运算(^):同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的值
在左边点一下或者按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