IDAlinux远端动态调试实战过程记录
新手一枚,如有错误(不足)请指正,谢谢!!
练习动调的文件
题目下载:点击下载
参考资料:
IDA动态调试ELF
IDA载入,进入main函数,F5查看伪代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
time_t v3; // ebx
__pid_t v4; // eax
unsigned int v5; // ST18_4
unsigned int v6; // ST1C_4
char v7; // ST20_1
signed int i; // [esp+14h] [ebp-44h]
char s[40]; // [esp+24h] [ebp-34h]
unsigned int v11; // [esp+4Ch] [ebp-Ch]
v11 = __readgsdword(0x14u);
s[0] = 83;
s[1] = 69;
s[2] = 67;
s[3] = 67;
s[4] = 79;
s[5] = 78;
s[6] = 123;
s[7] = 87;
s[8] = 101;
s[9] = 108;
s[10] = 99;
s[11] = 111;
s[12] = 109;
s[13] = 101;
s[14] = 32;
s[15] = 116;
s[16] = 111;
s[17] = 32;
s[18] = 116;
s[19] = 104;
s[20] = 101;
s[21] = 32;
s[22] = 83;
s[23] = 69;
s[24] = 67;
s[25] = 67;
s[26] = 79;
s[27] = 78;
s[28] = 32;
s[29] = 50;
s[30] = 48;
s[31] = 49;
s[32] = 52;
s[33] = 32;
s[34] = 67;
s[35] = 84;
s[36] = 70;
s[37] = 33;
s[38] = 125;
s[39] = 0;
v3 = time(0);
v4 = getpid();
srand(v3 + v4);
for ( i = 0; i <= 99; ++i )
{
v5 = rand() % 40u;
v6 = rand() % 40u;
v7 = s[v5];
s[v5] = s[v6];
s[v6] = v7;
}
puts(s);
return 0;
}
将s[]数组按顺序输出,则为flag,此时练习动调
随便找行代码,F2下断点
动态调试步骤
在linux里准备好linux_server64和待动调的文件
其中linux_server64在IDA目录的dbgsrv文件夹
启动linux_server64
代码
./linux_server64
首次启动时候要输入代码
chmod +x linux_server64
IDA中选择调试器
对调试器进行配置
查看虚拟机IP命令
1. hostname -I
2. ifconfig
点击OK
F9运行
动调时候提示错误
由于调试的文件为ELF32,则应该用linux_server而不应该用linux_server64
重新配置
sudo apt-get install libstdc++6
sudo apt-get install lib32stdc++6
安装这两个东西
可以监听了
报这个错误……
关闭linux防火墙
service iptables stop
这里点确定
已经可以调试了
右上角有运行,点击一下,然后就会断在之前下的断点那里
然后F5可以查看伪代码
这里i的地址在栈上的ebp-44h处
EBP处的地址
可以算出变量i在栈上的地址
此时i等于4
每次F8单步可以执行一次代码
部分快捷键
F2下断点
F7,f8单步步入
p分析函数,把机器码那些东西翻译成函数
ctrl+s看见系统所有的模块
ctrl+f搜索
单步调试注意右上角,寄存器变蓝色表示被改了
在hex view-1按F2可以修改机器码,再次按F2确定修改
f4移动到光标处
在寄存器窗口按E可以修改寄存器的值
在内存窗口f2可以修改内存的值