返回信息流目前使用ida分析一个linux下的程序,初学中感觉很难。。。
中文资料除了看雪论坛有一点(不系统,看了不知所云),根本找不到中文资料。
时间紧迫,看英文已然来不及。。。
求大牛讲讲经验,谢谢!
这是一条镜像帖。来源:北邮人论坛 / security / #35489同步于 2012/11/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
请问逆向工程的大牛,ida入门资料
ymc252669096
2012/11/19镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
附件是待分析文件。
一共两个文件,运行前需要setuid。
然后在linux终端下运行(我是debian): ./target model.dat
结果是输出一句英文。
我贴一段运行演示:
user@sandbox:~/project2$ ./target model.dat
Sorry, ./target must be setuid root.
user@sandbox:~/project2$ sudo chown root:root target
user@sandbox:~/project2$ sudo chmod u+s target
user@sandbox:~/project2$ ./target model.dat
But if you need to convince an enemy to work with you, it's a good idea to make use of all costs.
要求:1.写一个文档说明此程序流程图。 2.自己写一个sploit.dat代替原来的model.dat,运行后能从user权限变为root权限。
我搞了将近一周了,还是不会。。。很沮丧,很慌张,希望大牛能给一点提示,谢谢啦。
非大牛,希望能够提供一些帮助。
1、IDA 5.5以上的版本有一个叫Hex-Rays的插件,可以对程序和函数进行“反编译”,帮助更加容易的读懂程序代码;
2、IDA中的String窗口能够帮助你发现一些可能有用的字符串;
3、在一些位置的数字可以通过转换成字符(按R键)帮助你读懂程序;
通过以上三条可以生成target的主体代码部分
————————————————————————
signed int __cdecl sub_80487C0(int a1, int a2)
{
signed int result; // eax@3
int v3; // esi@5
int v4; // edi@6
int v5; // eax@7
size_t v6; // ebx@7
__pid_t v7; // eax@10
int v8; // [sp+1Ch] [bp-1074h]@6
__int16 v9; // [sp+2Eh] [bp-1062h]@7
char v10[20]; // [sp+102Eh] [bp-62h]@6
signed int v11; // [sp+1032h] [bp-5Eh]@6
signed int v12; // [sp+1036h] [bp-5Ah]@6
signed int v13; // [sp+103Ah] [bp-56h]@6
signed int v14; // [sp+103Eh] [bp-52h]@6
char v15; // [sp+1042h] [bp-4Eh]@6
char v16[20]; // [sp+1043h] [bp-4Dh]@5
signed int v17; // [sp+1047h] [bp-49h]@5
signed int v18; // [sp+104Bh] [bp-45h]@5
signed int v19; // [sp+104Fh] [bp-41h]@5
signed int v20; // [sp+1053h] [bp-3Dh]@5
char v21; // [sp+1057h] [bp-39h]@5
char *v22; // [sp+1058h] [bp-38h]@12
char *v23; // [sp+105Ch] [bp-34h]@12
char *v24; // [sp+1060h] [bp-30h]@12
int v25; // [sp+1064h] [bp-2Ch]@12
char v26; // [sp+1068h] [bp-28h]@12
char v27; // [sp+1069h] [bp-27h]@12
char v28; // [sp+106Ah] [bp-26h]@12
char v29; // [sp+106Bh] [bp-25h]@12
char v30; // [sp+106Ch] [bp-24h]@12
char v31; // [sp+106Dh] [bp-23h]@12
char v32; // [sp+106Eh] [bp-22h]@12
char v33; // [sp+106Fh] [bp-21h]@12
char v34; // [sp+1070h] [bp-20h]@12
char v35; // [sp+1071h] [bp-1Fh]@12
char v36; // [sp+1072h] [bp-1Eh]@12
char v37; // [sp+1073h] [bp-1Dh]@12
char v38; // [sp+1074h] [bp-1Ch]@12
char v39; // [sp+1075h] [bp-1Bh]@12
char v40; // [sp+1076h] [bp-1Ah]@12
char v41; // [sp+1077h] [bp-19h]@12
int v42; // [sp+1078h] [bp-18h]@12
int v43; // [sp+107Ch] [bp-14h]@15
if ( geteuid() )
{
fprintf(stderr, "Sorry, %s must be setuid root.\n", *(_DWORD *)a2);
result = 1;
}
else if ( a1 == 2 )
{
*(_DWORD *)v16 = 'pmt/';
v17 = 'led/';
v18 = 'mete';
v19 = 'XX.e';
v20 = 'XXXX';
v21 = 0;
v3 = mkstemp(v16);
if ( v3 == -1 )
__assert_fail("fd != -1", "target.c", 0x1Eu, "main");
sub_8048720((int)&unk_8049160, n);
write(v3, &unk_8049160, n);
close(v3);
*(_DWORD *)v10 = 'pmt/';
v11 = 'led/';
v12 = 'mete';
v13 = 'XX.e';
v14 = 'XXXX';
v15 = 0;
v8 = mkstemp(v10);
v4 = open(*(const char **)(a2 + 4), 0);
if ( v4 == -1 )
__assert_fail("in != -1", "target.c", 0x26u, "main");
do
{
v5 = read(v4, &v9, 0x1000u);
v6 = v5;
if ( v5 < 0 )
__assert_fail("size >= 0", "target.c", ',', "main");
sub_8048720((int)&v9, v5);
if ( v6 != write(v8, &v9, v6) )
__assert_fail("size == wsize", "target.c", '/', "main");
}
while ( v6 == 4096 );
close(v8);
close(v4);
v7 = fork();
if ( v7 == -1 )
{
remove(v16);
perror("fork");
result = 1;
}
else
{
if ( !v7 )
{
v26 = 'u';
v27 = '/';
v28 = ')';
v29 = '(';
v30 = 'u';
v31 = '8';
v32 = '3';
v33 = '4';
v34 = 'u';
v35 = '*';
v36 = '#';
v37 = '.';
v38 = '2';
v39 = '5';
v40 = '4';
v41 = 'Z';
sub_8048720((int)&v26, 16);
v23 = v16;
v22 = &v26;
v24 = v10;
v25 = 0;
v42 = 0;
setuid(0);
execve(&v26, &v22, (char *const *)&v42);
_exit(1);
}
waitpid(v7, &v43, 0);
remove(v16);
result = 0;
}
}
else
{
fprintf(stderr, "Usage: %s model.dat\n", *(_DWORD *)a2);
result = 1;
}
return result;
}
——————————————————————————
4、纯静态的使用IDA进行分析,可能不能快速的看懂程序的逻辑和调用结构,这是可以借助调试器动态的查看到底程序进行了什么操作。
5、如果想学习使用IDA,推荐一本《IDA Pro权威指南》,中文,各处网上书店有售。
6、(默默的喝了一口可乐),学妹(弟),我只能帮你到这了!
希望对你有所帮助。
谢谢你的回复!
我使用的ida 5.0 pro free版本,不能用盗版。。。哎
整个程序的流程我分析出来了,正如你的c代码一样(要是我能早一点看到你的帖子就好了。。。呜呜)
但是中间有一小段汇编我实在看不出来想干嘛,很着急。。。
【 在 RedOcean 的大作中提到: 】
: 非大牛,希望能够提供一些帮助。
: 1、IDA 5.5以上的版本有一个叫Hex-Rays的插件,可以对程序和函数进行“反编译”,帮助更加容易的读懂程序代码;
: 2、IDA中的String窗口能够帮助你发现一些可能有用的字符串;
: ...................
请问可以用什么方法查看model.dat呢?我试过notepad,或者用ida反汇编,都是乱码。。。dat不是标准后缀,请问您有木有好的办法?谢谢!
【 在 CX3201 的大作中提到: 】
interesting_func:
add esi, 1
sub ebx, 1
xor byte ptr [ecx], 5ah
add ecx, 1
cmp edx, esi
ja short interesting_func
看不懂的汇编代码中包含这个函数,我把他rename成interesting_func。
我看上去感觉像把一个字符数组中的每个byte都和5ah异或。但是这样做的目的是什么呢?
请问红海大牛指教!谢谢!
【 在 RedOcean 的大作中提到: 】
: 非大牛,希望能够提供一些帮助。
: 1、IDA 5.5以上的版本有一个叫Hex-Rays的插件,可以对程序和函数进行“反编译”,帮助更加容易的读懂程序代码;
: 2、IDA中的String窗口能够帮助你发现一些可能有用的字符串;
: ...................
红海牛,接着上面:它在调用刚才那个函数后,又调用了下列函数(shift是我自己命的名)
shift:
sub edi, edx
mov esi, edi
shr esi, 2
mov [ebp+var_10], edi
lea edi, [esi*4+0]
test edi, edi
jz short loc_804878
esi右移2,应该是除以4吧?这个函数又用来干嘛呢?
然后我彻底懵了:shift函数完了之后,又调用了下列函数。
interesting_func3:
xor dword ptr [eax+edx*4], 5a5a5a5ah
add edx, 1
cmp edx, esi
jb short interesting_func3
这次是双字异或,目的是什么呢?两次异或不就回去了吗?是因为想压缩吗(乱猜的)?5a是字符‘Z’的asc码,是不是和这个有关系呢?
【 在 RedOcean 的大作中提到: 】
: 非大牛,希望能够提供一些帮助。
: 1、IDA 5.5以上的版本有一个叫Hex-Rays的插件,可以对程序和函数进行“反编译”,帮助更加容易的读懂程序代码;
: 2、IDA中的String窗口能够帮助你发现一些可能有用的字符串;
: ...................