본문 바로가기

System Hacking

[드림핵] Return to Library 풀이 - 티스토리

 

 

 

 

 

 

ASLR, NX, Canary 모두 켜져 있다

 

 

1. 코드 분석

 

- buf의 크기가 0x30인데 0x100 크기로 두 번의 입력을 받고 있다 -> 카나리릭과 Overwrite이 가능함

 

- 코드 내에 system함수가 호출되고 있다 -> system의 plt값을 이용해서 재호출 가능 (plt값은 ASLR이 켜져 있어도 안 바뀜)

 

- 코드 내에 "/bin/sh"이 전역 변수로 선언 돼 있다 -> 해당 문자열을 사용가능 (ASLR 기능이 켜져 있어도 코드 영역은 그대로)

 

 

2. 페이로드 시나리오

 

- 첫 번째 입력에서 카나리 릭, 두 번째 입력에서 ret overwrite을 시킨다. 이 때 plt의 system 주소로 overwrite 시켜야 함

 

 

 

3. 페이로드 작성 시 필요한 것들

 

 1) plt에서 system함수의 주소

    -> pwntools에서 e.plt['함수명'] 이용

 2) 코드 내 "/bin/sh"의 주소

    -> gdb에서 search /bin/sh 이용

 3) /bin/sh을 rdi 레지스터에 전달하기 위한 가젯 주소

    ->

ROPgadget --binary (파일명) | grep '(찾을 가젯)'

 

명령어 이용

 

 

 

4. 메모리 구조 분석

 

 

을 토대로 main stack frame 작성

 

 

 

5. 페이로드 

 

 

 1) 아무값 57바이트 -> 카나리 릭

 

 2) 아무값 56바이트 + 카나리 + 아무값 8바이트 + 가젯 (pop(rdi) ret) + "/bin/sh"주소 + system주소

 

 

 

6. 공격

안 돼서 멘탈 나감

 

pwntools gdb도 안돼서 진짜 헤매다가 system함수 특성 고려해야 된다해서 찾아봄 (이걸 어떻게 알아)

 

 

 

설명이 너무 깔끔해서 가져왔다

출처 : https://dookie2.tistory.com/9

 

Memo. RTL (Return to libc)

Return to libc 공격은 버퍼 오버플로 공격 NX bit가 설정되어 있는 경우 이를 우회하기 위해 사용 PIE가 적용되지 않았을 경우. 코드 섹션의 값은 고정이므로 GOT 값을 변경 후 return to plt로 사용 가능. x

dookie2.tistory.com

 

즉 우분투 18.04버전 부터 x64의 경우 16바이트로 stack alignment를 지켜야 한다. 강제는 아니고 자유지만 지킬 시 성능이 좋아진다

근데 movaps 이놈이 그 stack alignment를 강제하는 놈인데  x64에서는 system에 이놈이 추가된다

 

그래서 16바이트로 stack alignment를 지켜야한다

-> 가젯을 8바이트 뒤로 밀어줘야함, 아무 영향 없는 8바이트 짜리 삽입을 통해서

 

행복해지네

 

ret가젯을 찾아서 삽입해줬음

 

 

 

 

내가 이해한 plt, got 개념 정리

 

함수 처음 호출 시 plt어딘가로 실행흐름 전한 후 plt내부에서  공유 라이브러리 내 해당 함수의 주소를 찾아냄

plt내에서 찾아낸 주소를 got에 저장

다음 호출부터는 got에 저장된 값으로 바로 호출

 

 

 

*ASLR이 켜져 있어도 gdb에서는 꺼져 있을 수 있음 

 (이거때메 삽질했다)

 


느낀점

: pwntools 디버깅 안 돼는 오류 찾아서 해결해야지 얼른.. 디버깅으로 오류 찾아야되는데 눈으로만 보고 찾을라니까 너무 힘들다