安卓动态调试
这个是我错误中,学会的一种方法。记录下来方便我以后使用。
因为是给我自己看的,所以我的环境是已经弄好了【网上教程很多】
https://blog.csdn.net/kenbo_257/article/details/122726128
1.首先你得让你的apk能调试
1234567<!-- application标签加上android:debuggable="true" --><application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:debuggable="true">
android:debuggable="true">要让这个 == true ...
radare2
所有内容均来自:https://xz.aliyun.com/t/7265#toc-6
radare2工程是由于一系列的组件构成的,这些组件可以在radare2界面或者单独被使用-比如:rabin2,rahash2,radiff2,rafind2,ragg2,rarun2,rax2,radare2。
相当于radare2 是手机,rabin2,rahash2,radiff2,rafind2,ragg2,rarun2,rax2,radare2是手机里面的程序。
可以用-h 和?来获取到信息。
rabin2Rabin类似于阿拉伯语中的兔子,radare用这个可爱的名字掩盖了rabin是一个强大的二进制处理工具的事实。它可以获取有关导入,节,标头和其他数据的信息。 Rabin2可以用其他工具接受的格式来显示这些信息,包括radare2本身。Rabin2可以解析许多文件格式:Java CLASS,ELF,PE,Mach-O或插件支持的任何文件格式,并且能够获取符号导入/导出,库依赖,数据段字符串,外部参照,入口点地址,段,架构等
-h 来获取更多的信息
-I
打印出二进制文件的系统属性,语 ...
CSAW CTF2017年的总决赛的一道逆向题目“Rabbithole”
这个题目久只有一个64位的ELF文件。
我写这个题目的主要目的是:1.提升自己IDApython能力。3.加强对IDA流程图的利用。4.对算法的过程的理解。
首先拿到文件然后用IDA Pro 7.7 打开
找到主要的位置,进行一个简单的分析:
这里主要的是check_value这个函数
哇靠,这个函数IDA F5分析有错误。首先我们来看一下吧:
通过F5来看,它就是直接的return a2+8。
感觉久很“答辩”
这里我们再来看看roots:
它是一个充满了指针的一个数组。
我们随便看一个node_吧
可以看到一个node里面有好多的0,然后其他的就不是0。感觉这些数据就很符合while ( !*(_BYTE *)a2 ) 的构造。
但是这里F5出来有一点点的小问题:它就循环一下然后就退出去了。
我们这里看看汇编代码:
这里汇编看到的是:循环调用自身,而不是简单的一个while循环。感觉也大差不差的。
大致看了check的代码,我们回到main
大概就是传入的flag值,进入check函数里面去比较。值需要相同,这里用爆破的思想来爆破出flag的值。
我们循环遍历可见字符 ...
IDApython
因为我现在用的是IDA7.7的版本,然后python版本是3。但是网上基本上都是基于2.7来讲解的。在使用的时候经常报错。所以我准备把以后遇到的python脚本都统一的记录下来。
【一下的代码亲测有效】
获取地址首先我们在IDA脚本中通常用ea来表示地址。
1.获取光标处的地址123ea = idaapi.get_screen_ea()print(ea)#默认是用10进制打印print(hex(ea))#用16进制打印
2.通过函数名称获取地址获取的是这个函数的首地址。
函数名称一般是 :.text:0000000000056330 __do_global_dtors_aux proc near
1234import idaapifunc_name = "__do_global_dtors_aux" # 替换为你要查找的函数名func_ea = idaapi.get_name_ea(BADADDR, func_name)print(hex(func_ea))
for循环这段代码的作用是遍历二进制文件的 ...
2020网鼎杯朱雀组
Tree首先进来是2个函数第一个函数如下,作用是将flag中的0f 转成对应的二进制。【暗示着flag中也只有0f这些】
看第二个函数:是将刚刚的0和1进行寻址的操作,最下面那个v3=al 是找到字符了,然后进行下一个的寻找。【这里得知道的是要do while 好几次才能找到一个字符】最后这些字符所组成的字符串要和“zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx”相同。这个就是二叉树吧
这里我们要解密的就是这个二叉树。
第二个函数的传参是root,在函数里面是al。要知道二叉树的根就得知道他的地址。静态的时候是不知道他的值是多少的,但是我们可以动态调试出来:【0x00406530】
然后就是用IDApython来对它进行操作
方法一:爆破的思想:https://blog.csdn.net/szxpck/article/details/106197474
【需要在动态调试的时候shift + f12】
123456789101112131415161718192021222324252627root = 0x00406530 # 根结点地址secret = ...
2020羊城杯
login进来看到
这个图像,才写了一个 exe打包python文件的题。
参考:https://www.zmypb.top/2023/09/22/%E6%AF%94%E8%B5%9B%E5%A4%8D%E7%8E%B0-ctfshow-%E5%86%85%E9%83%A8%E8%B5%9B/
中的“来一个派森”
得到python文件
12345678910111213141516171819202122232425262728293031323334#!/usr/bin/env python# visit https://tool.lu/pyc/ for more information# Version: Python 3.6import sysinput1 = input('input something:')if len(input1) != 14: print('Wrong length!') sys.exit()code = []for i in range(13): code.append(ord(input1[ ...
ctfshow_36D杯
签到
看到if(v6)就知道v6需要==0
看到do while 循环,需要v8 ^ v7 ^ (v7 + (v7 ^ v9[v7])) == 0
1v8 = v7 ^ (v7 + (v7 ^ v9[v7])) //每次v7+1
12345678v9 = [102,109,99,98,127,58,85,106,57,82,122,55,81,19,51,35,67,70,41,61,41,32,127,28,38,77,49,20,80,94,-24]flag = ""v7 = 0for i in v9: v8 = v7 ^ (v7 + (v7 ^ i)) v7 = v7+1 flag += chr(v8)print(flag)
flag{A_s1mpLe&E4sy_RE_i5Nt_1t}
神光看主函数
看第一个字符串操作1
肯定不能返回0三,所以这个Str1就应该==wangzherongyao。因为我们知道后面有一个MessageBoxA,想看一下会弹什么窗,所以就先去运行该程序试验一下。
发现是进了一步。
我们要相信没有 ...
ctfshow_内部赛
真的是签到拿到是一个zip文件,并且没有后缀..手动给他加上.zip的后缀。
然后使用:ZipCenOp.jar 这个工具进行解密
12java -jar ZipCenOp.jar e xxx.zip 加密java -jar ZipCenOp.jar r xxx.zip 解密
然后就打开发现有一个“签到.exe”
然后用Die【我习惯了】这个工具看到这个是有一个ASPack(2.12-2.42)的壳
然后用Unpacker for ASPack 这个工具一键脱壳【我这里保存为222.exe】
用IDA打开后发现还有问题,一看还有一个UPX的壳【但是这里的upx没给版本】
我按照老样子去脱upx壳的时候不幸运的是错误了…【】
然后我换了一个脱壳机【在52破解里面找的】,就成功了…
然后用IDA打开
12345678910flag = ""a = [0x6c,0x2f,0x30,0x31,0x32,0x33,0xb6,0xbf,0xa0,0xcf,0x7c,0x71,0x6a,0x6c,0x70,0x64,0x75,0x63]b = a[::-1]for i ...
BJDCTF2020
encode首先是upx脱壳
1upx -d encode
然后是IDA分析,shitf F12找到位置后F5看看具体流程,根据运行的情况知道printf函数
v6[50]就是v6后面的地址,因为上一句是:“Please input your flag”猜测sub_806DA80函数是scanf。
看到if ( sub_805BBD0(&v6[50]) != 21 )知道我们输入的字符串长度是21byte【一般情况下我们输入的就是flag】
sub_804EAF0(0);猜测长度不对的时候就错了退出去了,所以这个函数应该是退出的函数【不用分析因为不会进入】
看到v0 = sub_8048AC2(&v6[50]);因为我们输入的flag是v6[50]后面的,所以这里是对flag进行了以第一次处理
点进去看看这个函数,最后分析可得是一个base64编码的函数:因为里面有base64字符集【这里可能是的,用ChatGPT分析是这样的】
来看看sub_805BBD0()函数,只有一个参数,点进去过后非常的复杂…可以直接猜到是一个返回字符串长度的函数。因为下面有一个& ...
java - native
什么是native? 可以将native方法比作Java程序同C程序的接口,其实现步骤: 1、在Java中声明native()方法,然后编译; 2、用javah产生一个.h文件; 3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件); 4、将第三步的.cpp文件编译成动态链接库文件; 5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了
就是在写CTF题目的时候,某个类里面的方法,有native关键字的时候,就需要去解压,然后找到.so文件
这个一般在native下面有一个system”
比如:System.loadLibrary(“native-lib”);
apk解压apk文件和zip文件一样可以解压,将后缀一改,然后就解压了
可以在里面找到lib文件夹下的.so文件
.so文件可以用IDA分析
在IDA分析出来后,在IDA左边的函数窗口中可以搜索到 你用jadx的函数名字,快速定位
pyth ...