본문으로 바로가기

Level10 분석 (공유 메모리)

category Security/리버싱 2017. 12. 1. 21:38

ftz.hackershool.org의 이미지를 받아 실습했습니다. 


- Level10

level10 / interesting to hack!


[level10@ftz level10]$ ls -l

 

 합계 16

-rw-r-----    1 root     level10       253  1월 14  2010 hint

drwxr-x---    2 root     root         4096  3월 29  2003 program

drwxr-xr-x    2 root     level10      4096  2월 24  2002 public_html

drwxrwxr-x    2 root     level10      4096 12월  1 20:51 tmp

 

> program 디렉토리에 접근 할 수 있는 사용자가 root 사용자 뿐이다. 

> root 사용자를 이용해서 접근해보았다. 


[root@ftz program]# file level10

 

 level10: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped


 


[root@ftz program]# gdb level10

 

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) disas main

Dump of assembler code for function main:

0x08048470 <main+0>:    push   %ebp

0x08048471 <main+1>:    mov    %esp,%ebp

0x08048473 <main+3>:    sub    $0x8,%esp

0x08048476 <main+6>:    sub    $0x4,%esp

0x08048479 <main+9>:    push   $0x3b6

0x0804847e <main+14>:   push   $0x404

0x08048483 <main+19>:   push   $0x1d6a

0x08048488 <main+24>:   call   0x804832c <shmget>

0x0804848d <main+29>:   add    $0x10,%esp

0x08048490 <main+32>:   mov    %eax,%eax

0x08048492 <main+34>:   mov    %eax,0x80496d0

0x08048497 <main+39>:   sub    $0x4,%esp

0x0804849a <main+42>:   push   $0x0

0x0804849c <main+44>:   push   $0x0

0x0804849e <main+46>:   pushl  0x80496d0

0x080484a4 <main+52>:   call   0x804834c <shmat>

0x080484a9 <main+57>:   add    $0x10,%esp

0x080484ac <main+60>:   mov    %eax,0x80496cc

0x080484b1 <main+65>:   sub    $0x8,%esp

0x080484b4 <main+68>:   push   $0x8048560

0x080484b9 <main+73>:   pushl  0x80496cc

0x080484bf <main+79>:   call   0x804835c <strcpy>

---Type <return> to continue, or q <return> to quit---

0x080484c4 <main+84>:   add    $0x10,%esp

0x080484c7 <main+87>:   leave

0x080484c8 <main+88>:   ret

0x080484c9 <main+89>:   lea    0x0(%esi),%esi

0x080484cc <main+92>:   nop

0x080484cd <main+93>:   nop

0x080484ce <main+94>:   nop

0x080484cf <main+95>:   nop

End of assembler dump.


 

> level11 암호를 얻기위해 작성한 코드와 같은 함수들이 사용되었다. 



 

 0x08048479 <main+9>:    push   $0x3b6          OCT(666)

0x0804847e <main+14>:   push   $0x404           DEC(1028)

0x08048483 <main+19>:   push   $0x1d6a         DEC(7530)

0x08048488 <main+24>:   call   0x804832c <shmget>

x0804848d <main+29>:   add    $0x10,%esp

0x08048490 <main+32>:   mov    %eax,%eax

0x08048492 <main+34>:   mov    %eax,0x80496d0


(gdb) x/s 0x80496d0
0x80496d0 <shmid>:       ""

 


int shmget(key_t key, int size, int shmflg);

>key -> 7530    size -> 1028    shmflg -> 666

>반환된 ID는 shmid 에 저장된다. 


 

0x0804849a <main+42>:   push   $0x0

0x0804849c <main+44>:   push   $0x0

0x0804849e <main+46>:   pushl  0x80496d0

0x080484a4 <main+52>:   call   0x804834c <shmat>

0x080484a9 <main+57>:   add    $0x10,%esp

0x080484ac <main+60>:   mov    %eax,0x80496cc



(gdb) x/x 0x80496d0

0x80496d0 <shmid>:      0x00000000

(gdb) x/x 0x80496cc

0x80496cc <text>:       0x00000000

 


void *shmat(int shmid, const void *shmaddr, int shmflg

> shmget에서 리턴받은 shmid를 받아서 넣어준다. 나머지 인자는 0 

( 프로그램이 실행되지 않았으므로 shmid 값은 0으로 나온다. )

>  text로 연결 된 것 같다. 


 

0x080484b4 <main+68>:   push   $0x8048560

0x080484b9 <main+73>:   pushl  0x80496cc

0x080484bf <main+79>:   call   0x804835c <strcpy>


(gdb) x/x 0x80496cc

0x80496cc <text>:       0x00000000

(gdb) x/s 0x8048560

0x8048560 <_IO_stdin_used+28>:   "멍멍: level11의 패스워드는?\n구타: what!@#$?\n"

 


char * strcpy( char *dest, const char *src);

> 메모리로 연결된 text 에 다음과 같은 글을 복사한다. 


- 의사코드 


 

#include <sys/ipc.h>

#include <sys/shm.h>

#include <string.h>


int main()

{

      int shmid;

      char *text;


      shmid = shmget(7530,1028,666);

  text = shmat(shmid,0,0);

  strcpy(text,"멍멍: level11의 패스워드는?\n구타: what!@#$?\n");

}

 

> 정상적으로 잘 동작한다. 

> 메모리를 사용하면 shmdt()를 통해 메모리를 반환해야 하지만 문제를 풀기 위해서는 계속 있어야 하기 때문에 적지 않은 거 같다.

( 실제 사용하려면 반환해야 한다. )


[참고] 

shmid = shmget((ket_t)7530, 1038, 0666 | IPC_CREATE);

text = shmat(shmid, (void *)0, 0); 

> 결국 같은 의미 ( 그냥 숫자를 넣어도 똑같다. )