callq 에서 scanf 불러오기전에
scanf 입력값이 $rip+0x180f 에 들어가는거아냐?
왜 나는 stage! 나 h/215/065/017/030 같은게 나옴??
인터넷에 bomb lap phase3 해설보면 %d %d %d %d 나 %d %d 이런식으로 나오던데
callq 에서 scanf 불러오기전에
scanf 입력값이 $rip+0x180f 에 들어가는거아냐?
왜 나는 stage! 나 h/215/065/017/030 같은게 나옴??
인터넷에 bomb lap phase3 해설보면 %d %d %d %d 나 %d %d 이런식으로 나오던데
입금하면 알려줌
사용하려는 함수가 scanf야? 어셈소스 보면 sscanf 호출했다고 되어있는데? 여튼 저건 별로 중요한 부분은 아니니 그렇다 치고. 인터넷 예제와 다르게 나온단 이유는 아무래도 $rip는 브레이크 포인트를 어디에서 잡느냐에 따라 값이 변해서가 아닐까 싶은데 일단 $rip는 헷갈리기 쉬운데 '현재 명령어의 주소' 가 아니라 '다음 명령어의 주소' 라는것. 그래서 lea 0x180f(%rip),%rsi 가 수행될땐 0x55555555520f+0x180f 가 아니라 0x5555555552f7+0x180f가 수행되었을 거란 이야기지. 실제로 코드 우측에 0x555555556b06이 힌트로 나와있지?
저 값이 계산기로 계산했을 때 0x55555555520f+0x180f가 아니라 0x5555555552f7+0x180f 임을 확인해보면 알수 있을듯. 그리고 rip를 그냥 찍으면 해당 명령어가 출력되는거. 참고로 \215\065\017\030 은 8진수임. 16진수로 표기해보면 \8D\35\0F\18 가 되는데 바로 보이지? 8D는 lea명령어코드, 35는 rsi레지스터 그리고 남은 두개는 0x180f