2020-09-19 08:05 (토)
리버스엔지니어링, 64비트 시대가 왔다
상태바
리버스엔지니어링, 64비트 시대가 왔다
  • 길민권
  • 승인 2011.07.04 04:10
이 기사를 공유합니다

손충호 연구원, “국내 64비트 제품 출시 아직 제대로 안되고 있다”
지난 2일 숭실대학교 형남공학관에서 열린 2011 코드엔진 컨퍼런스에서 손충호 쉬프트웍스 연구원은 ‘x64 아키텍쳐 분석과 x64와 x86 비교 분석’이라는 제목으로 발표를 했다. 어떤 내용인지 손 연구원에게 들어봤다.
 
손 연구원은 “한국은 아직 리버스엔지니어링에서 32비트가 점유율 면에서 대세를 이루고 있다. 하지만 32비트에만 머물러서는 안된다. 64비트로 가야 하는 시대가 왔다. 그럼에도 불구하고 많은 사람들이 64비트 접근을 힘들어 하고 있다”며 “32비트에서 64비트가 어떻게 바뀌었는지 그리고 왜 바뀌었는지 아키텍쳐를 포함해 설명하는 시간을 가졌다”고 말했다.  
 
좀더 자세히 들어가면 이렇다. 그는 “리버스엔지니어링을 하게 되면 여러가지 어셈블리 문장을 만나게 된다. 32비트랑 64비트 비교하면 어셈블리 문장이 많이 달라졌다. 프로그램을 구동시키기 위한 레지스터가 있는데 그것 조처도 달라졌다. 두배가 늘어났다. 어셈블리 명령어들도 늘어났다. 내부의 명령어들을 처리하는 명령어 구문들도 달라졌다. 프로그램 내부에 함수들이 많다. 그 함수들을 호출할 때 값을 전달할 수 있는데 값을 전달하는 방식도 달라졌다. 어떻게 달라졌는지 설명했다”며 “요즘 커널단에서 제품출시를 많이 하는데 64비트에서 제대로 출시를 못하고 있다. 커널  내부에 64비트만의 프로텍션이 있다. 그 프로텍션이 어떤 식으로 작동하는지 모르는 경우 많다”고 설명했다.
 
또 “콜링 컨벤션(Calling Convention)은 함수의 값을 포함해서 보내는 것을 뜻한다. 32비트는 푸시기능을 이용해서 ESP(Embedded Server Pages)에 스택을 차곡차곡 쌓아서 함수를 호출한다. 그 함수가 호출되면 함수 내부에서 값을 가져와 쓰는 방식으로 32비트는 스텍기반이다. 반면 64비트에서는 레지스터 기반으로 바뀐다”고 말했다.
 
스택(stack)을 쌓는다는 것은 어떠한 메모리 주소값에 값을 하나씩 쌓아서 메모리 주소값을 참조해서 가져온다는 것인데 레지스터 기반은 함수가 호출되면 호출 된 곳에서 레지스터 자체를 바로 참조하는 것이라고 한다. 그래서 파라미터 값을 바로 전달받는 것이다.
 
64비트는 파라미터를 넘길 때 스택이 아닌 레지스터에 넣어주면 된다. MS에서 만든 규약에 따라 넣어주고 그대로 파라미터를 읽어와서 처리를 하면 된다고 한다.  
 
손 연구원은 어떻게 리버스엔지니어링을 공부했을까. 그는 “리버스엔진니어링 툴들을 무작정 올렸다. 간단하게 프로그램 짠 것들을 올리디버그에 올려서 짠 코드들이 어떻게 어샘블러로 바뀌는지 확인하는 작업을 지속적으로 했다. 그런 과정을 통해 리버스엔지니어링을 배우게 됐다”고 말하고 “처음 공부하는 분들은 어셈블리 명령어를 착실히 배워야 한다. 프로그램 작동구조론 같은 것도 배우면 도움이 된다”고 조언했다. [데일리시큐=길민권 기자]