ida远程调试linux程序

前言

在分析二进制程序时,经常需要借助动态调试的方法,在linux中我们通常使用gdb来进行动态调试,但是gdb使用方法较复杂,对新手不友好,而ida具有很好的图形化界面,使用ida对linux程序进行远程动态调试在这种情况下是一种不错的选择。

ida远程调试配置

1.要配置ida远程调试,首先需要将ida安装目录dbgsrv中的linux_server、linux_server64(根据所调试程序是32还是64位)拷贝至linux机器中。赋予其可执行权限,并运行对应版本的linux_server。

2.将需要调试程序拷贝两份,一份放在linux中,赋予其others可执行权限(sudo chmod o+x xxx),另一份放在windows中,使用ida打开,并选择在上方菜单栏选择Debuger->Run->Remote Linux Debugger。

3.在Debugger->process options中配置远程linux机器ip,端口,运行文件路径,以及运行参数等。点击ok,ida自动载入远程程序,ida远程调试的配置就完成了。

ida远程调试

在本文中使用一道pwnable中的简单题目来讲解ida远程调试,先贴题目代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdlib.h>
#include <stdio.h>

int main(){
unsigned int random;
random = rand(); // random value!

unsigned int key=0;
scanf("%d", &key);

if( (key ^ random) == 0xdeadbeef ){
printf("Good!\n");
system("/bin/cat flag");
return 0;
}

printf("Wrong, maybe you should try 2^32 cases.\n");
return 0;
}

本题原意是考察c语言中rand()函数在不使用随机数种子的情况下,默认使用1作为种子,导致每次产生的随机数均为同样的值,只需要将代码重新编译运行print出随机数即可,或者动态调试时候直接查看内存中随机数的值,此处为了介绍ida远程调试,就使用第二种办法。

1.首先我们在刚才的程序中,找到主函数,F5反编译伪代码,F2设置断点,并启动远程调试。

2.打开debugger->debugger windows->watch view监视窗口,添加新变量v5进行观察,或者直接在汇编中,添加eax查看调用rand函数之后的值。

3.F8单步调试,F9单步进入函数,多次按下F8在rand()之后查看v5或rand之后eax的值,计算和0xdeadbeef的异或就是需要输入的key值。在这里得到,随机数为0x6B8B4567,则计算得到key为0xb526fb88,由于需要输入%d格式的key,所以转换成十进制为3039230856。

4.linux中输入计算值,进入分支,获取flag。

fork me on github