转自:http://bobao.360.cn/learning/detail/3287.html
本不想写这个文章的,只是在评论作者的问题时,提示字数太多,我一再缩减字数,发现还是评论不了,没办法呢只能在此写下问题,评论个连接:
本人在分析时,基本上也是按照原作者的文章来的,只是发下原作者写的有些问题,这里说明下:
==========================================================
按照博主传递的命令,v24确实为1 (代码在下面)
分析了下,这个可以对传入的参数分为两种情况,
一种是xxx.xxx.xxx.xxx/cgi-bin/;command # cgi-bin后面只有一个/
而是xxx.xxx.xxx.xxx/cgi-bin/;command/xxxxxx # cgi-bin后面只有多个/
(其实这两种情况直接结果是一样的,具体看代码)
v19 = strchr(v12, 47);
v20 = v19 + 1; // ;kill
v21 = v19; // /;kill
v22 = strchr(v19 + 1, 47); // v22=0
memset(&v50, 0, 0x40u); // v50init
v23 = (char)v21; //v21第一个/的位置,v22第二个/的位置(如果有)
if ( v21 )
v23 = 1;
v24 = v22 == 0; //v24 = 1
if ( v22 )
v24 = v21 == 0;
if ( v24 )
{// /;kill 走这个流程
//xxx.xxx.xxx.xxx/cgi-bin/;kill
if ( v22 )
v25 = 0;
else
v25 = v23 & 1;
if ( v25 )
strcpy((char *)&v50, v20);
}
else
{
// /;kill/xxxxxxx走这个流程, 下面这个拷贝命令目的是取 两个/之间的字符串
// xxx.xxx.xxx.xxx/cgi-bin/;ls/xxxxxx 和 xxx.xxx.xxx.xxx/cgi-bin/;ls 效果是一样的,前面一种/后的xxxxxx会被忽略
strncpy((char *)&v50, v20, v22 - 1 - v21);// v50=;kill
if ( acosNvramConfig_match((int)&unk_F0378, (int)"2") )
printf("\r\n#############tmp1=%s,tmp2=%s,tmp3=%s,cgi=%s\r\n", v12, v21, v22, &v50);
v15 = &v46;
strcpy((char *)&v46, v22);
if ( acosNvramConfig_match((int)&unk_F0378, (int)"2") )
{
v16 = "\r\n###############%s(%d)path_info=%s\r\n";
v17 = 110;
v18 = "netgear_commonCgi";
goto LABEL_34;
}
}
测试结果: