添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接


上篇文章讲解了如何操作FRIDA进行内存的读写,今天试试用objection来进行内存的读写。

github地址:

https://github.com/sensepost/objection

继续以上篇文章的apk进行学习,请开启frida服务。

通过objection命令启动apk进程:

objection -g com.yaotong.crackme explore

启动好的界面是这样的:

android 获取进程内存 android读取内存基址_linux

提示我们输入命令,如果你不知道该输入什么可以打下空格,会有很多提示。

我们知道,这个apk的flag是"aiyou,bucuoo",直接在内存中搜索是否存在:

memory search "aiyou,bucuoo" --string

android 获取进程内存 android读取内存基址_java_02

果然搜索到了,说明内存中确实是存在的,如果你不想看这些内容,仅仅只想看内存的偏移第一,可以在命令后面加一个 "--offsets-only"即可,如图:

android 获取进程内存 android读取内存基址_android_03

结果仅显示了偏移地址。

当然,这不是重点,重点是如何像上一篇文章那样不写代码就能读写内存。

1.导出所有modules的信息,用于获取libcrackme.so的基址。

memory list modules

结果如图:

android 获取进程内存 android读取内存基址_java_04

一下子显示了很多结果,由于无法使用grep过滤,所有保存到本地再查找吧:

memory list modules --json modules.json

运行后,打开modules.json,查找libcrackme.so,结果如图:

android 获取进程内存 android读取内存基址_java_05

可以看到,当前 so 的基址是 0xc9350000,再加上偏移 0x628c,也就是0xc935628c,以0xc935628c为地址,将这里的内容进行dump,100个字节即可:

memory dump from_base 0xc935628c 100 memory.dex

将保存后的文件用UE打开,内容如下:

android 获取进程内存 android读取内存基址_linux_06

继续像上面一样,将0xc9354450处的内容进行dump,同样100个字节:

memory dump from_base 0xc934450 100 final.dex

保存的结果用UE打开后,内容如下:

android 获取进程内存 android读取内存基址_java_07

可以看到,成功的找到了flag!

现在将这个flag进行改变试试,即将上面的"aiyou,bucuoo"变成"123456",命令如下:

memory write "0xc934450" "123456" --string

运行后,发现"123456"还是提示校验错误,那是什么原因呢,继续dump看看这个地址处的内容:

android 获取进程内存 android读取内存基址_python_08

原来写入时不含字符串的终止符,因此我们用另外的方式:

memory write 0xc9354450 "31 32 33 34 35 36 00"

加上一个终止符即可,再次输入"123456",发现成功了!

如果你写学习更多关于memory的操作,可以直接看源代码:

objection\commands\memory.py

当然,也可以以文件的方式来进行读取,使用import命令即可。

function main() {
  console.log("\nEntering the Script!");
  Java.perform(function() {
      console.log("Inside Java perform");
      var soAddr = Module.findBaseAddress("libcrackme.so");
      var passwordAddr = soAddr.add(0x628c);
      var pwdstr = Memory.readUtf8String(Memory.readPointer(passwordAddr));
      console.log("The flag is: " + pwdstr);
setImmediate(main);

将这段代码保存为hook.js,在objection界面输入:

import hook.js

结果如下:

android 获取进程内存 android读取内存基址_android 获取进程内存_09

也成功的显示出了结果,除了使用import命令,也可以使用 evaluate 命令:

android 获取进程内存 android读取内存基址_linux_10

如果后面不跟 Hook.js,则进入编辑界面,输入代码,同样可以计算出结果:

android 获取进程内存 android读取内存基址_android_11

学习内容:

  1. objection memory 相关命令的学习(modules导出,内存读写,字符串搜索)
  2. objection 界面下运行脚本的两种方式
  3. objection 界面下直接输入代码并运行


javascript压栈出栈 printf压栈出栈

printf函数的压栈顺序是从右到左压栈,计算表达式值的顺序也是从右到左,由于输入数据类型的多样性,压栈的时候将数据或数据的地址mov到寄存器中,然后将寄存器压栈例子:#include <iostream> using namespace std; int main(){ int arr[] = { 6, 7, 8, 9, 10 }; int *ptr = arr; //ptr指向