using setbuf setvbuf

문제를 풀다보면,

Bash
.text:0000000000400911                 mov     edi, 3Ch ; '<'  ; seconds
.text:0000000000400916                 call    _alarm
.text:000000000040091B                 mov     rax, cs:stdin@@GLIBC_2_2_5
.text:0000000000400922                 mov     esi, 0          ; buf
.text:0000000000400927                 mov     rdi, rax        ; stream
.text:000000000040092A                 call    _setbuf
.text:000000000040092F                 mov     rax, cs:__bss_start
.text:0000000000400936                 mov     esi, 0          ; buf
.text:000000000040093B                 mov     rdi, rax        ; stream
.text:000000000040093E                 call    _setbuf
.text:0000000000400943                 nop
.text:0000000000400944                 leave

다음과 같이 버퍼세팅을 하는 부분이 있다. 과연 이 부분을 사용해도 될까?

정답은 사용해도 된다… 대놓고 사용하라고 하는 문제도 있다. 이 코드에는

Bash
.text:000000000040091B                 mov     rax, cs:stdin@@GLIBC_2_2_5

다음과 같이 실제 libc stdin stdout stderr 와 같은 주소가 레지스터 ( rax , rdi ) 에 들어오게 된다. 일반적으로는 이걸로만은 leak을 할 수는 없겠지만,