21.03.2013 Views

Problem - Kevin Tafuro

Problem - Kevin Tafuro

Problem - Kevin Tafuro

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

phsz = *(unsigned short *) &buf[ELF_PHESZ_OFFSET];<br />

phdr = &buf[phoff];<br />

/* iterate through program headers */<br />

for ( i = 0; i < phnum; i++, phdr += phsz ) {<br />

p_vaddr = *(unsigned long *)&phdr[ELF_PH_VADDR_OFF];<br />

p_filesz = *(unsigned long *)&phdr[ELF_PH_FILESZ_OFF];<br />

/* if entry point is in this program segment */<br />

if ( entry >= p_vaddr && entry < (p_vaddr + p_filesz) ) {<br />

/* calculate offset of entry point */<br />

p_offset = *(unsigned long *)&phdr[ELF_PH_OFFSET_OFF];<br />

return( p_offset + (entry - p_vaddr) );<br />

}<br />

}<br />

return 0;<br />

}<br />

int main(int argc, char *argv[ ]) {<br />

unsigned long entry, offset, len, key_offset, key_len;<br />

unsigned char *buf;<br />

struct stat sb;<br />

int fd;<br />

if (argc < 6) {<br />

printf("Usage: %s filename offset len key_offset key_len\n"<br />

" filename: file to encrypt\n"<br />

" offset: offset in file to start encryption\n"<br />

" len: number of bytes to encrypt\n"<br />

" key_offset: offset in file of key\n"<br />

" key_len: number of bytes in key\n"<br />

" Values are converted with strtol with base 0\n",<br />

argv[0]);<br />

return 1;<br />

}<br />

/* prepare the parameters */<br />

offset = strtoul(argv[2], 0, 0);<br />

len = strtoul(argv[3], 0, 0);<br />

key_offset = strtoul(argv[4], 0, 0);<br />

key_len = strtoul(argv[5], NULL, 0);<br />

/* memory map the file so we can access it via pointers */<br />

if (stat(argv[1], &sb)) {<br />

fprintf(stderr, "Stat failed: %s\n", strerror(errno));<br />

return 2;<br />

}<br />

if ((fd = open(argv[1], O_RDWR | O_EXCL)) < 0) {<br />

fprintf(stderr, "Open failed: %s\n", strerror(errno));<br />

return 3;<br />

}<br />

buf = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);<br />

if ((int)buf < 0) {<br />

fprintf(stderr, "Open failed: %s\n", strerror(errno));<br />

close(fd);<br />

696 | Chapter 12: Anti-Tampering<br />

This is the Title of the Book, eMatter Edition<br />

Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!