what is double fsb
일반적인 FSB는 우리가 입력한 값이 스택에 존재할 때, 그 값을 주소로 써서 %n으로 덮어쓴다. 하지만 더블 FSB는 내가 입력한 값이 스택에 직접 들어가지 않거나, 스택에 내가 원하는 주소가 없을 때 **스택에 이미 존재하는 포인터의 포인터(연쇄적인 포인터)**를 이용하는 기법이다.
예를 들어 스택이 다음과 같은 흔하게 있을때
C
4e:0270│+080 0x7fffffffed60 ◂— 0x493d6b32dfefe03f
4f:0278│+088 0x7fffffffed68 ◂— 0x493d7b7225a1e03f
50:0280│+090 0x7fffffffed70 ◂— 0
... ↓ 2 skipped
53:0298│+0a8 0x7fffffffed88 ◂— 1
54:02a0│+0b0 0x7fffffffed90 —▸ 0x7fffffffedf8 —▸ 0x7fffffffefb8 ◂— 0x4c00626f72702f2e /* './prob' */
55:02a8│+0b8 0x7fffffffed98 —▸ 0x7fffffffee08 —▸ 0x7fffffffefbf ◂— 'LD_PRELOAD=./libc.so.6'
56:02b0│+0c0 0x7fffffffeda0 —▸ 0x7ffff7ffe190 —▸ 0x555555554000 ◂— 0x10102464c457f
57:02b8│+0c8 0x7fffffffeda8 ◂— 0
58:02c0│+0d0 0x7fffffffedb0 ◂— 0
59:02c8│+0d8 0x7fffffffedb8 —▸ 0x555555555480 ◂— endbr64
5a:02d0│+0e0 0x7fffffffedc0 —▸ 0x7fffffffedf0 ◂— 1
5b:02d8│+0e8 0x7fffffffedc8 ◂— 0
5c:02e0│+0f0 0x7fffffffedd0 ◂— 0
다음과 같은 스택 값안에 다른 스택을 가리키고 있는 포인터가 있는 경우가 많다.
C
54:02a0│+0b0 0x7fffffffed90 —▸ 0x7fffffffedf8 —▸ 0x7fffffffefb8 ◂— 0x4c00626f72702f2e /* './prob' */
0x7fffffffedf8 기준으로 본다면 이렇게 되어 있는 구조인 것이다.
C
61:0308│+118 0x7fffffffedf8 —▸ 0x7fffffffefb8 ◂— 0x4c00626f72702f2e /* './prob' */
따라서 일반적인 fsb로 바로는 공격이 안될때 fsb로 스택 포인터값을 변조시키면 0x7fffffffedf8 이 위치에 값을 변조 시킬 수 있다. ( 원래 fsb가 스택에 주소값이 들어가 있는 거니깐 )
0x7fffffffedf8 위치에 존재하는 값은 위에서도 알았듯이 어떤곳을 가르기큰 포인터이다.
따라서 0x7fffffffedf8 위치에 존재하는 값을 1씩 바꾸고 바뀐 값으로 해당 스택에 있는 값을 또 참조해서 바꾸면 즉 3번째 가리키는 부분에 값을 ( 기존 0x4c00626f72702f2e 값이 들어가 있던 스택 ) 우리가 원하는 주소 ( aaw 하고 싶은 주소 )로 만들 수 있다. 이제 해당 값을 써넣은 스택으로 접근을 해 fsb를 하면 원하는 주소에 aaw를 할 수 있는 double fsb가 가능해진다.
한번에 8바이트가 안되므로 1바이트 혹은 2바이트씩 나눠서 넣는다.