首页
论坛
课程
招聘
推荐专栏
课程评论
ciphersaw
@Roger  视频中明显把shellcode字符串中的00截断,与栈上/bin/sh字符串的00截断混淆了。

无论压入/bin/sh还是/bin///sh,00都存在于字符串末尾,而不是字符串中间,因此两种写法的字符串均能读出。视频中说若压入/bin/sh字符串,只能读取到/bin,这种说法是错误的。

此外,真正产生00截断问题的,不是栈上/bin/sh字符串的00截断,而是shellcode字符串中的00截断。

视频中push  0x68对应的二进制代码为6A  68,而push  0x68732F对应的二进制代码为68  2F  73  68  00。

综上可见,压入/bin///sh字符串的二进制代码为6A  68  68  2F  2F  2F  73  68  2F  62  69  6E,而压入/bin/sh的二进制代码为68  2F  73  68  00  68  2F  62  69  6E。

真正的截断问题,出现在压入/bin/sh的shellcode中出现了00字符,导致后续的shellcode执行失败。
小想法
制作自己的插件so:
#include  "ida.h"

typedef  _DWORD  (*funGetObsoleteDexCache)(void  *);

//  art::ArtMethod::GetObsoleteDexCache作为a2让frida传入,比自己实现更方便
extern  "C"  int  MyGetDexFile(void  *a1,  void  *a2)  {
        int  result;

        if  ((*((_DWORD  *)  a1  +  1)  &  0x40000)  !=  0)  {
                funGetObsoleteDexCache  fDexCache  =  (funGetObsoleteDexCache)  a2;
                result  =  *(_DWORD  *)  ((_DWORD)  fDexCache(a1)  +  16);
        }  else  {
                result  =  *(_DWORD  *)  (*(_DWORD  *)  (*(_DWORD  *)  a1  +  16)  +  16);
        }
        return  result;
}

frida调用:
function  main()  {
        Java.perform(function  ()  {
                var  module_libext  =  null;
                if  (Process.arch  ===  "arm64")  {
                        module_libext  =  Module.load("/data/local/tmp/libnative-lib64.so");
                }  else  if  (Process.arch  ===  "arm")  {
                        module_libext  =  Module.load("/data/local/tmp/libnative-lib.so");
                }

                //获得GetObsoleteDexCache函数地址
                var  addrGetObsoleteDexCache;
                var  symbols  =  Module.enumerateSymbolsSync("libart.so");
                for  (var  i  =  0;  i  <  symbols.length;  i++)  {
                        var  symbol  =  symbols[i];
                        if  (symbol.name.indexOf("ArtMethod")  >=  0  &&  symbol.name.indexOf("GetObsoleteDexCache")  >=  0)  {
                                addrGetObsoleteDexCache  =  symbol.address;
                                break;
                        }
                }

                var  MyGetDexFile  =  module_libext.getExportByName("MyGetDexFile");
                var  funcMyGetDexFile  =  new  NativeFunction(MyGetDexFile,  "pointer",  ["pointer",  'pointer']);

                var  jnienv  =  Java.vm.getEnv();
                var  myclass  =  Java.use("com.sup.android.base.MainActivity").class;
                var  method  =  myclass.getDeclaredMethods();
                method  =  method[0];  //任意函数art_method都可GetDexFile()
                var  ArtMethodptr  =  jnienv.fromReflectedMethod(ptr(method.$h));
                var  DexFileptr  =  funcMyGetDexFile(ptr(ArtMethodptr),  ptr(addrGetObsoleteDexCache));
                dump(DexFileptr);
        })
}

function  dump(Dexfile)  {
        var  begin  =  ptr(Dexfile).add(Process.pointerSize).readPointer();
        var  size  =  ptr(Dexfile).add(2  *  Process.pointerSize).readU32();

        console.log(hexdump(begin))
        console.log(size);
        var  file  =  new  File("/sdcard/getDexFile.dex",  "w");
        file.write(begin.readByteArray(size));
        file.flush();
        file.close();
}
合作伙伴