REVERSE-PRACTICE-BUUCTF-7
- Youngter-drive
- [ACTF新生赛2020]rome
- [FlareOn4]login
- [SUCTF2019]SignIn
Youngter-drive
exe程序,运行后提示输入flag,有upx壳,脱壳后ida分析
main函数中获取输入并拷贝,开启了两个线程分别运行StartAddress和sub_41119F两个函数,sub_411190函数验证输入,输入即为flag
分析StartAddress函数,input_index的初始值为29,当input_index的值大于-1时,调用sub_41112C函数,然后input_index值减1,休眠100ms
分析sub_41112C函数(反编译该函数需要先平衡栈),首先验证输入均为英文字母,然后对大小写区分,输入的内容的ascii码减去38或96的结果,作为下标,在table数组里取值,再赋给原来的位置,即对flag内容进行变换,实际上是大小写转换
回到main函数,再分析sub_41119F函数
该函数先休眠100ms,再对input_index减1,没有对flag内容的变换
于是可以知道,input_index初始值为29,在第一个线程作为下标对flag内容变换后减1,在第二个线程直接减1,相当于减2,值为27,再回到第一个线程……于是第一个线程仅在input_index为奇数时对flag内容进行变换
写逆脚本,由于input_index初始值为29,说明flag的内容长度为30,但是在check(sub_411190)函数中,只比较了29个字符,试出来最后一位是“E”提交成功
[ACTF新生赛2020]rome
exe程序,运行后提示输入,输入错误直接退出,无壳,ida分析
主逻辑在func函数中
第一个红框是对flag的内容变换,分大小写,原来是大写字母的变换后仍然是大写字母,原来是小写字母的变换后仍然是小写字母,如果flag的内容中某个字符为其他字符,则不进行变换
第二个红框是循环比较,验证flag的内容
写脚本即可得到flag
[FlareOn4]login
html文件,打开后提示输入flag并点击验证,右键->查看网页源代码
逻辑清晰,获取输入,输入变换,验证输入
重要的是flag.replace部分的内容
首先判断flag内容中某个字符是大写还是小写字母,如果是大写字母,>=左边取90,如果是小写字母,>=左边取122,再判断该字符在26个字母表中的位置,如果该字符在字母表的前半部分,则替换为字母表后半部分对应位置的字符,同理,如果该字符在字母表的后半部分,则替换为字母表后半部分对应位置的字符,字符的大小写不变
写逆脚本即可得到flag
[SUCTF2019]SignIn
elf文件,无壳,ida分析
main函数逻辑清晰,先获取输入,然后调用sub_96A函数分割输入,例如输入字符串的第一个字符为“f”,其十六进制ascii码为0x66,经过sub_96A函数,结果存储到v9,有v9[0]=0x6,v9[1]=0x6,然后v9数组转成整形作为RSA的明文m,接下来就是RSA加密和验证
在线网站或者yafu分解模数n
写脚本即可得到flag