완료됨
auth주소랑 %p 인자관련

2가지 질문이 있습니다..

  1. auth 주소 구하는법.. 그냥 모르겠어여 이거는 ㅠㅠ

  2. 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번째 인자로 나와야되는게 아닌가 헷갈리네여 ㅠㅠ

#시스템해킹 #기초 #포맷_스트링_버그
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 5
avatar
wyv3rn
무플 방지 위원회장

rdi부터 출력된다고 하지만, rdi 값이 printf 함수에서 출력을 위한 print format으로 사용(된다고 합니다)되기에 rsi부터 출력된다고 생각하셔도 됩니다.
예제 문제에서는 rdi부터 출력된다고 가정했기 때문에 7번째부터 출력된 것 같고, 컴파일된 환경에 따라 조금 다를 순 있겠지만 6번째부터 출력되는 경우도 있습니다.
auth 주소는 알아내는 방법이 있을지도 모릅니다만 제 생각에는 없을 것 같고, 별도로 출력하는 방법이 없기에 디버깅을 통해 알아내야될 것 같습니다.
문제에서의 아래 스택 구조가 디버깅을 한 결과 값들이라고 보시면 좋을 것 같습니다.

2023.07.31. 15:05
avatar
wyv3rn
무플 방지 위원회장

printf가 실행되기 전의 rsp의 위치입니다

2023.08.01. 12:16
minnon
대표 업적 없음

저도 자세히는 모르는데 printf도 함수니까 stack을 생성했고 rsp가 현재 그 스택 내부를 가리키고 있는게 아닐까요?
7번째 인덱스부터는 rsp+0,rsp+8,rsp+16 이렇게 참조되는걸로 알고있습니다. 그래서 rsp가 작업하던 printf_stackframe을 뚫고 내려가서 buf에 접근해서 입력한 주소를 참조해야 할거에요. auth가 먼저 선언되서 더 낮은 주소에 auth가 나오는게 맞네요
0x7fffffffdddc에 auth가 위치한다고 줬으니까 그냥 보고 풀었는데 win이라고 나왔어요

2023.07.31. 14:26
avatar
wyv3rn
무플 방지 위원회장

개인적으로는 일단 패딩만 맞춰두면 뒤에 주소가 오는게 오프셋을 맞추기가 쉬워집니다.

더불어 주소에 값을 쓸 때 %n 사용 시 앞에서 사용한 문자의 개수를 카운트해서 쓰는데 이때도 값을 맞추기 쉬워지고요.

예를 들어 7번째 오프셋이라고 가정하면 통상적으로 주소에 10을 쓰기 위해서
%10c%8$n주소
와 같이 사용하는데
주소가 앞에오면
주소%2c%7$n
과 같이 주소에서 사용된 8개의 문자수를 추가로 고려해야합니다.
(위 예제가 절대적인건 아닙니다. 이미 쓰인 문자 개수가 더 있을 수 있습니다.)

또한 7번째 오프셋이 무조건 0 또는 8번째 주소에 위치하지 않는 경우도 있습니다.
이 경우에는 주소를 제대로 받아오지 못합니다.
간혹 주소의 0x00을 입력의 끝으로 받아들이는 경우도 있고요.

글로 설명하려니 조금 어렵고 보시는 입장에서 이해안될 수 있는데, 여러 이유로 뒤에 쓰는게 유리합니다.

2023.08.01. 15:43
avatar
wyv3rn
무플 방지 위원회장

질문을 이해하지 못했는데...
혹시 디스코드 하시면 디스코드로 오시겠어요?

2023.08.01. 16:59