IDA 中的嵌套结构

逆向工程 艾达 调试 蟒蛇 六线谱
2021-06-23 03:00:21

我试图弄清楚如何在 IDA 中探索结构,并陷入基础知识。我写了一个非常基本的测试应用程序;

int main() {
    const int kBits = 1024;
    const int kExp = 3;

    RSA *rsa = RSA_generate_key(kBits, kExp, 0, 0);
    RSA_print_fp(stdout, rsa, 0);

    RSA_free(rsa);
    return 0;
}

于是我进口OpenSSL的头,所以现在IDA了解什么RSA*BIGNUM*有。

然后,在伪代码视图中放置一个断点; 在此处输入图片说明

现在,如果我将鼠标悬停在 上v3,我会看到它正在解析结构。所以我想做一些事情,比如抓住 的价值rsa->d->dmax,但似乎没有办法做到这一点?我似乎无法v3在 IDAPython 中找到按名称访问的方法,我似乎也无法“遍历”结构以到达位于dmax. 有没有办法做到这一点?

2个回答

我对 IDApython API 的了解不是最完整的,但我会做的是

  1. 读取源代码(或在 IDA 中查找)以查找dinrsa_stdmaxin的位置(字节偏移量)bignum_st由于结构的上方的成员,这是很容易ddmax是指针或int型。
  2. 在调用之前检查反汇编并确定v3- 从它似乎存储在堆栈中的伪代码的位置如果幸运的话,在光标停留时按 Tab 键v3将带您进行一些反汇编的 mov 操作。
  3. 当断点被击中时,使用idc.get_reg_valueidc.get_bytes命令的组合(参见https://www.hex-rays.com/products/ida/support/idadoc/162.shtml),使用步骤 2 的结果作为起点。

以下是步骤:

  1. 设置断点。运行本地调试器F9打开调试器下拉菜单表单菜单栏,然后​​选择“拍摄内存快照”。这是屏幕截图:

Take_Memory_Snapshot

  1. 双击您想知道的变量(这里是RSA*指针)。IDA 将带您进入堆栈视图(又名 IDA View-RIP)。不要移动光标,否则你会得到不同的值。N命名该堆栈视图中的变量。将弹出“重命名地址”窗口。这是屏幕截图:

输入_变量_名称

  1. 在堆栈视图中命名变量后,按Y添加数据类型,即结构类型。对于这种情况,它将是RSA,而不是指针,因为所有堆栈变量都是线性放置的。这是屏幕截图:

Enter_Data_type

现在您可以看到所有结构成员的值。