해당 강의에서 pop rsi ; pop r15 ; ret 가젯을 쓰는 이유를 모르겠습니다.

https://dreamhack.io/learn/84#12

해당 강의에서 pop rsi ; pop r15 ; ret 가젯을 쓰는 이유를 모르겠습니다.

입력 버퍼를 설정해야하므로 pop rsi를 쓰는 것까지는 이해가 되는데 pop r15가 있는 이유는 모르겠네요..
코드를 보니 r15 레지스터에 0을 집어넣던데 r15는 다음 실행할 주소를 가리키는 레지스터가 아닌가요?

이렇게 되면 0이 다음 실행할 주소가 되버리는거 같은데..

작성자 정보
답변 1
xl4sh
강의 수강: 10

r15가 다음 실행할 주소를 가리키는 레지스터라는게 너무 뜬금없어서 찾아보니까 ARM architecture의 경우에 해당한다고 합니다...

저희가 주로 사용하는 x86, x86_64 경우에는 eip, rip가 pc(program counter)역할을 하게 됩니다.

본론으로 넘어가서 pop rdi ; ret, pop rsi ; pop r15 ; ret가젯의 경우 보통 init함수에 존재하는 아래의 코드로 인해 이용할 수 있게되는 가젯인데요, 잘 보시면 가젯에 해당하는 instruction이 하나도 없는 것을 보실 수 있습니다.

0:  5b                      pop    rbx
1:  5d                      pop    rbp
2:  41 5c                   pop    r12
4:  41 5d                   pop    r13
6:  41 5e                   pop    r14
8:  41 5f                   pop    r15
a:  c3                      ret

하지만

0:  5f                      pop    rdi
1:  c3                      ret

pop rdi ; ret의 opcode를 보시면 아시다시피 위쪽에 pop r15 ; ret의 일부분임을 확인하실 수 있으실겁니다. 그렇다면 대강
pop rsi ; pop r15 ; ret 의 경우에도 눈치채셨을 겁니다.

0:  5e                      pop    rsi
1:  41 5f                   pop    r15
3:  c3                      ret

네 이경우에는 pop r14 ; pop r15 ; ret의 일부분 입니다.

결론짓자면, 가젯이라는게 프로그램에서 실제로 실행되는 instruction일 수도 있지만, 이와같이 실행되는 instruction의 opcode 일부분을 따온 것 일수도 있기에 정확히 원하는 instruction만으로 구성되어 있는것이 아닙니다.

따라서 exploit과 관계없는 r15레지스터에 값을 넣어줘야 하게 되는상황이 발생한 것이죠.

2021.09.06. 03:23
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기