강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của woohyun
woohyun

câu hỏi đã được viết

Móc API Windows sẽ thay đổi cuộc sống của bạn nếu bạn hiểu nó

Xóa bộ nhớ đệm

8강과 9강에서 jmp해야하는 main의 상대 주소가 달라요.

Đã giải quyết

Viết

·

80

0

안녕하세요 강사님.

8강과 9강에서는 testFunc을 targetFunc의 도입부에 넣어 실행을 시키고

main으로 다시 돌아오도록 코드가 되어있는데요

main의 시작점과 리턴을 희망하는 위치를 계산해보면 강의 자료보다 큰 값이 나옵니다.

질문1. x86으로 최적화를 하지 않고 똑같이 실행을 했는데 왜 다른지 궁금합니다.

제 코드를 디스어셈블리에서 보면 강의에서 보이는것보다 많은 기계어들이 보입니다.

질문2. "jmp main + 86h" 에서 86대신 D0 이런식으로 계산 결과가 나왔을 때 빌드 에러가 발생하고 있습니다. 0xD0 이런식으로 넣으면 빌드 에러는 나지 않지만 다른곳으로 점프를 하는것 같고요. 어떻게 해결을 해야할까요?

리버싱시스템-해킹hookingwindows-api

Câu trả lời 2

0

nullnull8537님의 프로필 이미지
nullnull8537
Người chia sẻ kiến thức

8, 9강의 내용은 함수 프롤로그/에필로그와 Naked 함수에 관한 것으로 질문과 다른 것입니다. 해서 강의 내용 중 질문에 가까운 내용은 12강 힙 메모리에 저장된 코드 실행하기로 추정학고 답변을 드립니다.

  1. 컴파일러 설정이 같다하더라도 운영체제 환경 및 컴파일러 버전에 따라 구체적인 값은 달라질 수 있습니다. 그리고 더 많은 기계어가 보인다는 것은 어쩌면 빌드 모드가 디버그 모드라 그럴 수 있습니다.

  2. 인라인 어셈블리 코드에서 상수값을 수정하더라도 빌드오류가 발생하지는 않습니다. 정확한 답변을 드리려면 구체적인 코드 및 에러 메시지를 봐야 답변을 드릴 수 있겠습니다.

참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다.
woohyun님 질문에 대한 답변 드리겠습니다.

질문1에 대해서는 컴파일러의 최적화 옵션이나 환경에 따라 생성되는 기계 코드가 달라질 수 있습니다. x86 환경에서 최적화를 하지 않더라도 컴파일러의 버전이나 설정에 따라 변동이 있을 수 있으며, 이러한 차이는 디스어셈블리에서 기계어의 차이로 나타날 수 있습니다. 컴파일러의 최적화 옵션을 확인하고 강의와 동일한 옵션을 사용하였는지 검토해보는 것이 좋습니다.

질문2에 대해서는 “jmp” 명령어를 사용할 때 상대 주소를 계산할 필요가 있습니다. 이때, jmp 명령어에서 -128부터 +127 사이의 바이트는 간편하게 처리되지만, 그 범위를 벗어나는 경우에는 절대 주소나 롱 점프를 사용해야 합니다. “jmp main + 0x86”과 같은 형식에서 계산 결과가 범위를 벗어난 경우, jmp/branch 명령어가 올바르게 작동하지 않을 수 있습니다. 따라서 계산된 상대 주소의 크기를 검토하고, 너무 큰 값이 계산된 경우에는 메모리 객체나 함수의 위치를 확인해야 합니다.

추가적으로, 해당 부분에 자세한 내용이 강의 내용에 포함되어 있으면 그 내용을 참고해 주시길 바랍니다. 더불어, GraalVM의 Native Image Compatibility Guide도 참고해 보시는 것을 추천드립니다.

감사합니다.

Hình ảnh hồ sơ của woohyun
woohyun

câu hỏi đã được viết

Đặt câu hỏi