看雪ctf AliCrackme_2
使用jadx打开,
去IDA打开so,搜索check可以搜索到说明是静态注册的,看着就是一个简单的校验,但是填进去错误,看到题目的提示是有反调试,但用frida附加时没有反调试的,应该是针对IDA的反调试,网上查找了下,发现了几种反调试的方法
反调试方法
1.IDA调试端口检测
在调试器作远程调试时,会占用一些固定的端口号
通过读取 /proc/net/tcp,查找IDA远程调试所用的23946端口(也可以在运行netstat -apn的结果中搜索23946端口),若发现说明进程正在被IDA调试。
绕过方法:
由于只对23946端口进行判断,可以通过 ./android_server -p 23947 ,将IDA调试端口改为23947或者其他端口,注意端口转发和IDA调试的端口号都要改成23947
2.特征文件检测
android_server 特征文件名检测,我这边已经更改过文件名,附加程序关闭,继续分析。
3.tracepid检测
安卓的native下,通过读取进程的status或stat来检测Tracepid ,它主要原理是调试状态下的进程Tracepid不为0。
当检测到Tracepid 不为0时,app会kill掉进程,从而达到反调试的目的。
绕过方法:
对于这种调试的检测手段,最彻底是修改系统源码后重新编译,让 Tracepid 永远为0,也可以创建一个子进程,让子进程主动ptrace自身设为调试状态,此时正常情况下,子进程的 Tracepid 应该不为0。此时我们检测子进程的 Tracepid 是否为0,如果为0说明源码被修改
这里使用的frida去hook绕过了,没有修改源码了,
function Tracepid() {
console.warn(".............")
var fgetsPtr = Module.findExportByName("libc.so", "fgets");
var fgets = new NativeFunction(fgetsPtr, 'pointer', ['pointer', 'int', 'pointer']);
Interceptor.replace(fgetsPtr, new NativeCallback(function (buffer, size, fp) {
var retval = fgets(buffer, size, fp);
var bufstr = Memory.readUtf8String(buffer);
if (bufstr.indexOf("TracerPid:") > -1) {
Memory.writeUtf8String(buffer, "TracerPid:\t0");
}
return retval;
}, 'pointer', ['pointer', 'int', 'pointer']));
var killptr = Module.findExportByName("libc.so", "kill");
var kill = new NativeFunction(fgetsPtr, 'int', ['int', 'int']);
Interceptor.replace(killptr, new NativeCallback(function (pid,sig) {
console.log("kill")
return 0;
}, 'int', ['int', 'int']));
}
依次尝试上面的几种反调试的方法,发现是第三种方法反调试的,所以使用frida 先hook后再使用IDA附加调试,发现可以正常调试,没有报错。然后使用IDA在check处下断点,可以看到校验值被修改了,把这个值填进去,结果正确
标签:int,看雪,Tracepid,ctf,var,AliCrackme,pointer,调试,IDA From: https://www.cnblogs.com/immune53/p/17725790.html