ret, pop rdi 가젯의 하는 역할이 무엇인가요?

어셈블리어에 대한 지식이 부족해서 질문 드립니다.
익스플로잇 코드에서 ret 영역에 의미 없는 ret 가젯을 넣어 0x10 단위로 정렬해주고 pop rdi 가젯을 찾아서 넣어주던데

  1. 단순 정렬 문제라면 ret 가젯 대신 b"A"*0x8을 넣어줘도 괜찮겠다는 생각에 넣어줬는데 EOF 오류가 발생하던데 왜 그런건가요?
  2. 의미 없는 가젯인 ret 가젯을 만나면 아무 일도 일어나지 않고 다음 코드인 pop rdi 가젯으로 넘어가는 건가요?
  3. pop rdi 가젯은 system 함수의 인자로 사용되는 rdi 값을 비워주기 위해서 사용하는 건가요?
#시스템_해킹 #공격기법 #rtl
작성자 정보
답변 2
avatar
wyv3rn
무플 방지 위원회장

음..........
우선 ret의 경우
스택오버플로우의 기초를 다시 생각해보시면 좋을 것 같습니다

즉, 우리가 스택 오버플로우할때 return할 주소를 삽입하는데 그 위치가 ret입니다.

ret은 다시 쪼개보면 64비트에서
pop rip
jump rip
로 구성되어있습니다.

즉, rip 레지스터에 rsp 위치의 값을 넣고 거기로 점프한다는거지요.

단순히 해당 위치로 점프만 해도 되면 ret 만으로 충분 합니다만, 그럼 인자를 가지는 함수들은요?

마찬가지로 ret에서 rip레지스터에 함수의 주소를 가지고 거기로 가며, 또한 마찬가지로 인자들도 특정 레지스터에 값을 넣어두고 나중에 참조합니다.

이를 시스템콜 이라고 묶어서 부릅니다. (정확하지는 않습니다만 그리 이해하시면 편합니다. 더 줄여서 시스콜이라고 부릅니다)

모든 함수는 참조하는 레지스터가 동일하지만 그 순서가 다릅니다.

예를들어 1개의 인자를 가지면 rdi 값만 참고하고 2개라면 뭐였더라.... 어쨋든 그렇습니다 ㅋㅋㅋㅋ

구글에 syscall table을 검색해보시면 한방에 이해되실겁니다.

2022.08.31. 16:47
avatar
wyv3rn
무플 방지 위원회장

질문이 변경되었네요 ㅎㅎ 인지하지 못했습니다.

  1. 단순 정렬 문제라면 ret 가젯 대신 b"A"*0x8을 넣어줘도 괜찮겠다는 생각에 넣어줬는데 EOF 오류가 발생하던데 왜 그런건가요?
    해당 위치가 ret address니까요 ㅎㅎ
    AAAAAAAA 주소로 점프하려해서 나는 오류일겁니다.

  2. 의미 없는 가젯인 ret 가젯을 만나면 아무 일도 일어나지 않고 다음 코드인 pop rdi 가젯으로 넘어가는 건가요?
    아무 일도 일어나지 않는다는건 아닙니다.
    ret은 pop rdi jump rdi의 역할을 하기에 그 다음의 주소로 점프하는 역할을 합니다

  3. pop rdi 가젯은 system 함수의 인자로 사용되는 rdi 값을 비워주기 위해서 사용하는 건가요?
    아니요. binsh 문자열 주소를 rdi 레지스터에 넣어주기 위함입니다.

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