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
즉 우분투 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 디버깅 안 돼는 오류 찾아서 해결해야지 얼른.. 디버깅으로 오류 찾아야되는데 눈으로만 보고 찾을라니까 너무 힘들다
'System Hacking' 카테고리의 다른 글
[드림핵] basic_rop_x64 풀이 - 티스토리 (0) | 2023.07.22 |
---|---|
[드림핵] rop (return oriented programming) 풀이 - 티스토리 (0) | 2023.07.21 |
[드림핵] ssp_001 풀이 - 티스토리 (0) | 2023.07.16 |
[드림핵] Return to Shellcode 풀이 - 티스토리 (0) | 2023.07.12 |
[드림핵] baic_exploitation_000 풀이 - 티스토리 (0) | 2023.07.10 |