일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
[GGGG]요즘 이상하리만큼 많은 사람들이 리버싱에 관심을 보인다. 리버싱이란 리버스 엔지니어링의 준말로 우리말로는 역공학 정도가 된다. 남이 만든 것을 역으로 분석하는 것이라고 생각하면 된다. 소스 코드를 컴파일하면 컴퓨터가 이해하는 바이너리 코드가 생성된다. 우리는 이러한 작업을 하는 사람들을 개발자라 부른다. 리버싱은 이렇게 생성된 바이너리 코드로부터 소스 코드를 유출해내는 기술을 말한다. 이런 작업을 하는 사람들을 우리는 리버서라 부른다. 이렇게 관심을 끌고 있는 기술인 만큼 주변에서 리버싱을 공부하는 사람을 찾는 것은 어렵지 않다. 하지만 공부를 하는 사람에 비해서 리버싱을 배웠다고 느끼는 사람은 적다. 그들이 실패하는 이유는 잘못된 학습 방식에 기인한 경우가 많다. 보통의 경우 리버싱 과정을 설명한 온라인 튜토리얼을 따라하면서 하나씩 배워 나간다. 하지만 이런 방식을 취할 경우 늘 새로운 실행 파일 앞에서는 속수 무책이 된다. 기본 원리를 모르기 때문이다. 패턴 리버싱을 잘 하려면 중학교 수학책에 나오는 인수분해를 잘해야 한다. 물론 사실 인수분해를 잘할 필요는 없다. 어떻게 하면 인수분해를 잘할 수 있는지를 아는 것이 중요하다. 같은 과정을 리버싱에 적용하면 득도의 경지에 도달할 수 있다고 감히 말할 수 있다. 인수 분해란 나열된 수식을 정리해서 간단한 인수의 곱으로 바꾸는 것을 말한다. x^2 + 2xy + y^2과 같은 수식을 (x+y)^2으로 나타내는 것을 말한다. 처음 인수 분해를 배우는 학생들은 당황한다. 늘 해왔던 것과는 반대로 진행되기 때문이다. 리버싱을 처음 배우는 개발자와 같은 심정인 것이다. 하지만 신기한 사실은 두, 세 시간의 수업 후에는 대부분의 학생들이 능숙하게 인수 분해를 해낸다는 점이다. 이는 리버싱과는 대조적인 차이라 할 수 있다. 어떻게 그렇게 됐을까? 답은 간단하다 10가지 안팎의 공식에 있다. 교과서에는 인수 분해에 대한 설명과 함께 암기 해야 할 필수 공식이 나온다. 이 공식들은 인수 분해에 자주 사용되는 것들로 이것들을 암기하고 나면 대부분의 역행 패턴을 쉽게 유추할 수 있는 것이다. 리버싱도 마찬가지다. 개발자들이 프로그램을 작성하면서 사용하는 코드는 한정적이고, 여기에는 일정한 패턴이 존재한다. 이렇게 자주 사용하는 코드들의 변환 결과와 패턴을 모두 암기하고 있다면 변환 결과로부터 원 소스를 유추해 내는 과정은 그리 어렵지 않다. 실제로 유능한 리버서들은 어셈블리 코드를 보면 바로 C 코드가 떠오를 정도로 기계적이라고 한다(보통 중국 애들). 개발자들이 많이 사용하는 코드도 그 결과를 어떻게 보는지도 모르겠다고 생각할 수도 있다. 하지만 걱정할 필요가 없다. 우리보다 먼저 그 길을 간 사람들이 우리를 위해서 잘 정리해 둔 결과물이 있기 때문이다. Hacker Disassembling Uncovered는 그러한 패턴을 설명하는 뛰어난 책이다. 상상력, 그리고 경험 세상은 언제나 한 가지로 끝나지 않는다. 인수 분해 또한 마찬가지다. 교과서에 나온 공식을 다 암기하고 나면 대부분의 것들을 인수 분해 해내는 수준이 된다. 하지만 아직도 어려운 문제를 인수 분해하기에는 모자란다. 어려운 인수 분해 문제의 특징은 수식에 뭔가를 추가 해야 한다는 점에 있다. 수식에 + 2y – 2y 등을 추가해야 인수 분해가 되는 것이다. 이런 작업을 해보기 전까지는 절대 인수 분해되지 않는다. 수식에 + 2y – 2y를 추가하는 것은 수학적 직관력과 매우 밀접한 관련이 있다. 직관력이 뛰어난 학생들은 답을 보지 않고도 이 미친 짓들을 수식에 종종 적용하고는 한다. 하지만 나머지 대부분의 학생들은 이런 과정을 상상도 하지 못한다. 안타깝게도 우리는 보통 나머지 대부분인 경우가 많다. 부족한 직관력과 상상력을 보충하는 방법은 부단한 연습을 통한 경험 축적 뿐이다. 실제로 수학적 직관력이 떨어지는 학생들도 + 2y - 2y를 추가하는 문제를 여러번 접하다 보면 나중에는 인수 분해가 잘 되지 않으면 각종 수식들을 첨가 삭제 요리하는 단계에 이른다. 경험에 의해서 방법을 알게되는 것이다. 리버싱도 마찬가지다. 동등한 실력을 가진 경우에 열 번 해본 사람이 한 번 해 본 사람보다 새로운 문제를 풀 확률이 높다. 열 번 중에 한 가지가 이번 문제의 패턴일 수 있기 때문이다. |
[GGGG]오늘은 일진이 그런 하루였습니다. 아침엔 지하철이 고장 났다고 다음 차 타라고 오더니 회사 오는 길엔 장마철도 보고. ㅋㅋ 저녁엔 간만에 예전에 회사에서 같이 일했던 G 과장님(차장님??)을 만났습니다. 둘이서 꼼장어 먹고 소주 일병씩 까고 헤어졌죠. 그 땐 비가 안오더니 회사에 돌아오니 비가 무진 오네요. ㅋㅋ 집에 들어가기 귀찮아서 회사 왔습니다. ㅠㅠ 내일 마이크로소프트웨어 문경수 기자님께서 저녁 사주신댔는데 이상한 몰골로 또 만나야 겠군요. 비는 사람을 참 센치하게 만드는 것 같아요. 저같이 낭만이라고는 코빼기도 없는 사람도 첫사랑 기억이 나는걸 보면. ㅋㅋㅋ 대학교 일학년 때 보고 한번도 못 봤으니 참 오래 됐네요. 어디서 밥은 먹고 뎅기는지 참 궁금합니다. 예쁘장하게 생겨서 굻고 다니진 않겠죠? 요즘 쩐의 전쟁 보니까 상콤한 연애가 다시 하고 싶어지더군요. ㅎㅎ 초심을 유지하기란 정말 쉽지 않은것 같습니다. ㅋㅋㅋㅋ 시간은 참 잘 가는것 같아요. 벌써 2007년도 절반을 넘어 섰네요. 연초에 세웠던 계획들이 절 부끄럽게 만드는 군요. 반타작은 했을까? 라고 잠시 고민해 봤지만 그것도 못한것 같아요. ㅎㅎ 지금부터라도 열심히해서 연말에는 부끄럽지 않은 한 해를 보냈다고 자평할 수 있었으면 좋겠습니다. 오늘 오후 회의 시간에 사장님께서 월급을 올려준다는 이야기를 하시더군요. 기분 좋은 이야긴데 조금 그랬습니다. 세상은 기브앤테이크라는데 주는 것 없이 너무 받는것만 같아서 말이죠. 앉아서 회사에서 내가 한게 무얼까? 잠시 곰곰 생각해 봤는데 딱히 없더군요. 참 미안합니다. 이제부터라도 열심히 해야겠어요. ㅎㅎ 다음달이 MVP 재선발 기간이라는 메일이 왔더군요. 한번도 갱신을 못해본 저이기에 더욱 떨립니다. 그런데 활동을 안해서 더더욱 떨리네요. ㅋㅋ VC++쪽은 워낙 활동하시는 분들이 많아서 굳이 제가 달지 않아도 댓글이 안달리는 경우가 흔치 않죠. ㅋ 그래도 방금 가서 몇 개 달고 왔습니다. 부끄럽습니다. ㅠㅠ 비가 그쳤네요. 자야겠습니다. ㅎㅎ |