pingpong  XCTF 3rd-BCTF-2017

java层代码很简单:

  1 package com.geekerchina.pingpongmachine;
2
3 import android.os.Bundle;
4 import android.support.v7.app.AppCompatActivity;
5 import android.view.Menu;
6 import android.view.MenuItem;
7 import android.view.View$OnClickListener;
8 import android.view.View;
9 import android.widget.TextView;
10
11 public class MainActivity extends AppCompatActivity {
12 class com.geekerchina.pingpongmachine.MainActivity$1 implements View$OnClickListener {
13 com.geekerchina.pingpongmachine.MainActivity$1(MainActivity arg1) {
14 MainActivity.this = arg1;
15 super();
16 }
17
18 public void onClick(View arg7) {
19 if(MainActivity.this.tt % 2 == 1) {
20 MainActivity.this.p = 0;
21 MainActivity.this.num = 0;
22 MainActivity.this.tt = MainActivity.this.ttt;
23 }
24
25 --MainActivity.this.tt;
26 MainActivity.this.p = MainActivity.this.ping(MainActivity.this.p, MainActivity.this.num);
27 ++MainActivity.this.num;
28 if(MainActivity.this.num >= 7) {
29 MainActivity.this.num = 0;
30 }
31
32 View v0 = MainActivity.this.findViewById(0x7F0B0056);
33 ((TextView)v0).setText("PING");
34 if(MainActivity.this.tt == 0) {
35 ((TextView)v0).setText("FLAG: BCTF{MagicNum" + Integer.toString(MainActivity.this.p) + "}");
36 }
37 }
38 }
39
40 class com.geekerchina.pingpongmachine.MainActivity$2 implements View$OnClickListener {
41 com.geekerchina.pingpongmachine.MainActivity$2(MainActivity arg1) {
42 MainActivity.this = arg1;
43 super();
44 }
45
46 public void onClick(View arg7) {
47 if(MainActivity.this.tt % 2 == 0) {
48 MainActivity.this.p = 0;
49 MainActivity.this.num = 0;
50 MainActivity.this.tt = MainActivity.this.ttt;
51 }
52
53 --MainActivity.this.tt;
54 MainActivity.this.p = MainActivity.this.pong(MainActivity.this.p, MainActivity.this.num);
55 ++MainActivity.this.num;
56 if(MainActivity.this.num >= 7) {
57 MainActivity.this.num = 0;
58 }
59
60 View v0 = MainActivity.this.findViewById(0x7F0B0056);
61 ((TextView)v0).setText("PONG");
62 if(MainActivity.this.tt == 0) {
63 ((TextView)v0).setText("FLAG: BCTF{MagicNum" + Integer.toString(MainActivity.this.p) + "}");
64 }
65 }
66 }
67
68 View$OnClickListener jping;
69 View$OnClickListener jpong;
70 public int num;
71 public int p;
72 public int tt;
73 public int ttt;
74
75 static {
76 System.loadLibrary("pp");
77 }
78
79 public MainActivity() {
80 super();
81 this.p = 0;
82 this.num = 0;
83 this.ttt = 1000000;
84 this.tt = this.ttt;
85 this.jping = new com.geekerchina.pingpongmachine.MainActivity$1(this);
86 this.jpong = new com.geekerchina.pingpongmachine.MainActivity$2(this);
87 }
88
89 protected void onCreate(Bundle arg4) {
90 super.onCreate(arg4);
91 this.setContentView(0x7F04001B);
92 this.findViewById(0x7F0B0057).setOnClickListener(this.jping);
93 this.findViewById(0x7F0B0058).setOnClickListener(this.jpong);
94 }
95
96 public boolean onCreateOptionsMenu(Menu arg3) {
97 this.getMenuInflater().inflate(0x7F0D0000, arg3);
98 return 1;
99 }
100
101 public boolean onOptionsItemSelected(MenuItem arg3) {
102 boolean v1 = arg3.getItemId() == 0x7F0B0070 ? true : super.onOptionsItemSelected(arg3);
103 return v1;
104 }
105
106 public native int ping(int arg1, int arg2) {
107 }
108
109 public native int pong(int arg1, int arg2) {
110 }
111 }

有两个按钮,分别调用natice层 ping方法、pong方法

先随便点一个,然后先ping 后pong,总共点击1000000次后输出flag

libpp.so 中的方法ping、pong中都有调用sleep(1) ,我们需要修改so文件,将其参数设为0

网上的一些wp都是新建个工程,然后调用so中方法。

那我们直接使用frida调用不就好了。

frida脚本:

  1 import frida, sys
2
3
4 def on_message(message, data):
5 if message['type'] == 'send':
6 print("[*] {0}".format(message['payload']))
7 else:
8 print(message)
9
10 jscode = """
11 setImmediate(function () {
12 Java.perform(function () {
13 console.log("start");
14 //so层hook
15 //导出函数
16 //var exports = Module.enumerateExportsSync("libpp.so");
17 //for(var i=0;i<exports.length;i++){
18 // send("name:"+exports[i].name+" address:"+exports[i].address);
19 // }
20
21 //遍历模块找基址
22 Process.enumerateModules({
23 onMatch: function (exp) {
24 if (exp.name == 'libpp.so') {
25 send('enumerateModules find');
26 send(exp.name + "|" + exp.base + "|" + exp.size + "|" + exp.path);
27 send(exp);
28 return 'stop';
29 }
30 },
31 onComplete: function () {
32 send('enumerateModules stop');
33 }
34 });
35
36 //通过模块名直接查找基址
37 var soAddr = Module.findBaseAddress("libpp.so");
38 send("soAddr:" + soAddr);
39
40 var aping=0x1308+1
41 var apong=0x1564+1
42 // hook导出函数 通过函数名
43
44 var fping=Module.findExportByName("libpp.so", "Java_com_geekerchina_pingpongmachine_MainActivity_ping")
45 send("findExportByName ping():" +fping );
46 fping=new NativePointer(soAddr).add(aping);
47 //NativePointer 简写ptr
48 send("findExportByName ping():" +fping );
49 var ping=new NativeFunction(fping, "int", ['pointer','pointer','int', 'int']);
50
51
52 //send("findExportByName edit():"+Module.findExportByName("libpp.so", "_ZL4editP7_JNIEnvP8_jobjecti"))
53 // Interceptor.attach(fping, {
54 // onEnter: function (args) {
55 // send("ping() began p:" + args[2] + ", num:" + args[3] );
56 // },
57 // onLeave: function (retval) {
58 // send("ping() return:" + retval);
59 // }
60 // });
61
62 // hook导出函数 通过函数名
63 var fpong=Module.findExportByName("libpp.so", "Java_com_geekerchina_pingpongmachine_MainActivity_pong")
64 send("findExportByName pong():" +fpong );
65 fpong=new NativePointer(soAddr).add(apong);
66 send("findExportByName pong():" +fpong );
67 var pong=new NativeFunction(fpong, "int", ['pointer','pointer','int', 'int']);
68 //send("findExportByName edit():"+Module.findExportByName("libpp.so", "_ZL4editP7_JNIEnvP8_jobjecti"))
69 // Interceptor.attach(fpong, {
70 // onEnter: function (args) {
71 // send("pong() began p:" + args[2] + ", num:" + args[3] );
72 // },
73 // onLeave: function (retval) {
74 // send("pong() return:" + retval);
75 // }
76 // });
77 var env = Java.vm.getEnv();
78 var obj=ptr(0);
79 var check = 1000000;
80 var beFlag = 0;
81 var num = 0;
82 while (true) { //下面这部分代码参考 https://blog.csdn.net/jasalee/article/details/70242837
83 if (check % 2 == 1) {
84 --check;
85 beFlag = pong(env,obj,beFlag,num);
86 ++num;
87 if(num >= 7) {
88 num = 0;
89 }
90 } else {
91 --check;
92 beFlag = ping(env,obj,beFlag,num);
93 ++num;
94 if(num >= 7){
95 num = 0;
96 }
97 }
98 if (check == 0) {
99 send("check:"+check+" num:"+num)
100 send("FLAG : "+"BCTF{MagicNum" + beFlag+ "}");
101 break;
102 }
103 }
104
105 });
106 });
107 """
108
109
110 # 运行中hook
111 process = frida.get_usb_device().attach('com.geekerchina.pingpongmachine')
112 script = process.create_script(jscode)
113 script.on('message', on_message)
114 print('[*] Running test')
115 script.load()
116 sys.stdin.read()
117
118
119 '''
120 [*] Running test
121 start
122 [*] enumerateModules find
123 [*] libpp.so|0xd4c48000|24576|/data/app/com.geekerchina.pingpongmachine-6gshbHpfeBmTBFRYBxQpNg==/lib/arm/libpp.so
124 [*] {'name': 'libpp.so', 'base': '0xd4c48000', 'size': 24576, 'path': '/data/app/com.geekerchina.pingpongmachine-6gshbHpfeBmTBFRYBxQpNg==/lib/arm/libpp.so'}
125 [*] enumerateModules stop
126 [*] soAddr:0xd4c48000
127 [*] findExportByName ping():0xd34c9309
128 [*] findExportByName ping():0xd4c49309
129 [*] findExportByName pong():0xd34c9565
130 [*] findExportByName pong():0xd4c49565
131 [*] check:0 num:1
132 [*] FLAG : BCTF{MagicNum4500009}
133 '''

大约要跑4、5分钟的样子,没去分析ping、pong方法,大佬们可以分析一波 0.0

BCTF{MagicNum4500009}

脚本编写中也发现了一个问题:

  Module.findExportByName 得到的地址不正确。

应该使用 基地址+函数偏移地址(thumb指令下偏移地址+1)

攻防世界 reverse pingpong的更多相关文章

  1. 攻防世界 reverse 进阶 10 Reverse Box

    攻防世界中此题信息未给全,题目来源为[TWCTF-2016:Reverse] Reverse Box 网上有很多wp是使用gdb脚本,这里找到一个本地还原关键算法,然后再爆破的 https://www ...

  2. 攻防世界 reverse evil

    这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...

  3. 攻防世界 reverse tt3441810

    tt3441810 tinyctf-2014 附件给了一堆数据,将十六进制数据部分提取出来, flag应该隐藏在里面,(这算啥子re,) 保留可显示字符,然后去除填充字符(找规律 0.0) 处理脚本: ...

  4. 攻防世界 reverse 进阶 APK-逆向2

    APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...

  5. 攻防世界 reverse Windows_Reverse2

    Windows_Reverse2   2019_DDCTF 查壳: 寻找oep-->dump-->iat修复   便可成功脱壳 int __cdecl main(int argc, con ...

  6. 攻防世界 reverse BabyXor

    BabyXor     2019_UNCTF 查壳 脱壳 dump 脱壳后 IDA静态分析 int main_0() { void *v0; // eax int v1; // ST5C_4 char ...

  7. 攻防世界 reverse parallel-comparator-200

    parallel-comparator-200 school-ctf-winter-2015 https://github.com/ctfs/write-ups-2015/tree/master/sc ...

  8. 攻防世界 reverse 进阶 8-The_Maya_Society Hack.lu-2017

    8.The_Maya_Society Hack.lu-2017 在linux下将时间调整为2012-12-21,运行即可得到flag. 下面进行分析 1 signed __int64 __fastca ...

  9. 攻防世界 reverse easy_Maze

    easy_Maze 从题目可得知是简单的迷宫问题 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 ...

随机推荐

  1. μC/OS-III---I笔记5---多值信号量

    多值信号量 操作系统中利用信号量解决进程间的同步和互斥(互斥信号量)的问题,在多道程序环境下,操作系统如何实现进程之间的同步和互斥显得极为重要.比如对同一部分资源的访问是要互斥,不能在另一个进程A在访 ...

  2. uname -a

    uname -a Linux shell command https://en.wikipedia.org/wiki/Uname#:~:text=uname $ uname # Darwin $ un ...

  3. How to implement an accurate countdown timer with js

    How to implement an accurate countdown timer with js 如何用 js 实现一个精确的倒计时器 原理剖析 web worker js custom ti ...

  4. frontends tools

    frontends tools figma free online UI 可视化埋点 https://www.figma.com/files/recent cypress testing $ npm ...

  5. Google IO & 2019

    Google IO & 2019 Google IO Recap \ https://www.techradar.com/news/google-io-2019-keynote https:/ ...

  6. echarts手机端,数据多时可以滚动

    <div id="container" style="height: 400px"></div> <script type=&qu ...

  7. [转]【视觉 SLAM-2】 视觉SLAM- ORB 源码详解 2

    转载地址:https://blog.csdn.net/kyjl888/article/details/72942209 1 ORB-SLAM2源码详解 by 吴博 2 https://github.c ...

  8. [Python学习笔记]组织文件

    shutil 模块 shutil 模块可以让我们很方便的在Python程序中复制.移动.改名和删除文件. 复制文件和文件夹 使用shutil.copy()来复制文件,该函数含两个参数,均为字符串格式的 ...

  9. synchronized语法

    synchronized( ){ } synchronized 关键字是加锁的意思,用它来修饰方法就表示给该方法加了锁,从而达到线程同步的效果;用它来修饰代码块就表示给该代码块加了锁,从而达到线程同步 ...

  10. Navicat premium对数据库的结构同步和数据同步功能

    一.在目标数据库新建一个相同的数据库名. 二.工具-->结构同步. 三.填写源数据库和目标数据库. 四.点击比对 五.点击部署 六.点击运行 七.点击关闭.此时源数据库的结构已经同步到目标数据库 ...