본문 바로가기

fflush() 이용한 libc leak, 그 외

@eouya22025. 9. 11. 14:00

 

이번에도 마찬가지로 문제 풀다가 새로 알게된 내용에 대한 포스팅이다.

 

fflush()를 이용한 libc leak

fflush(stdout)같은 코드가 있다고 하자. 여기서 stdout 구조체를 수정하여 값을 leak이 가능하다. 과정을 요약해보면 다음과 같다.

 

fflush(fp) -> _IO_SYNC(fp) -> _IO_do_flush(fp) -> _IO_do_write -> new_do_write -> _IO_SYSWRITE

 

도달하기 위한 조건

1. fp -> _IO_write_ptr > fp -> _IO_write_base

2. fp -> _IO_read_end == fp -> _IO_write_base

 

leak을 위해서는 _IO_write_ptr = _IO_write_base + 8 이어야 하고, _IO_write_ptr 에 libc영역의 주소(got)가 들어간다면, fflush(stdout) 호출시 libc base 주소를 알아낼 수 있다.

 

이번 문제에서는 write, puts같은 출력 함수가 전혀 없어서 fflush(stdout)으로 leak 해야 했는데, stdout을 어떻게 조작해야 할지 몰랐다. 이번에 알게된 것은 fflush()같은 함수를 사용하게 되면 stdin, stdout이 bss영역에 위치하게 되는데, 임의 주소 쓰기 취약점이 있다면 bss영역에 stdout, stdin 사이의 빈공간에 가젯을 넣고, stack pivoting을 통해 ROP를 진행할 수 있는 것을 새로 알게 되었다.

 

사진에서 볼 수 있듯 stdout과 stdin 사이와 앞뒤에 필요없는 공간이 존재한다.

위 모습 기준으로 0x601018에 pop rsi를 넣고, stdout위치인 0x601020이후인 0x601028부터 가젯을 추가로 넣어 read를 호출하는 ROP chain을 구성한 다음, pivoting을 통해 0x601018으로 흐름을 옮긴다면 stdout 구조체를 직접 조작할 수 있는 ROP가 동작하게 된다. 이를 통해 libc를 유출하거나 FSOP 공격도 가능해진다.

    pl2 += b'A'*8
    pl2 += p64(0x601010) #rbp
    pl2 += p64(poprdi) + p64(0)
    pl2 += p64(poprsi) + p64(0x601018)
    pl2 += p64(poprdx) + p64(8)
    pl2 += p64(read_plt) #poprsi

    pl2 += p64(poprdi) + p64(0)
    pl2 += p64(poprsi) + p64(0x601028)
    pl2 += p64(poprdx) + p64(8)
    pl2 += p64(read_plt) #popr15
    
    pl2 += p64(poprdi) + p64(0)
    pl2 += p64(poprsi) + p64(0x601038)
    pl2 += p64(poprdx) + p64(len(nextROP)) #poprdi~
    pl2 += p64(read_plt)
    
    pl2 += p64(leaveret)

main에서 bss영역에 가짜 ROP체인을 구성 이후 pivot하는 예시이다.

stdin을 덮긴 좀 그래서 stdin 직전에 pop r15가젯을 넣어 사용하지 않는 레지스터에 넣고 체인을 이어간다.

 

문제 풀면서 막혔던 점이 하나 있는데, fflush 이후 스택이 계속 자라나며 0x601000보다 낮은 주소까지 자라서 쓰기 불가능한 영역까지 간다는 것이었다. 때문에 이후 fflush(libc leak)이후의 ROP에서 pivot 주소를 bss 초반 부분이 아닌 더 여유있게 설정하고 풀 수 있었다.

 

1/4096 브루트포스나 원가젯 브루트포스, libc 주소의 1byte를 overwrite하여 syscall로 바꾼다거나 하는 다양한 방법의 풀이가 있는데 구글링 능력 부족으로.. 정보를 얻기가 참 힘들다ㅠ

eouya2
@eouya2 :: eouya2

개인공부 기록 / 틀린거 있으면 돌팔매질 부탁드립니다

목차