#include <string.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> int main(int argc, char *argv[]) { struct sockaddr_in toaddr; /* 0x3c */ int sendstat; /* 0x38 */ int sock; /* 0x34 */ struct hostent *hent; /* 0x30 */ char *buf; /* 0x2c */ FILE *fp; /* 0x28 */ int fsize; /* 0x24 */ fp = fopen("/etc/behemoth_pass/behemoth6", "r"); if (fp == NULL) { perror("fopen"); exit(1); } fseek(fp, 0, SEEK_END); fsize = ftell(fp) + 1; rewind(fp); buf = (char *)malloc(fsize); fgets(buf, fsize, fp); buf[strlen(buf)] = '\0'; /* ? need ? */ fclose(fp); hent = gethostbyname("localhost"); if (hent == NULL) { perror("gethostbyname"); exit(1); } sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sock == -1) { perror("socket"); exit(1); } toaddr.sin_port = htons(atoi("1337")); /* mov 0x30(%esp),%eax ;eax = hent mov 0x10(%eax),%eax ;eax = hent->h_addr_list mov (%eax),%eax ;eax = hent->h_addr_list[0] ;it's a point. the memory value it point to is \x7f\x00\x00\x01 mov (%eax),%eax ;eax = 0x0100007f (little endian) mov %eax,0x40(%esp) ;0x40(%esp) = toaddr.sin_addr.s_addr */ toaddr.sin_addr.s_addr = *(unsigned long *)hent->h_addr_list[0]; memset(toaddr.sin_zero, 0, 8); sendstat = sendto(sock, buf, strlen(buf), 0 , (const struct sockaddr *)&toaddr, 16); if (sendstat == -1) { perror("sendto"); exit(1); } close(sock); exit(0); }
/** ser.c */ #include <stdio.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define BUFSZ 200 int port = 1337; int main(int argc, char *argv[]) { char buf[BUFSZ]; int rc; int fd = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(port); if (bind(fd, (struct sockaddr*)&sin, sizeof(sin)) == -1) { printf("bind: %s\n", strerror(errno)); exit(-1); } do { rc = read(fd,buf,BUFSZ); if (rc==-1) printf("read: %s\n", strerror(errno)); else printf("received %d bytes: %.*s\n", rc, rc, buf); } while (rc >= 0); return 0; }
栈环境
root@today:~# ssh [email protected] [email protected]'s password: aizeeshing behemoth5@melinda:~$ cd /tmp/shui5 behemoth5@melinda:/tmp/shui5$ ls ser ser.c sleep.sh behemoth5@melinda:/tmp/shui5$ gcc ser.c -o ser -m32 behemoth5@melinda:/tmp/shui5$ ./ser & [1] 20089 behemoth5@melinda:/tmp/shui5$ bind: Address already in use [1]+ Exit 255 ./ser behemoth5@melinda:/tmp/shui5$ netstat -ulnp | grep 1337 udp 0 0 0.0.0.0:1337 0.0.0.0:* 19686/ser behemoth5@melinda:/tmp/shui5$ kill 19686 behemoth5@melinda:/tmp/shui5$ ./ser & [1] 20154 behemoth5@melinda:/tmp/shui5$ /behemoth/behemoth5 received 11 bytes: mayiroeche behemoth5@melinda:/tmp/shui5$
┌─────────────────────────────────────────────────────────────────────────────────┐ │0x804873d <main> push %ebp │ │0x804873e <main+1> mov %esp,%ebp │ │0x8048740 <main+3> and $0xfffffff0,%esp │ │0x8048743 <main+6> sub $0x50,%esp │ │0x8048746 <main+9> mov 0xc(%ebp),%eax │ │0x8048749 <main+12> mov %eax,0x1c(%esp) │ │0x804874d <main+16> mov %gs:0x14,%eax │ │0x8048753 <main+22> mov %eax,0x4c(%esp) │ │0x8048757 <main+26> xor %eax,%eax │ │0x8048759 <main+28> movl $0x0,0x24(%esp) │ │0x8048761 <main+36> movl $0x80489f0,0x4(%esp) │ │0x8048769 <main+44> movl $0x80489f2,(%esp) │ │0x8048770 <main+51> call 0x80485d0 <fopen@plt> │ │0x8048775 <main+56> mov %eax,0x28(%esp) │ │0x8048779 <main+60> cmpl $0x0,0x28(%esp) │ │0x804877e <main+65> jne 0x8048798 <main+91> │ │0x8048780 <main+67> movl $0x8048a0f,(%esp) │ │0x8048787 <main+74> call 0x8048560 <perror@plt> │ │0x804878c <main+79> movl $0x1,(%esp) │ │0x8048793 <main+86> call 0x8048590 <exit@plt> │ │0x8048798 <main+91> movl $0x2,0x8(%esp) │ │0x80487a0 <main+99> movl $0x0,0x4(%esp) │ │0x80487a8 <main+107> mov 0x28(%esp),%eax │ │0x80487ac <main+111> mov %eax,(%esp) │ │0x80487af <main+114> call 0x8048550 <fseek@plt> │ │0x80487b4 <main+119> mov 0x28(%esp),%eax │ │0x80487b8 <main+123> mov %eax,(%esp) │ │0x80487bb <main+126> call 0x80485c0 <ftell@plt> │ │0x80487c0 <main+131> mov %eax,0x24(%esp) │ │0x80487c4 <main+135> addl $0x1,0x24(%esp) │ │0x80487c9 <main+140> mov 0x28(%esp),%eax │ │0x80487cd <main+144> mov %eax,(%esp) │ │0x80487d0 <main+147> call 0x8048530 <rewind@plt> │ └─────────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────────┐ │0x80487d5 <main+152> mov 0x24(%esp),%eax │ │0x80487d9 <main+156> mov %eax,(%esp) │ │0x80487dc <main+159> call 0x8048570 <malloc@plt> │ │0x80487e1 <main+164> mov %eax,0x2c(%esp) │ │0x80487e5 <main+168> mov 0x28(%esp),%eax │ │0x80487e9 <main+172> mov %eax,0x8(%esp) │ │0x80487ed <main+176> mov 0x24(%esp),%eax │ │0x80487f1 <main+180> mov %eax,0x4(%esp) │ │0x80487f5 <main+184> mov 0x2c(%esp),%eax │ │0x80487f9 <main+188> mov %eax,(%esp) │ │0x80487fc <main+191> call 0x8048510 <fgets@plt> │ │0x8048801 <main+196> mov 0x2c(%esp),%eax │ │0x8048805 <main+200> mov %eax,(%esp) │ │0x8048808 <main+203> call 0x80485a0 <strlen@plt> │ │0x804880d <main+208> mov 0x2c(%esp),%edx │ │0x8048811 <main+212> add %edx,%eax │ │0x8048813 <main+214> movb $0x0,(%eax) │ │0x8048816 <main+217> mov 0x28(%esp),%eax │ │0x804881a <main+221> mov %eax,(%esp) │ │0x804881d <main+224> call 0x8048520 <fclose@plt> │ │0x8048822 <main+229> movl $0x8048a15,(%esp) │ │0x8048829 <main+236> call 0x8048620 <gethostbyname@plt> │ │0x804882e <main+241> mov %eax,0x30(%esp) │ │0x8048832 <main+245> cmpl $0x0,0x30(%esp) │ │0x8048837 <main+250> jne 0x8048851 <main+276> │ │0x8048839 <main+252> movl $0x8048a1f,(%esp) │ │0x8048840 <main+259> call 0x8048560 <perror@plt> │ │0x8048845 <main+264> movl $0x1,(%esp) │ │0x804884c <main+271> call 0x8048590 <exit@plt> │ │0x8048851 <main+276> movl $0x0,0x8(%esp) │ │0x8048859 <main+284> movl $0x2,0x4(%esp) │ │0x8048861 <main+292> movl $0x2,(%esp) │ │0x8048868 <main+299> call 0x8048610 <socket@plt> │ └─────────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────────┐ │0x804886d <main+304> mov %eax,0x34(%esp) │ │0x8048871 <main+308> cmpl $0xffffffff,0x34(%esp) │ │0x8048876 <main+313> jne 0x8048890 <main+339> │ │0x8048878 <main+315> movl $0x8048a2d,(%esp) │ │0x804887f <main+322> call 0x8048560 <perror@plt> │ │0x8048884 <main+327> movl $0x1,(%esp) │ │0x804888b <main+334> call 0x8048590 <exit@plt> │ │0x8048890 <main+339> movw $0x2,0x3c(%esp) │ │0x8048897 <main+346> movl $0x8048a34,(%esp) │ │0x804889e <main+353> call 0x8048600 <atoi@plt> │ │0x80488a3 <main+358> movzwl %ax,%eax │ │0x80488a6 <main+361> mov %eax,(%esp) │ │0x80488a9 <main+364> call 0x8048540 <htons@plt> │ │0x80488ae <main+369> mov %ax,0x3e(%esp) │ │0x80488b3 <main+374> mov 0x30(%esp),%eax │ │0x80488b7 <main+378> mov 0x10(%eax),%eax │ │0x80488ba <main+381> mov (%eax),%eax │ │0x80488bc <main+383> mov (%eax),%eax │ │0x80488be <main+385> mov %eax,0x40(%esp) │ │0x80488c2 <main+389> movl $0x8,0x8(%esp) │ │0x80488ca <main+397> movl $0x0,0x4(%esp) │ │0x80488d2 <main+405> lea 0x3c(%esp),%eax │ │0x80488d6 <main+409> add $0x8,%eax │ │0x80488d9 <main+412> mov %eax,(%esp) │ │0x80488dc <main+415> call 0x80485e0 <memset@plt> │ │0x80488e1 <main+420> mov 0x2c(%esp),%eax │ │0x80488e5 <main+424> mov %eax,(%esp) │ │0x80488e8 <main+427> call 0x80485a0 <strlen@plt> │ │0x80488ed <main+432> movl $0x10,0x14(%esp) │ │0x80488f5 <main+440> lea 0x3c(%esp),%edx │ │0x80488f9 <main+444> mov %edx,0x10(%esp) │ │0x80488fd <main+448> movl $0x0,0xc(%esp) │ │0x8048905 <main+456> mov %eax,0x8(%esp) │ └─────────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────────┐ │0x8048909 <main+460> mov 0x2c(%esp),%eax │ │0x804890d <main+464> mov %eax,0x4(%esp) │ │0x8048911 <main+468> mov 0x34(%esp),%eax │ │0x8048915 <main+472> mov %eax,(%esp) │ │0x8048918 <main+475> call 0x80485f0 <sendto@plt> │ │0x804891d <main+480> mov %eax,0x38(%esp) │ │0x8048921 <main+484> cmpl $0xffffffff,0x38(%esp) │ │0x8048926 <main+489> jne 0x8048940 <main+515> │ │0x8048928 <main+491> movl $0x8048a39,(%esp) │ │0x804892f <main+498> call 0x8048560 <perror@plt> │ │0x8048934 <main+503> movl $0x1,(%esp) │ │0x804893b <main+510> call 0x8048590 <exit@plt> │ │0x8048940 <main+515> mov 0x34(%esp),%eax │ │0x8048944 <main+519> mov %eax,(%esp) │ │0x8048947 <main+522> call 0x8048630 <close@plt> │ │0x804894c <main+527> movl $0x0,(%esp) │ │0x8048953 <main+534> call 0x8048590 <exit@plt> │ └─────────────────────────────────────────────────────────────────────────────────┘