완료됨
제약조건을 만족하는 원 가젯?

PoC 코드 부분에서

lb = u64(p.recvline()[:-1].ljust(8, b'\x00')) - 0x3ebc42
og = lb + 0x10a41c # 제약 조건을 만족하는 원가젯 주소 계산

여기 원가젯 주소계산에서 제약조건이 무엇인지 모르겠어서 질문드립니다..

제공된 libc에서 원가젯을 출력했을때,

0x4f3ce execve("/bin/sh", rsp+0x40, environ)
constraints:
address rsp+0x50 is writable
rsp & 0xf == 0
rcx == NULL || {rcx, "-c", r12, NULL} is a valid argv

0x4f3d5 execve("/bin/sh", rsp+0x40, environ)
constraints:
address rsp+0x50 is writable
rsp & 0xf == 0
rcx == NULL || {rcx, rax, r12, NULL} is a valid argv

0x4f432 execve("/bin/sh", rsp+0x40, environ)
constraints:
[rsp+0x40] == NULL || {[rsp+0x40], [rsp+0x48], [rsp+0x50], [rsp+0x58], ...} is a valid argv

0x10a41c execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL || {[rsp+0x70], [rsp+0x78], [rsp+0x80], [rsp+0x88], ...} is a valid argv

로 나왔습니다!

어떻게 왜 저 가젯을 선택했는지 궁금합니다.

#시스템해킹 #공격기법 #use_after_free
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 2
avatar
wyv3rn
무플 방지 위원회장

말 그대로 원가젯 주소를 출력했을때 아래 나오는 것들이 제약 조건입니다.

예를 들면 첫번째 원가젯의 경우에는 원가젯주소로 리턴하기 직전에 아래 조건을 만족하는 상태에서 리턴해야 쉘이 실행되는 방식입니다.

address rsp+0x50 is writable
rsp & 0xf == 0
rcx == NULL || {rcx, “-c”, r12, NULL} is a valid argv

2023.12.05. 11:17
avatar
Rasser
워게임: 20

예를 들어 설명드리면 편할거 같습니다.

BOF 취약점이 있는 바이너리를 분석해 RIP를 원가젯 주소로 덮으면 프로그램이 실행되면서 원가젯을 실행시킬때 그때의 레지스터 값이 있을겁니다.

그럼 그 레지스터의 값과 원가젯에서 요구하는 레지스터 값이 맞는 원가젯 offset을 선택해야 원가젯이 제대로 실행됩니다.

디버깅 걸어서 레지스터 값 보시고 실행시켜보면 레지스터 값을 제대로 맞춰준 원가젯은 제대로 쉘을 실행시켜주는데 그렇지 않은 원가젯은 이상한대로 튈겁니다

2023.12.05. 11:22