leak register with printf
이글과 이어질 수 있다.
일반적으로 레지스터의 값을 바로 leak 할 수는 없다. 하지만 가능한 경우가 있는데 바로
printf문이다. 웬만해서는 모두 주소로 접근을 하지만, printf문을 어셈블리어로 보면
printf("memory[%d]: ", v5);
Bash
.text:000000000040085C mov eax, [rbp+var_20]
.text:000000000040085F mov esi, eax
.text:0000000000400861 lea rdi, aMemoryD ; "memory[%d]: "
.text:0000000000400868 mov eax, 0
.text:000000000040086D call _printf다음과 같이 실제 스택에 있는 값을 레지스터로 가져온뒤 printf 함수를 실행한다
따라서 저기서 rsi 레지스터나 rax 레지스터의 값을 직접 출력시킬 수 있다.
앞선 글과 접목시키면 setbuf 함수에서 주로 rax나 rdi에 stdout, stdin 등 libc 주소를 담기 때문에 이를 이것과 접목시키면 libc leak 을 할 수 있다.