2020.09.20
经验教训
- jnz指令,是用来判断是否正确的标志;
- IDA中,按a可以把十六进制转化为字符串,按f5能看伪代码;
- liblhm.so文件是APK解压来的,是动态库,可以在IDA中打开,目录一般是
\lib\armeabi\liblhm.so
; - apk反编译后,在查看源码的时候,有一些方法只有方法名,内容是空的,很有可能是native层的方法,要用IDA查看liblhm.so文件
- apk反编译可以用JEB
第一题 入门逆向
https://ctf.bugku.com/challenges#入门逆向
- 下载完文件,IDA打开,打开String视图,发现有用信息
- 双击进入代码段,x或者右键,跳转到xref
- 在下方发现疑似flag十六进制,r转换得到flag
flag{Re_1s_S0_C0OL}
第二题 Easy_vb
https://ctf.bugku.com/challenges#Easy_vb
- 老办法,打开IDA,shift+f12开启string视图,看见esay_vb字段,双击跳转,往下看发现flag字段
MCTF{_N3t_Rev_1s_E4ay_}
,改成flag开头,就行
第三题 Easy_Re
https://ctf.bugku.com/challenges#Easy_Re
- IDA打开,f5查看伪代码,发现存在一个数据比对的过程,比对的内容是v5,但是数据存在上边的v6中,双击上边qword_413E44进入查看,发现flag
DUTCTF{We1c0met0DUTCTF}
,按a能把十六进制转化为字符串
第四题 游戏过关
https://ctf.bugku.com/challenges#游戏过关
- 下载打开如下图,是一个游戏,想正常过关是不存在的,只能想办法找到比对过关的地方,修改参数,让他满足条件,或者直接跳转到存储答案的地方,思路就是这样。
- IDA打开,string视图,发现线索,可以想象,这是游戏过关后的输出,那么被输出的肯定就是flag了,
3.双击跳转到代码
- x跳转到xrefs,
- f5查看伪代码,没有看到明显的flag,看这里应该是经过运算得到的flag,我们不好直接得到那就得运行这个程序,想办法让他跳转到这里执行,让他给我们输出结果
- 这就用到另一个np的软件,OD,不知道为什么,我的od和ida地址一直对不上,我本人已崩溃……
第六题 逆向入门
- 下载后查看二进制,发现是图片base64编码,解码得二维码,扫描得flag
bugku{inde_9882ihsd8-0}
第七题 love
https://ctf.bugku.com/challenges#love
- 下载之后,我的虚拟机竟然打不开……
- 还好IDA可以打开,啊哈哈哈,打开之后查看String,定位到flag,大体能看出来这个程序什么意思,就是输入一个值,跟flag比较,对了就输出right,错了就wrong
- 双击flag right,x查看xref,f5查看源码
__int64 main_0()
{
// 应该是base64编码
for ( i = 0; i < 100; ++i )
{
if ( (unsigned int)i >= 0x64 )
j____report_rangecheckfailure();
Dest[i] = 0;
}
sub_41132F("please enter the flag:");
sub_411375("%20s", &Str);
v0 = j_strlen(&Str);
v1 = (const char *)sub_4110BE((int)&Str, v0, (int)&v11);
strncpy(Dest, v1, 0x28u);
v8 = j_strlen(Dest);
// 这里对flag进行了处理,每一位都加了j,第一位加0,第二位加1……
for ( j = 0; j < v8; ++j )
Dest[j] += j;
v2 = j_strlen(Dest);
// 这里进行了比对,也就是说被比对的是Str2,双击查看Str2,再进行再进行解密即可
if ( !strncmp(Dest, Str2, v2) )
sub_41132F("rigth flag!\n");
else
sub_41132F("wrong flag!\n");
}
- 被比对的是Str2,双击查看Str2是
e3nifIH9b_C@n@dH
- 再进行再进行解密即可,脚本如下:
#!/usr/bin/env python 3.8
# -*- encoding: utf-8 -*-
#fileName : decry.py
#createTime: 2020/09/20 15:38:04
#author : 乔悟空
#purpose : 此脚本用于特定加密方式的解密
import base64
miwen = "e3nifIH9b_C@n@dH"
res = ''
for i,enu in enumerate(miwen):
res += chr(ord(enu)-i)
print(base64.b64decode(res.encode()))
- 输出结果是
{i_l0ve_you}
,提交结果是flag{i_l0ve_you}
第八题 LoopAndLoop(阿里CTF)
https://ctf.bugku.com/challenges#LoopAndLoop(阿里CTF)
- 首先这题我不会,看了很多大佬的资料,学到了很多东西。写在开头
- JEB打开apk文件,在mainactivity中按tab键查看源码,能发现比对函数check
- 具体比对方法很多wp中有就不说了,反正我是没看明白他到底是怎么运算的,反正就是一个思路,输入一个值,与99放入check中,然后巴拉巴拉出结果了……什么玩意哎
第九题 easy-100
https://ctf.bugku.com/challenges#easy-100(LCTF)
- 做个题还得专门整个手机安装app测试,nnd🥱
- 今天到此结束,我撂挑子了👻
- 比较好的解密脚本,取自这里
1 num = 99
2 flag = 1835996258
3 while num - 1 >0 :
4 tmp = num * 2 % 3
5 if(tmp == 0):
6 flag -=4950
7 if(tmp == 1):
8 if((num - 1) % 2 == 0):
9 flag -= 499500
10 else:
11 flag +=499500
12 if(tmp == 2):
13 flag -= 49995000
14 num -= 1
15 print flag