arch_prctl syscall을 통해 fs/gs 레지스터에 주소 값을 넣을 수 있고, 또 지정된 주소에 fs/gs 레지스터에 저장되어 있는 값을 저장할 수 있다는 점은 알겠는데, 이를 어떤 식으로 활용할 수 있을지 모르겠습니다.
arch_prctl로 할 수 있는 동작은 단순히 위의 두 동작이라 스택에 arch_prctl을 통해 값을 쓰고 그 값을 stdout에다 write하는 방식 외에는 arch_prctl의 활용 방법이 떠오르지 않습니다. 그런데 이는 그냥 다른 레지스터들을 갖고서도 할 수 있는 동작이라 arch_prctl syscall의 필요성을 더더욱 느끼질 못하겠습니다.
혹시 arch_prctl에 또 다른 기막힌 활용 방법이 있다면 알려주시면 감사하겠습니다.
해당 함수를 통해 aaw가 가능합니다.
상세한 사항은
https://man7.org/linux/man-pages/man2/arch_prctl.2.html
를 참고하시면 될 것 같습니다.
결국 첫번째 인자의 값으로 get과 set이 가능하기에
arch_prctl(set, val) 이후에
arch_prctl(get, addr) 을 통해 addr에 val을 쓸 수 있습니다.
근데 문제랑은 큰 상관이 없....
어디까지 보셨는지는 모르겠습니다만 바이너리에서 쉘코드를 입력받고 그대로 실행해주기에 이를 통해 임의의 위치에 저장된 문자열을 출력하면 됩니다.
음 꼭 위치를 추측해야할까요? ㅎㅎ 전체 다 찾아보면 안될까요
fs 레지스터에 적절한 주소를 넣으신게 맞나요?
굳이 fs를 사용할 필요가 없습니다.
단순히 쉘코드를 잘못 작성하신 것 같습니다 ㅎ