2가지 질문이 있습니다..
-
auth 주소 구하는법.. 그냥 모르겠어여 이거는 ㅠㅠ
-
AAAA %p %p %p %p %p %p %p %p %p 입력 넣어서 9번째 %p에서 0x41414141이 출력돼서 buf의 시작 주소가 9번째 인자인건 알겠늗네 함수 호출 규약대로라면 6개는 레지스터에 들어가고 나머지 7개 부터는 스택에 쌓이는 구조인데 왜 7번째랑 8번째에 print stack frame이랑 auth에 있는 값이 나오는거져..? 제가 알고 있는걸로는 printstackframe 형성되고 ret 보다 먼저 인자가 쌓이니까 auth부터 7번째 인자로 나와야되는게 아닌가 헷갈리네여 ㅠㅠ
rdi부터 출력된다고 하지만, rdi 값이 printf 함수에서 출력을 위한 print format으로 사용(된다고 합니다)되기에 rsi부터 출력된다고 생각하셔도 됩니다.
예제 문제에서는 rdi부터 출력된다고 가정했기 때문에 7번째부터 출력된 것 같고, 컴파일된 환경에 따라 조금 다를 순 있겠지만 6번째부터 출력되는 경우도 있습니다.
auth 주소는 알아내는 방법이 있을지도 모릅니다만 제 생각에는 없을 것 같고, 별도로 출력하는 방법이 없기에 디버깅을 통해 알아내야될 것 같습니다.
문제에서의 아래 스택 구조가 디버깅을 한 결과 값들이라고 보시면 좋을 것 같습니다.
printf가 실행되기 전의 rsp의 위치입니다
저도 자세히는 모르는데 printf도 함수니까 stack을 생성했고 rsp가 현재 그 스택 내부를 가리키고 있는게 아닐까요?
7번째 인덱스부터는 rsp+0,rsp+8,rsp+16 이렇게 참조되는걸로 알고있습니다. 그래서 rsp가 작업하던 printf_stackframe을 뚫고 내려가서 buf에 접근해서 입력한 주소를 참조해야 할거에요. auth가 먼저 선언되서 더 낮은 주소에 auth가 나오는게 맞네요
0x7fffffffdddc에 auth가 위치한다고 줬으니까 그냥 보고 풀었는데 win이라고 나왔어요
개인적으로는 일단 패딩만 맞춰두면 뒤에 주소가 오는게 오프셋을 맞추기가 쉬워집니다.
더불어 주소에 값을 쓸 때 %n 사용 시 앞에서 사용한 문자의 개수를 카운트해서 쓰는데 이때도 값을 맞추기 쉬워지고요.
예를 들어 7번째 오프셋이라고 가정하면 통상적으로 주소에 10을 쓰기 위해서
%10c%8$n주소
와 같이 사용하는데
주소가 앞에오면
주소%2c%7$n
과 같이 주소에서 사용된 8개의 문자수를 추가로 고려해야합니다.
(위 예제가 절대적인건 아닙니다. 이미 쓰인 문자 개수가 더 있을 수 있습니다.)
또한 7번째 오프셋이 무조건 0 또는 8번째 주소에 위치하지 않는 경우도 있습니다.
이 경우에는 주소를 제대로 받아오지 못합니다.
간혹 주소의 0x00을 입력의 끝으로 받아들이는 경우도 있고요.
글로 설명하려니 조금 어렵고 보시는 입장에서 이해안될 수 있는데, 여러 이유로 뒤에 쓰는게 유리합니다.
질문을 이해하지 못했는데...
혹시 디스코드 하시면 디스코드로 오시겠어요?