시스템해킹

[LAZENCA] ROP-x64 part.3

세종대학교 S.S.G / WHS 2기 2023. 11. 9. 23:04

 

 

이전 포스팅

 

[LAZENCA] ROP-x64 part.1

참고 자료 https://www.lazenca.net/display/TEC/02.ROP%28Return+Oriented+Programming%29-x64 02.ROP(Return Oriented Programming)-x64 - TechNote - Lazenca.0x0 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x64

yi-barrack.tistory.com

 

[LAZENCA] ROP-x64 part.2

이전 포스팅 2023.11.09 - [시스템해킹] - [LAZENCA] ROP-x64 part.1 [LAZENCA] ROP-x64 part.1 참고 자료 https://www.lazenca.net/display/TEC/02.ROP%28Return+Oriented+Programming%29-x64 02.ROP(Return Oriented Programming)-x64 - TechNote - Lazenca.0

yi-barrack.tistory.com

 

참고 자료

 

02.ROP(Return Oriented Programming)-x64 - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x64 ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태

www.lazenca.net

 

자 그러면 전에 말한 확인해야할 정보들에 대해 알아보자.

확인해야할 정보

  • vuln의 ret까지의 offset
  • "/bin/sh"문자열이 저장된 영역
  • libc offset
    • printf
    • system
    • setresuid
  • 가젯의 위치
    • pop rdi,ret
    • pop rsi,ret
    • pop rdx,ret

왜 가젯의 위치라고 하고 가젯들이 정확하게 등장했는지는... 나중에 설명하고(궁금하면 lazenca 들어가서 읽어봐용)

 

 

주의 
현재 PIE가 설정되어 있음으로 offset을 구할땐 당연히 프로그램을 재시작 하지말고 구하자. 재시작하면 base주소 바뀌어서... 못알아 듣겠다면...

전 포스트의 계단에서 지면으로부터의 사람의 머리 높이 구하기(키) 예시를 다시 들어보자. 만약 재시작 한다면 3번째 칸에서의 어깨높이로 8번째칸에 있는 사람의 머리 높이를 구하려고 노력하는 꼴이 될 수 있다. (어케 사람 머리가 170cm) 이런 결과가 나오지 않으려면 계단을 이동하지 않은 상태에서 구해야 하는게 당연하겠죠...? 

vuln ret까지의 offset 구하기

disass vuln을 통해 vuln+0 과 vuln+82(read@plt) 부분에 breakpoint를 걸어두자.

vuln을 실행하자마자 rsp값을 기록해둔다.

 

자 call 위치에서 rsi의 값을 구한다. rsi는 버퍼의 위치이다. 따라서 이 rsi와 rsp의 차를 구하면 offset이 나온다.ㅇㅈ?

 

그러티그러티. offset이 72라고 한다.

 

 

"/bin/sh" 문자열의 위치 찾기

우리 pwndbg 형님은 search 기능을 가지고 계신다.

(pwndbg 형님 search 쓰신다)

 

자 그러면 이 개쩌는 기능을 써보자. 간단하게 search "/bin/sh" 하면 끝.

와. 장군님.

 

 

 

libc의 베이스 주소 찾기

info proc map 명령어를 사용하면 현재 libc의 베이스 주소를 볼 수 있다.

자 libc.so.6 start addr 에서 offset 값이 0x0인 곳을 보면 그곳이 libc의 베이스 주소이다.(물론 1회성...)

 

자 이 값을 통해서 /bin/sh의 offset을 구하면 0x1d8698 값이 나온다.

 

 

printf, system, setresuid의 offset 찾기

libc의 주소를 다 뺴주며 offset을 구하면 해당 값이 나온다.

 

 

Find gadget!

우리가 필요한 가젯은

1. pop rdi; ret;

2. pop rsi; ret;

3. pop rdx; ret;

이다. 해당 가젯들을 찾으려면 pwndbg에서 rop --grep "찾는 가젯" 이라고 적으면 된다.

 

 

 

 

 

 

 

자. 이제 모든 준비가 끝났다.(끝났나..?) 이제 익스 하러 가보자구.