IDA 的下载安装

建议使用 吾爱破解论坛 提供的 IDA Pro版本(有能力请务必支持正版,这里仅供讨论学习使用

WARNING: Python 3 is not configured (Python3TargetDLL value is not set).
Please run idapyswitch to select a Python 3 install.
  • 确保安装了 python3 环境后,打开 IDA 的安装路径,在根目录下有一个 idapyswitch.exe
    双击运行后,会有一个弹窗,让你选择 python 的版本,一般默认是 0
    如果安装了多个 python,可以根据自己的需要选择具体的 python 版本

IDA 的常用快捷键

作用快捷键
查看字符串Shift + F12
反汇编F5
快速查看16进制数的ASCii码对应的字符r
在反汇编后的界面中写下注释
在反编译后伪代码的界面中写下注释/
查看、隐藏变量的类型\
对着某个函数、变量按该快捷键,查看它的交叉引用x
直接跳转到某个地址g
更改变量的名称n
拍摄IDA快照ctrl + shift + w
嵌入脚本shift + F2
文本搜索字符串alt + t
将数据转换为16 进制h
获取数组的数据shift + e
对数据db/dw/dd之间进行切换d
转化为函数p
将数据转化为代码c
将数据转化为字符串a
将代码转换为数据u

IDA 命名前缀的含义

IDA 会自动生成假名字,用于表示子函数、程序地址和数据,根据不同的类型和值,假名字有不同的前缀


前缀意义
sub_指令和子函数起点
locret_返回指令
loc_指令
off_数据,包含偏移量
seg_数据,包含段地址值
asc_数据,ASCII字符串
byte_数据,字节(或字节数组)
word_数据,16位数据(或字数组)
dword_数据,32位数据(或双字数组)
qword_数据,64位数据(或4字数组)
flt_浮点数据,32位(或浮点数组)
dbl_浮点数,64位(或双精度数组)
tbyte_浮点数,80位(或扩展精度浮点数)
stru_结构体(或结构体数组)
algn_对齐指示
unk_未处理字节

IDA 远程调试

有时候程序是 Linux 平台的 elf 文件,可以使用 Windows 端的 IDA 对 Linux 端的程序远程调试

  1. 首先到 Windows 端 IDA 路径的 dbgsrv 目录下:

IDA远程调试1.png
找到 linux_serverlinux_server64 两个文件

linux_server 是连接 32 位程序的,linux_server64 连接 64 位程序

将这两个文件拷到 Linux 虚拟机中

  1. 给这两个文件增加执行权限,然后运行(需要调试多少位的程序就运行哪一个)

IDA远程调试2.png
记住端口号:23946

保持运行,不要关

  1. 先在 Windows 端 IDA 中 快捷键 F2 下好断点

IDA远程调试3.png
然后选择调试器

IDA远程调试4.png
然后按 快捷键 F9 运行程序

会弹出一个输入框:

IDA远程调试5.png
这里的 Hostname 是你的 Linux 虚拟机的 ip 地址

可以在 Linux 虚拟机终端输入 ifconfig 获取 ip 地址,我这里是 192.168.171.128

IDA远程调试6.png

将其他参数填完整:

IDA远程调试7.png

注意:这里所有的参数都是填 Linux 的

ApplicationInput file 填:调试程序在 Linux 的绝对路径
Directory 填:调试程序所在目录的绝对路径

  1. 如果弹出 "Input file is missing: xxx" 的报错

IDA 会询问是否向 Linux 端拷贝这个调试程序

"OK" 就行,然后选择 Windows 本地的调试程序,IDA 会自动拷贝过去(一般是路径输错了,但是 IDA 拷贝过去也可以调试)

  1. 成功连接的界面如下:

IDA远程调试8.png

同时,可以看到 Linux 端执行的程序:

IDA远程调试9.png


IDA 中的汇编基础

字符串末尾用 ‘0’ 表示结束

  • Format 的内容:”Welcome The System\nPlease Input Key:”
.rdata:00402100 57 65 6C 63 6F 6D 65 20 54 68+ Format db 'Welcome The System' , 0Ah ;     DATA XREF: _main+28↑o
.rdata:00402100 65 20 53 79 73 74 65 6D 0A 50+ db 'Please Input Key:' , 0
  • byte_402150 的内容:2a49f69c38395cde96d6de96d6f4e025484954d6195448def6e2dad67786e21d5adae6
    byte_402151 的内容:a49f69c38395cde96d6de96d6f4e025484954d6195448def6e2dad67786e21d5adae6
.rdata:00402150 ; char byte_402150[]
.rdata:00402150 32 byte_402150 db '2' ;      DATA XREF: sub_401090:loc_4010CC↑r
.rdata:00402151 ; char byte_402151[]
.rdata:00402151 61 byte_402151 db 'a' ;      DATA XREF: sub_401090:loc_4010E9↑r
.rdata:00402152 34 39 66 36 39 63 33 38 33 39+a49f69c38395cde db '49f69c38395cde96d6de96d6f4e025484954d6195448def6e2dad67786e21d5adae6' , 0

dup(?) 开辟未初始化的空间

CTF - Reverse_IDA——汇编知识1.png

  • str2 db 68h dup(?) 是指开辟一个 68h 长度的空间,且不进行初始化