buuctf reverse板块部分wp的第二弹,持续更新ing
[GXYCTF2019]luck_guy
例行查壳,64位的
直接进主函数,然后一路找到flag位置

输出的是s,而s是由f1和f2位置存储的信息构成的,f1直接点进去就是注释的内容,f2则根据下面的case4,5有关f2的操作来确定内容。f2先是被case4存进内容,而此处\x7F是代表这是16进制,所以逆序存进去之后为注释内容。case5对存进去的字符串进行了处理。
将逆序内容在脚本中进行处理即可得出f2
不得不提的是这个题目和这个答案感觉在给我喂刀,特意搜了一下solar一般表示英俊是男名,我承认ctf比一般的虐文小说好看
JustRE
32位
在字符串搜索没有看见flag和key等,翻了一下看见一个像flag的
交叉引用查看函数
sprintf将内容复制到格式化字符串中,也就是19999和0复制进BDJ中替换%d,存入String
刮开有奖
看一眼,32位
看见security那个函数应该是主函数附近的检查安全性的,点进去看看
进入伪代码
这里的v7->v16都是连续内存,后面存进了字符,然后sub_4010F0进行处理了,进去看一眼
直接改成c代码看结果。这个地方的dword和4这种表达是因为伪代码从汇编来的,默认为单字节,所以在c代码中注意将a1+i4改为a1[i].


if处的string解决了,来看strcmp的内容v4和v5在前面都经过了401000的处理看一眼是啥
%3和后面的跟进看见的字符串猜测为base64,进行base64解码。


分析如注释,其中WP已经出现了所以尝试WP1放在前面。
简单注册器
看一眼下载的是安卓的安装包,那么安装试一下看效果

似乎是根据输入来输出所需要的注册码,进jadx找一下


根据搜索到的内容确定位置到这个函数,在这个函数最后他输出了flag
这里有两种方式第一种根据第一次if的判断随意编写一个结尾为a,第二位为b长度为32,并且符合第一位加第三位为48+56
第二种方式是将第二个if所给出的字符串按照第二个if的规则进行处理直接得到flag

esayre
首先查壳,发现UPX,去壳


进入ida搜索字符串并进入对应函数
根据第一个if可以看见v6为ACTF{flag}的格式,也就是v5数组那部分为flag,接着分析v5友v7v8v9未知数赋值
在循环中有一次校验,v4[i] != _data_start__[*((char *)v5 + i) - 1],反推可得v5:在_data_start__中对应v4[i]的元素的下标加一
查看data那个数组的内容shift+e获取对应的内容
最后获取的数据需要强转为字符(U9X_1S_W6@T?)代码如下:
a = [42, 70, 39, 34, 78, 44, 34, 40, 73, 63, 43, 64] // v4
b = [0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70, 0x6f, 0x6e, 0x6d, 0x6c,
0x6b, 0x6a, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59,
0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46,
0x45, 0x44, 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33,
0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x20, 0x21, 0x22,
0x00] //data
c = “” //flag
for i in a:
c += chr(b.index(i) + 1)
print(c)
pyre
首先看看是个pyc文件,直接找工具反编译

可见flag是一开始的input1,而input1经过处理成为了code所以code一路逆运算就得到了flag{Just_Re_1s_Ha66y!}
findit
首先看一眼文件类型 apk 安装试试

跟着给出的文本在安装包里面搜索一下
在输出文本前还有一个return和一个输出看来函数没找错
可以发现这个分成了两部分分别对x和y进行的处理,最后输出的内容其实只跟第二个灰框内的内容有关,有两种做法
第一种分析前半部分得出输入内容,输入到软件中得到flag,第二种直接分析falg(后续为第二种内容的代码)
flag{c164675262033b4c49bdf7f9cda28a75}
remo
首先看一眼,直接放进ida看字符串

找到correct进来看一眼代码,可以发现核心在两个while上
第二个while在确认第一个while后是否内容为v12相同,那么flag应该是从v12倒推
因为%26的存在可以发现这李的处理是将大小写分组以后进行移位处理,所以倒着移位回来就行

rsa
主要参考了大佬的做法 直接放链接了,后面rsa学好了再另外写rsa解析
https://blog.csdn.net/mcmuyanga/article/details/109624988
login
照例看一眼
进来看代码,其实就是遍历数组右移十三位
flag{ClientSideLoginsAreEasy@flare-on.com}