frida爆破小试

frida爆破小试:一道非常简单的CTF题

题目

参考:https://bbs.pediy.com/thread-259069.htm

输入6位密码,正确则获得flag

frida爆破

寻找相关函数

逆向分析部不是重点,仅给出结论

  • 确认按钮响应函数地址:0x40173A
  • 获得文本框内容函数地址:0x41B3F0,返回值eax存储着字符串首地址
  • 弹窗函数地址:0x004017D40x00401C03

模拟点击确认按钮

  1. 使用NativeFunction(address, returnType, argTypes[, abi])来创建一个Native函数
  2. 使用rpc调用,调用创建的NativeFunction函数
1
2
3
4
5
6
7
8
// 模拟点击
var OnClick_40173A = ptr('0x40173A');
var OnClick_Func = new NativeFunction(OnClick_40173A, 'void', []);
rpc.exports = {
click : function() {
OnClick_Func();
}
};

当hook上目标之后,在Py代码部分使用script.exports.click()模拟点击按钮的动作

获取并设置文本框内容

需要说明的是,调用链上会有先后两次进入GetInput_41B3F0函数(第一次获取文本判空,第二次才是处理内容),这里做个简单处理即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Hook获取并设置文本框内容
var key_num = 100000;
var need_update = false;
var GetInput_41B3F0 = ptr('0x41B3F0');
Interceptor.attach(GetInput_41B3F0, {
onLeave : function(retval) {
if(key_num < 1000000) {
// console.log(Memory.readAnsiString(ptr(retval.toInt32())));
Memory.writeAnsiString(ptr(retval.toInt32()), key_num.toString());
// console.log(Memory.readAnsiString(ptr(retval.toInt32())));
if(need_update) {
// 第二次离开该函数时,更新key_num
key_num++;
}
need_update = !need_update;
}
}
});

nop掉错误弹窗

错误弹窗有两个,0x00401C03是密码错误的弹窗,另一个是未输入密码的弹窗,nop掉密码错误的就行,需要注意的地方也就是要设置下代码段属性

1
2
3
var msg_func2 = ptr('0x00401C03');
Memory.protect(msg_func2, 5, 'rwx')
Memory.writeByteArray(msg_func2, [0x90, 0x90, 0x90, 0x90, 0x90])

完整代码及结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# -*- coding: utf-8 -*-
import frida
import sys


def on_message(message, data):
print("[on_message] message:", message, "data:", data)

class MyHook(object):
def __init__(self, target_process, on_message_func = on_message):
self.__session = frida.attach(target_process)
self.__on_message_func = on_message_func

def hook(self, script):
self.__script = self.__session.create_script(script)
self.__script.on("message", self.__on_message_func)
self.__script.load()
print("Hooking...")

# working...
while True:
self.__script.exports.click()

sys.stdin.read()
self.__session.detach()

# Js脚本
script = """
// 模拟点击
var OnClick_40173A = ptr('0x40173A');
var OnClick_Func = new NativeFunction(OnClick_40173A, 'void', []);
rpc.exports = {
click : function() {
OnClick_Func();
}
};

// Hook获取并设置文本框内容
var key_num = 730000;
var need_update = false;
var GetInput_41B3F0 = ptr('0x41B3F0');
Interceptor.attach(GetInput_41B3F0, {
onLeave : function(retval) {
if(key_num < 1000000) {
Memory.writeAnsiString(ptr(retval.toInt32()), key_num.toString());
if(need_update) {
console.log('Testing number = ' + Memory.readAnsiString(ptr(retval.toInt32())));
key_num++;
}
need_update = !need_update;
}
}
});

// nop掉错误弹窗
var msg_func2 = ptr('0x00401C03');
Memory.protect(msg_func2, 5, 'rwx')
Memory.writeByteArray(msg_func2, [0x90, 0x90, 0x90, 0x90, 0x90])
"""

if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage example.py <target>")
else:
try:
target = int(sys.argv[1])
except ValueError as e:
target = sys.argv[1]
myhook = MyHook(target)
myhook.hook(script)

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021 lzeroyuee
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信