tag:blogger.com,1999:blog-22282234626520333692024-02-19T00:13:06.979-08:00S3ize th3 DayS3izeS3izehttp://www.blogger.com/profile/04765215720110662096noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-2228223462652033369.post-16537061244665625662012-09-21T08:54:00.002-07:002023-02-07T20:43:20.283-08:00[Tip] OS X에서 Windbg를 이용한 Windows Kernel Debugging<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
[Tip] OS X에서 Windbg를 이용한 Windows Kernel Debugging</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
맥북을 사용중이므로... windows kernel debugging하는 것에 많은 생각을 해보았습니다...</div>
<div class="separator" style="clear: both; text-align: left;">
가상windows안에 vmware를 설치해서 그안에서 또 windows를 불러올까... 했는데</div>
<div class="separator" style="clear: both; text-align: left;">
지인의 도움으로 가상windows를 2개 만들어서 디버깅이 가능하다는 것을 알게 되고!</div>
<div class="separator" style="clear: both; text-align: left;">
하나는 서버로 하나는 클라이언트로 만들어서 커널 디버깅이 가능했습니다 </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2 style="text-align: left;">
1. 작업 환경</h2>
<div class="separator" style="clear: both; text-align: left;">
운영체제 : OS X 10.8.2</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWs0AyIWa0cBQYCKoSrkCDPXJPc1ai5AF-rGdmlqLpuR0Z_NaPhiCcKI6f7y9ZJ5BbsjcqrN-J9zMc_KuKJB1RvMU-IRrMbSP7EafDhq6xQhgnEiQd1Id9L_hgl1B6tOjmWGO0x3LqeqHE/s1600/image.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWs0AyIWa0cBQYCKoSrkCDPXJPc1ai5AF-rGdmlqLpuR0Z_NaPhiCcKI6f7y9ZJ5BbsjcqrN-J9zMc_KuKJB1RvMU-IRrMbSP7EafDhq6xQhgnEiQd1Id9L_hgl1B6tOjmWGO0x3LqeqHE/s1600/image.tiff" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Parallels : build 8.0.18101</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPqJRT2bTwb5JTdACAq-8IUkL-IVx-tSAtVqdpqEV5957KiB6r0-_Tv677OmgnUXBZtDJEO_IGhe1aBl-W7WRv1Z6Krn00iPXFI21G0SL6XIO8Q8Jk5x3JQ8FeUL65uD-uiL73kKdiVZ8m/s1600/image-1.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPqJRT2bTwb5JTdACAq-8IUkL-IVx-tSAtVqdpqEV5957KiB6r0-_Tv677OmgnUXBZtDJEO_IGhe1aBl-W7WRv1Z6Krn00iPXFI21G0SL6XIO8Q8Jk5x3JQ8FeUL65uD-uiL73kKdiVZ8m/s400/image-1.tiff" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Windows :</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Windows XP SP3 x86</div>
<div class="separator" style="clear: both; text-align: left;">
Windows 7 x64</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
일단 Windows를 kernel debugging하기 위해서 윈도우를 2개 준비합니다.</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz-h0Psh9BdUaSSiPsCqUAYUGpI1gUeR3i7VhMDFQEVod0ZRR5ZLHsamKyGA9vFAaJBdybkaeoC7KAsVy7K4KwOTcasBSRKjdDzuao4XuowE3JTptfWQ-8UZr9hg2vlGN368GVw67VU80v/s1600/image-2.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz-h0Psh9BdUaSSiPsCqUAYUGpI1gUeR3i7VhMDFQEVod0ZRR5ZLHsamKyGA9vFAaJBdybkaeoC7KAsVy7K4KwOTcasBSRKjdDzuao4XuowE3JTptfWQ-8UZr9hg2vlGN368GVw67VU80v/s1600/image-2.tiff" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
저는 "Windows 7_64"을 클라이언트, 즉 Kernel Debugging을 할 대상으로 사용합니다.</div>
<div class="separator" style="clear: both; text-align: left;">
"Windows XP SP3 x86"에 Windbg를 설치해서 디버깅을 합니다. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
그렇다면 클라이언트(Windows 7)를 설정해보겠습니다. 아주 간단!!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2 style="text-align: left;">
2. 가상 머신 셋팅하기</h2>
<h3 style="text-align: left;">
클라이언트 설정</h3>
<div class="separator" style="clear: both; text-align: left;">
[ * ] 가상 컴퓨터 -> 구성 -> 장치 추가 -> 시리얼 포트 -> 원본 : 새 소캣 -> "/tmp/com_1" 입력 -> 모드 : 클라이언트 -> 연결 check!</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicJluowuQBSZRX10v5JglA6n6bNXa8DMUWO9yW2qGheqFy5K55EqfLsdwaSVvhEz8asy_QIhMUnVUOmMs9X8mOufKUQCro31eWKJYJYUsu_WhFXWRhDtjMY7Yz1DbR758jESxujydmzXtP/s1600/image-3.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="420" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicJluowuQBSZRX10v5JglA6n6bNXa8DMUWO9yW2qGheqFy5K55EqfLsdwaSVvhEz8asy_QIhMUnVUOmMs9X8mOufKUQCro31eWKJYJYUsu_WhFXWRhDtjMY7Yz1DbR758jESxujydmzXtP/s640/image-3.tiff" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuFDe6K-A7awOXxXOPj2R3YIthKNa7EIDmw5qr5hV9gCFGTkaLM0zd7Ub58TpMZp86iIzpFWMjh5l937gfOeN7q2VipYhKUz_DPDpXQ_ofggAkkpp8F2o7nezKiV4TSwJG7BPlF3GRO_oA/s1600/image-4.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="518" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuFDe6K-A7awOXxXOPj2R3YIthKNa7EIDmw5qr5hV9gCFGTkaLM0zd7Ub58TpMZp86iIzpFWMjh5l937gfOeN7q2VipYhKUz_DPDpXQ_ofggAkkpp8F2o7nezKiV4TSwJG7BPlF3GRO_oA/s640/image-4.tiff" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
클라이언트의 구성을 맞췄으니 이제 서버(Windows XP)를 구성해보겠습니다.</div>
<h3 style="text-align: left;">
서버 설정</h3>
<div class="separator" style="clear: both; text-align: left;">
[ * ] 가상 컴퓨터 -> 구성 -> 장치 추가 -> 시리얼 포트 -> 원본 : 새 소캣 -> "/tmp/com_1" 입력 -> 모드 : 서버 -> 연결 check!</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglBn7A4WkoAD2dsxWF2E4YfQ-igloujvmfKT_bTM2CQUKZZpR1fIPfn2THQW_2cxIP3UIc_oKvSevG-QXFQ2V7f5UpLzVe5iYMZt0HsvNt3iZtUKM_dkCRElLDhsxrLwl7UKAsWmwQ-sXf/s1600/image-5.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglBn7A4WkoAD2dsxWF2E4YfQ-igloujvmfKT_bTM2CQUKZZpR1fIPfn2THQW_2cxIP3UIc_oKvSevG-QXFQ2V7f5UpLzVe5iYMZt0HsvNt3iZtUKM_dkCRElLDhsxrLwl7UKAsWmwQ-sXf/s640/image-5.tiff" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtd9HpikQpZyzKL2lFlA3s9S3nwoKG3X4LoKhIIaenCloVcU6p1Q-wwgsJmehtAUBjwARHigI2cn4ZpVX0lyQAXdp-UinJiFWuVKM_T34DRZFmS2Jm7uqqsxhoMN-KCi6BWcR300Xh0Rbk/s1600/image-6.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="522" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtd9HpikQpZyzKL2lFlA3s9S3nwoKG3X4LoKhIIaenCloVcU6p1Q-wwgsJmehtAUBjwARHigI2cn4ZpVX0lyQAXdp-UinJiFWuVKM_T34DRZFmS2Jm7uqqsxhoMN-KCi6BWcR300Xh0Rbk/s640/image-6.tiff" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
여기서 중요한 점이 있습니다.</div>
<div class="separator" style="clear: both; text-align: left;">
시리얼 포트를 서버와 클라이언트로 설정해 두었기 때문에, 클라이언트를 실행하기 전에 서버를 부팅해놔야지 클라이언트의 포트가 연결됩니다. 서버를 부팅안하고, 클라이언트를 부팅하게 되면</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijGmRHbwMtUsafqX6yCLf4wbRj6yLudL6dv0FUbLvr9qbIcBoLqzEKpgmO9rzT3SC8eIOhuE1sudqGwosST4SQvrQFJ5pV3rjBr1Q6cie9Q_sTgaSj6e6I34NXj5hSaYccCdJl2L0j8Gl6/s1600/image-7.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijGmRHbwMtUsafqX6yCLf4wbRj6yLudL6dv0FUbLvr9qbIcBoLqzEKpgmO9rzT3SC8eIOhuE1sudqGwosST4SQvrQFJ5pV3rjBr1Q6cie9Q_sTgaSj6e6I34NXj5hSaYccCdJl2L0j8Gl6/s1600/image-7.tiff" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
이런 오류를... 보실 수 있으실 겁니다.... 클라이언트를 부팅하기 전에 꼭! 서버를 먼저 부팅하세요~</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2 style="text-align: left;">
3. 서버와 클라이언트 Debugging 셋팅하기</h2>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
이제 클라이언트의 부팅 옵션만 바꿔주면 간단하게 구성이 끝납니다. 여기서 주의할 점은, 클라이언트의 OS마다 설정 방법이 다 다릅니다. 저의 경우 Windows7을 사용하였구요, Windows XP를 클라이언트로 사용한다면 Windows XP로 설정 방법을 검색하시면 많이 나올 겁니다. </div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both;">
<br /></div>
<h3>
클라이언트 설정</h3>
<br />
<div class="separator" style="clear: both; text-align: left;">
일단 클라이언트(Windows 7)을 부팅하구요~</div>
<div class="separator" style="clear: both; text-align: left;">
[ * ] 시작 -> msconfig -> 부팅 -> 고급 옵션(V)... -> 디버그 Check! -> 디버그 포트(E) Check! (COM1) -> 전송 속도 Check! (115200) -> 확인 -> 확인</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIU_3IWjxKvFcL6EYrtF-lThB1Ki1ona6MVfZOLOPrrS0ZBfCA6SnRqWoFYsGMtUhf-XjQFE2gsJtnLdkfWpRVkhePgYle9MPLEDD4MY3lS_IFaIACBm4YUhgyAUa2fyzdFrNxcqpq0z5I/s1600/image-8.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIU_3IWjxKvFcL6EYrtF-lThB1Ki1ona6MVfZOLOPrrS0ZBfCA6SnRqWoFYsGMtUhf-XjQFE2gsJtnLdkfWpRVkhePgYle9MPLEDD4MY3lS_IFaIACBm4YUhgyAUa2fyzdFrNxcqpq0z5I/s1600/image-8.tiff" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhByYYhiVw4Wii5PUXrYXnanLSxO2BdKK6geHiWoG5CsMStMivmKGg6oEIwG4b5X0vf_3NT0ZGefdOok-bA5315yANd2eq_HECQBYZYxA7gbqpAjEhfyEAZ25rJYoZr61GnOcWhIglCYA-z/s1600/image-9.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="375" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhByYYhiVw4Wii5PUXrYXnanLSxO2BdKK6geHiWoG5CsMStMivmKGg6oEIwG4b5X0vf_3NT0ZGefdOok-bA5315yANd2eq_HECQBYZYxA7gbqpAjEhfyEAZ25rJYoZr61GnOcWhIglCYA-z/s640/image-9.tiff" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
이제 클라이언트의 설정은 모두 끝났습니다. 이제 서버에서 windbg를 설정해서 정말로 kernel debugging이 가능한지! 확인을 해봅시당</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
서버 설정</h3>
<div class="separator" style="clear: both; text-align: left;">
일단 서버에 Windbg를 설치하시구요. </div>
<div class="separator" style="clear: both; text-align: left;">
Windbg -> file -> Kernel Debug... -> Baud Rate: "115200" -> Port: "com1" -> 확인!</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRt5viWr5gOtNgRcZoYQdzTsDizE1x16M2pKYdjCkbyj-juUuu32vCJFN5zJ6vMCv_sCgaxGkWNf943-xiEKUvERxyUDK4I6gU-X9FLT-o2S0GEylpG2Z8cSqhGPsTptxb5CD0Qnhn4bo-/s1600/image-10.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRt5viWr5gOtNgRcZoYQdzTsDizE1x16M2pKYdjCkbyj-juUuu32vCJFN5zJ6vMCv_sCgaxGkWNf943-xiEKUvERxyUDK4I6gU-X9FLT-o2S0GEylpG2Z8cSqhGPsTptxb5CD0Qnhn4bo-/s640/image-10.tiff" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
클라이언트에서 설정했던 값과 똑같이 맞춰줍니다. 클라이언트에서 사용했던 값이나 서버에서 사용했던 값이나 둘다 디폴트로 맞춰져있기 때문에 틀릴 일은 없을 거에요.</div>
<div class="separator" style="clear: both; text-align: left;">
확인 버튼 까지 누른다면 windbg가 디버깅을 하기 위해 대기중인 상태가 됩니다.</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlLWdEMPnJLtUFmmDejXSiteergl_mpHP2LaknLdz4Pz66W5h3YKqELrC1YapL82OW1UgWzdS8fTpfSX_MWshteDCWNzXtfZm7tvLfN5SY2sj1ifm36r7itso7AEyEknZpXVunYIVzYMUm/s1600/image-11.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="406" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlLWdEMPnJLtUFmmDejXSiteergl_mpHP2LaknLdz4Pz66W5h3YKqELrC1YapL82OW1UgWzdS8fTpfSX_MWshteDCWNzXtfZm7tvLfN5SY2sj1ifm36r7itso7AEyEknZpXVunYIVzYMUm/s640/image-11.tiff" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
딱 봐도 아시다 시피 시리얼 포트로 신호가 오기 전까지 기다리고 있다는 것이죠.</div>
<h2>
디버깅 시작!</h2>
<div class="separator" style="clear: both; text-align: left;">
서버도 설정을 맞췄으니, 이제 클라이언트를 부팅을 한다면, 클라이언트에서 서버로 시리얼 포트로 신호가 가서 커널 디버깅이 가능해집니다.</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge1sRatlzX2gpeNox4OQXuZM0f5niVay0nFKEwScEVa1nUGXrPCrtqhsVCelXqbfriusJu0S0-_DOAC9uBbZz0MMdwoENoJhJqbOj5u6gW_MYJgRDiJ0csOhyphenhyphenwWri-9awpEVQICcoiTKAT/s1600/image-12.tiff" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="398" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge1sRatlzX2gpeNox4OQXuZM0f5niVay0nFKEwScEVa1nUGXrPCrtqhsVCelXqbfriusJu0S0-_DOAC9uBbZz0MMdwoENoJhJqbOj5u6gW_MYJgRDiJ0csOhyphenhyphenwWri-9awpEVQICcoiTKAT/s640/image-12.tiff" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
신호가 아주 빠르게 잘됩니다. 가상 머신 2개를 이용해서 디버깅을 하는 거라 속도가 느릴 줄 알았는데, 아주 느린 정도는 아니라서 다행입니다.</div>
<div class="separator" style="clear: both; text-align: left;">
추가로 커널 디버깅을 할 때 Windows의 심볼을 가지고 오는 게 정신 건강에 이로울 겁니다....</div>
<div class="separator" style="clear: both; text-align: left;">
그거에 관한 것은 많은 블로그에서 설명하고 있고, 이번 글에서 정리할 필요가 없기 때문에 전 패쓰~ 하겠습니다</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
참고했던 사이트 : http://vcsjones.com/2012/04/17/kernel-debugging-with-parallels/</div>
<div style="text-align: left;">
<br /></div>
S3izehttp://www.blogger.com/profile/04765215720110662096noreply@blogger.com0tag:blogger.com,1999:blog-2228223462652033369.post-23419870845897446732012-08-15T03:16:00.000-07:002018-05-05T22:54:18.659-07:00[Tip] Linux Objdump [2] 오브젝트 파일 역어셈블개인 노트이므로 반말이 있어도 양해부탁드립니다.<br />
<br />
<h3>
objdump를 이용한 오브젝트 파일 disassemble</h3>
objdump는 ELF 바이너리인 경우 디어셈블을 할 수 있는데, 디어셈블을 할 때는 -d 옵션(--disassemble 옵션)을 사용합니다.<br />
<br />
[*] objdump -d test<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUZ-ev8pIno4ofrkxQDN_u42ZpiLl5JklYGdsvRU0CFbtzzagKhCp72MqDpb7QIWYlsTUPMVDvgzJ9Y2jobq0uyd3Ej5e6yeAx5wLJU4PVDQqC3KUjVnzqTqRfCX0Qfay2o_1BXFHlhgPr/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+6.44.36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUZ-ev8pIno4ofrkxQDN_u42ZpiLl5JklYGdsvRU0CFbtzzagKhCp72MqDpb7QIWYlsTUPMVDvgzJ9Y2jobq0uyd3Ej5e6yeAx5wLJU4PVDQqC3KUjVnzqTqRfCX0Qfay2o_1BXFHlhgPr/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+6.44.36.png" height="400" width="372" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbyaT9UR-JygYWPXf5rWEP0J7JfI3tYpyp03wCm48u0MjkM8VnXQ8jruVQWvpf4Z9OFax7kaxTSwNIh63m21RgAPMPcG5BPlv4ozeOamgEWN6S_bDMKWdJCYwIpH81nvZhj7uOT684FXkr/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+6.44.53.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbyaT9UR-JygYWPXf5rWEP0J7JfI3tYpyp03wCm48u0MjkM8VnXQ8jruVQWvpf4Z9OFax7kaxTSwNIh63m21RgAPMPcG5BPlv4ozeOamgEWN6S_bDMKWdJCYwIpH81nvZhj7uOT684FXkr/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+6.44.53.png" height="265" width="400" /></a></div>
<div style="text-align: center;">
[#] 너무 길어서 이번에도 많은 부분을 생략.....!</div>
출력 형식<br />
주소 <심볼> :<br />
주소: OPCODE 디어셈블 코드<br />
<br />
이런 형식으로 출력을 해줍니다. 이 때 OPCODE가 불필요하다면 --no-show-raw-insn 옵션을 사용하여 OPCODE을 출력안하게 만들 수 있습니다.<br />
<br />
[*] objdump -d --no-show-raw-insn test<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDnAy1Ic1tWoeYkvYMb3FnXsTI7SjyyKPYkW8VlGGMoGJE3GBh6SsUYxb6J9Oy45b_Za2QpKH2NbWdTItLM4rlEMea53tXDptfXOlXS6hG5Vh_TPDe1wfe19mzOtkCfezuoa8TnvNA9TOk/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+6.51.33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDnAy1Ic1tWoeYkvYMb3FnXsTI7SjyyKPYkW8VlGGMoGJE3GBh6SsUYxb6J9Oy45b_Za2QpKH2NbWdTItLM4rlEMea53tXDptfXOlXS6hG5Vh_TPDe1wfe19mzOtkCfezuoa8TnvNA9TOk/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+6.51.33.png" height="279" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
[#] 너무 길어서 이번에도 많은 부분을 생략.....!<span style="text-align: left;"> </span></div>
<br />
<br />
위와 같은 -d 옵션으로 디어셈블할 때는 실행 코드가 있는 섹션(.text 등)을 디어셈블리의 대상으로 합니다. 하지만 모든 섹션을 대상으로 할 경우에는 <b>-D 옵션(--disassemble-all 옵션)</b>을 사용합니다.<br />
<br />
<h3>
objdump로 특정 섹션, 주소 범위만 디어셈블하기</h3>
특정 섹션을 지정해서 디어셈블을 할 수도 있습니다. 섹션 지정은 덤프할 때와 마찬가지로 -j 옵션( --section 옵션)을 사용합니다.<br />
<br />
[*] objdump -d -j .init test<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje1ioPOeIsmqWpOeEtVz0osc8tBQI0ZnwtDzU1cxHiaRPTSO0HAqp14WBUNdNWddngpsn4c3kfWglByfoSiaNQYP-spkh_VrtgYVVvahIaQaNDiQmVnR-BOllEgT3O348oj_oF8hiQL_6a/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+6.57.35.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje1ioPOeIsmqWpOeEtVz0osc8tBQI0ZnwtDzU1cxHiaRPTSO0HAqp14WBUNdNWddngpsn4c3kfWglByfoSiaNQYP-spkh_VrtgYVVvahIaQaNDiQmVnR-BOllEgT3O348oj_oF8hiQL_6a/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+6.57.35.png" height="276" width="400" /></a></div>
<div style="text-align: center;">
[#] .init섹션만을 디어셈블 했다. </div>
<br />
덤프와 마찬가지로 디어셈블도 주소를 지정하여 디어셈블할수도 있습니다. 하는 방법은 덤프할 때와 마찬가지로 --start-address, --stop-address 옵션을 사용합니다.<br />
<br />
[*] objdump -d test<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGx1RO3mqW028SgZOi81heQbJIEb50ECcO0VnCiy7hF8ddFm4-6GAQzy1n6mnMEudor1Dv6AyEUKldJpGSYak1DmixAJ5F9jV06PZUvFJg5dQt6pQ3j_wggz9DmvgkvmjAHu1SbdR604HJ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.01.36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGx1RO3mqW028SgZOi81heQbJIEb50ECcO0VnCiy7hF8ddFm4-6GAQzy1n6mnMEudor1Dv6AyEUKldJpGSYak1DmixAJ5F9jV06PZUvFJg5dQt6pQ3j_wggz9DmvgkvmjAHu1SbdR604HJ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.01.36.png" height="154" width="400" /></a></div>
<div style="text-align: center;">
[#]일단 주소를 알아낼려면 디어셈블을 하고, main의 주소를 기억해두고</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA2IrYy2OyTkFNBrtFhCJom-rXx2pdC0-0a4oZ2ZtnAN0-oG-uJsfibE_rPcJSuC8Wc9Irx4ZbJ2rs3TwZR-UpkSkbQHnepBfU9Yet5WcCWciNYW_dwoIcrvm5MMHUycJyPlVooU6lNRw8/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.02.20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA2IrYy2OyTkFNBrtFhCJom-rXx2pdC0-0a4oZ2ZtnAN0-oG-uJsfibE_rPcJSuC8Wc9Irx4ZbJ2rs3TwZR-UpkSkbQHnepBfU9Yet5WcCWciNYW_dwoIcrvm5MMHUycJyPlVooU6lNRw8/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.02.20.png" height="220" width="400" /></a></div>
<div style="text-align: center;">
[#] 시작주소와 끝 주소를 지정하여 디어셈블합니다.</div>
<br />
출력된 결과물을 파일로 저장하고싶다면 " > " 을 이용하여 파일로 출력할 수 있습니다.<br />
<br />
[*] objdump -d --start-address=0x80483e4 --stop-address=0x80483ff test > test.txt<br />
[*] cat test.txt<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjth-usF_p06UzkiXoX7d5BjQ61FfbnRPOy399-ohqhiIvP5KORpnZdG9m1ckjim9QyIHfgfSh288ykRI1r5Zkdkbm0Cz-PQ9hhxOGdfxmz0izDEao1PWOKfeeurFYH5uAzS-5LNORwObID/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.05.17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjth-usF_p06UzkiXoX7d5BjQ61FfbnRPOy399-ohqhiIvP5KORpnZdG9m1ckjim9QyIHfgfSh288ykRI1r5Zkdkbm0Cz-PQ9hhxOGdfxmz0izDEao1PWOKfeeurFYH5uAzS-5LNORwObID/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.05.17.png" height="220" width="400" /></a></div>
<div style="text-align: center;">
[#] 파일로 저장된 것을 확인할 수 있습니다.</div>
<br />
<h3>
소스 파일과 함께 출력하기</h3>
디버그 정보를 포함하고 있는 오브젝트 파일의 경우 -l 옵션(--line-numbers 옵션)을 사용하면, 각각의 코드에 대응하는 소스코드의 행에 관한 정보도 출력됩니다. 디버그 정보가 포함되어 있지 않은 경우에는 -l 옵션을 지정해도 의미가 없습니다.<br />
<br />
디버그 정보를 포함하고 있는 오브젝트파일을 생성하는 하려면 컴파일 할 때 -g 옵션을 사용합니다.<br />
<br />
[*] gcc -g -o degtest file1.c<br />
[*] objdump -d -l degtest <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRBrdb0bY9ZC7JZKrX25ql0NH7PoeguiMccij70-cL20yegJdguDTky0g2dZlfeLm-RxB99kgy75kMQDAkZ6rxPqiLdOB_SPw3w3n7DxxoeB7HyF_IksuvnwvzFTQkj3CcFogZQxRoUkfO/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.09.40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRBrdb0bY9ZC7JZKrX25ql0NH7PoeguiMccij70-cL20yegJdguDTky0g2dZlfeLm-RxB99kgy75kMQDAkZ6rxPqiLdOB_SPw3w3n7DxxoeB7HyF_IksuvnwvzFTQkj3CcFogZQxRoUkfO/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.09.40.png" height="203" width="400" /></a></div>
<div style="text-align: center;">
[#] 많은 것을 출력해주지만 main부분만을 스크린샷을 찍었다.</div>
만약 소스 파일이 존재하고 -S 옵션(--source 옵션)을 추가하면 -l 옵션의 행 번호에 해당하는 소스코드가 그 위치에 삽입되어 출력됩니다. (훨씬 보기 편하겠죠)<br />
<br />
[*] objdump -d -S degtest<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfMs74knKOFfav04H0ZZIDk4DNUW67UuLpWSILzkpFGpIrSicJbyTwQI8zGqbyojpr1IZIMbmqhnuXGf92CREEPRRs-2aZc10MU4O0vS2cKNSuYcKv8iP2J9nQ95yMiKEQjsrlQ6hM1SyH/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.11.50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfMs74knKOFfav04H0ZZIDk4DNUW67UuLpWSILzkpFGpIrSicJbyTwQI8zGqbyojpr1IZIMbmqhnuXGf92CREEPRRs-2aZc10MU4O0vS2cKNSuYcKv8iP2J9nQ95yMiKEQjsrlQ6hM1SyH/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+7.11.50.png" height="227" width="400" /></a></div>
<div style="text-align: center;">
[#] main함수부분이 이쁘게 뭐가있는지 출력되는 것을 확인할 수 있다.</div>
S3izehttp://www.blogger.com/profile/04765215720110662096noreply@blogger.com0tag:blogger.com,1999:blog-2228223462652033369.post-39849084946238360912012-08-15T01:24:00.001-07:002018-05-05T22:54:18.733-07:00[Tip] Linux Objdump [1] 오브젝트 파일 덤프<h3>
objdump를 이용한 ELF 바이너리 덤프</h3>
objdump 명령은 하나 이상의 옵션을 사용해야만 필요한 정보를 출력할 수 있습니다. 일반적인 덤프를 하려는 경우에는 -s 옵션(--full-contents 옵션)을 사용합니다.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsxSxSWrh1lVk-N06LqMvDZ3b4mTRRSAkQWs6d0anmAKxB1y8demmVAbWTKS1Qd1evoOWWw6x8buZNFVVVwsQ_dVTVmkmnV95XsqYrNFixr-HYSThgfRGqxKCaYiGreIaVoQkUMFEQU5tB/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+4.47.43.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsxSxSWrh1lVk-N06LqMvDZ3b4mTRRSAkQWs6d0anmAKxB1y8demmVAbWTKS1Qd1evoOWWw6x8buZNFVVVwsQ_dVTVmkmnV95XsqYrNFixr-HYSThgfRGqxKCaYiGreIaVoQkUMFEQU5tB/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+4.47.43.png" height="319" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
[#] 너무 길어서 아랫부분은 생략....</div>
<h4>
출력 형식</h4>
<div class="separator" style="clear: both; text-align: left;">
메모리 주소 | 16진수 덤프(4바이트 * 4 ) | 아스키 코드</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
ELF 바이너리의 파일 형식 및 각 섹션 별 내용을 덤프해서 출력해줍니다. </div>
<div class="separator" style="clear: both; text-align: left;">
여기서 16진수 덤프는 x86과 같은 리틀 엔디안 아키텍처에서 실행해도 빅 엔디안으로 출력해줍니다. 예를 들면 .interp의 최초 4바이트는 ASCII로 '/lib'이지만, 16진수로는 2f 6c 69 62순으로 출력되었으므로 리틀엔디안이 아닙니다. objdump에는 -endian옵션이 있지만 이 옵션은 단지 objdump로 디스어셈블할 경우에만 영향을 줄 뿐 출력시에는 영향을 주지 않습니다.</div>
<div class="separator" style="clear: both; text-align: left;">
이와 같이 -s 옵션만 사용한 경우에는 기본적인 오브젝트 형식으로 출력되는데요. 통상 elf32-i386 이므로 섹션별로 식별해서 덤프하게 됩니다. 오브젝트 형식은 -b 옵션(--target 옵션)으로 지정할 수 있습니다. 지정 가능한 오브젝트 형식은 -i 옵션(--info 옵션)으로 확인할 수 있습니다.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzIfQBCzjcpyLTNE2yvCG7Dwn5DAk2r41eN6c0mJ6qbSwIWADLWzP108PLZh6S5lSZhyMr-p6BfimCdotXF1NOXwFNO787HZoQcFmTLRKn4t1G5jJFtFncK8ypJBbXhM6sZd_7ad9FRnb4/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+4.52.24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzIfQBCzjcpyLTNE2yvCG7Dwn5DAk2r41eN6c0mJ6qbSwIWADLWzP108PLZh6S5lSZhyMr-p6BfimCdotXF1NOXwFNO787HZoQcFmTLRKn4t1G5jJFtFncK8ypJBbXhM6sZd_7ad9FRnb4/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+4.52.24.png" height="400" width="363" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
[#] 이번에도 너무 길어서 아랫부분은 생략하였습니다. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
ELF 바이너리의 특정 섹션 덤프하기</h3>
<div class="separator" style="clear: both; text-align: left;">
특정 섹션만을 덤프하고자 할 경우에는 -j 옵션(section 옵션)으로 섹션명을 지정하여 사용할 수 있습니다.</div>
<div class="separator" style="clear: both; text-align: left;">
그전에 어떤 섹션이 존재하는 지 확인하는 것은 -s 옵션을 이용해도 되지만, -h 옵션(--section-headers 옵션, --headers 옵션)으로 확인하고 Name부분을 -j 인자로 넣어서 그 섹션을 확인할 수 있습니다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9ue7h4DRfGJg2EDV0EARQwt2gWEnYvXbBnHdhtUMFwMi6rDs4vg4UwFDN1HBnM6k3L_JYXte4LdpGpmrLVveF5WULMMOy-pn40Mu0Acu_QV8JcSMXh2XqKVvn4XUApa5eGO0j4jyeG0PR/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.01.00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9ue7h4DRfGJg2EDV0EARQwt2gWEnYvXbBnHdhtUMFwMi6rDs4vg4UwFDN1HBnM6k3L_JYXte4LdpGpmrLVveF5WULMMOy-pn40Mu0Acu_QV8JcSMXh2XqKVvn4XUApa5eGO0j4jyeG0PR/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.01.00.png" height="349" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
[#] 이번에도 너무 길어서 짤랐습니다...ㅠㅠ</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimQaY-OEbUjxt8R1xR4kMRMJhYHDpD8L_JOuDAjk2HSDRLG1gJqO2lqEIUJKbclFjQq4GM0s5t6vd8xfGGvejI2t7lroy7f0M5_oY-WcOyDhRoUxKm0xqjCB6WWkoipqQBokwcK9GRolW9/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+4.58.35.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimQaY-OEbUjxt8R1xR4kMRMJhYHDpD8L_JOuDAjk2HSDRLG1gJqO2lqEIUJKbclFjQq4GM0s5t6vd8xfGGvejI2t7lroy7f0M5_oY-WcOyDhRoUxKm0xqjCB6WWkoipqQBokwcK9GRolW9/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+4.58.35.png" height="265" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
[#] .got와 .dynamic를 확인해 보았습니다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
-h 옵션으로 어떤 섹션이 있는지 확인하고, 원하는 섹션만을 덤프해보았습니다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
주소 범위를 지정하여 덤프하기</div>
<div class="separator" style="clear: both; text-align: left;">
--start-address 옵션 및 --stop-address 옵션을 사용하면 덤프할 주소 범위를 지정할 수 있습니다.</div>
<div class="separator" style="clear: both; text-align: left;">
직접 알아보기 위해 앞에서 보았던 .dynamic영역을 확인하기 위해 시작 주소와 끝 주소를 찾습니다.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz6cJnmWzxjvUIc7J9iQGM-281opST1Bh9uMYJWsYik8E38j6SzlJk_e55qldhmatWj-qljjDAnQwknTqwgXjCOAPNhqnzc4E2i7yfr_Mcyil5tqcvygh6piozZXi1nxDD1uSwZwBomfEO/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.09.37.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz6cJnmWzxjvUIc7J9iQGM-281opST1Bh9uMYJWsYik8E38j6SzlJk_e55qldhmatWj-qljjDAnQwknTqwgXjCOAPNhqnzc4E2i7yfr_Mcyil5tqcvygh6piozZXi1nxDD1uSwZwBomfEO/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.09.37.png" height="177" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
[#] 스샷을 보면 .dynamic의 시작주소 = 0x08049f20, 끝주소 = 0x08049fef(.got영역 -1해줘야 겠죠?)</div>
<div class="separator" style="clear: both; text-align: left;">
인 것을 알 수 있습니다. 이 두 주소를 사용하여 dynamic영역만을 덤프해 볼 수 있습니다.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhInEkd2f5MQZsbw-dWpU9vO0kzHVMyyKxEDIt8D8VCV-NsJdKUK4Pum4nWLHrLFzdIGNf2u7dZZdzCnrmTVd0NzpWxt4Dc8o9df6QEVFry2JvUbXQcN1H7PyXC1YaGJjQTmpqbyhEsLMJR/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.13.01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhInEkd2f5MQZsbw-dWpU9vO0kzHVMyyKxEDIt8D8VCV-NsJdKUK4Pum4nWLHrLFzdIGNf2u7dZZdzCnrmTVd0NzpWxt4Dc8o9df6QEVFry2JvUbXQcN1H7PyXC1YaGJjQTmpqbyhEsLMJR/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.13.01.png" height="199" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
objdump로 바이너리 덤프하기</h3>
<div class="separator" style="clear: both; text-align: left;">
ELF 형식이 아닌 파일 또는 ELF 파일을 ELF가 아니라 그저 바이너리 파일로 덤프하고자 할 경우에는 오브젝트 형식으로 binary를 지정하면 됩니다.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-JOEdMa1VxgfmbFjwgKhNnf5NZ3DoaA6sjAscf8T-1KbCMZrBi1qtYoM5fryjGbUJsUWjGVwutxjyXP_1rXcxdzOmFVOhZdOICYY3iZnJ2sG7xH6VVL_qnIk-XKzW_2_nh4zneMVRpiQl/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.16.20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-JOEdMa1VxgfmbFjwgKhNnf5NZ3DoaA6sjAscf8T-1KbCMZrBi1qtYoM5fryjGbUJsUWjGVwutxjyXP_1rXcxdzOmFVOhZdOICYY3iZnJ2sG7xH6VVL_qnIk-XKzW_2_nh4zneMVRpiQl/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.16.20.png" height="307" width="400" /></a></div>
<div style="text-align: center;">
[#] ELF파일을 binary로 덤프 뜬 경우... 너무 길어서... 아래는 생략=ㅁ=</div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhsakYcxOZSmmCq2AMaPOzNFNteaiOqnpKa8cvxGQMYrJuqpAoQ06s6Hr94kyl12dCSzqm-Wrvld1T5sZhyXEa0ie8M1x3DFsg8TXTA1rzSB_iZS4o5vwChVFVCi-AH4P5ZLeo1Ok3nAkP/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.16.53.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhsakYcxOZSmmCq2AMaPOzNFNteaiOqnpKa8cvxGQMYrJuqpAoQ06s6Hr94kyl12dCSzqm-Wrvld1T5sZhyXEa0ie8M1x3DFsg8TXTA1rzSB_iZS4o5vwChVFVCi-AH4P5ZLeo1Ok3nAkP/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.16.53.png" height="188" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
[#] binary파일을 덤프 출력.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
binary파일을 출력할 때 조심할 점은. objdump가 binary을 인식하지 못하는 것입니다. 그래서 binary파일을 덤프할 땐 꼭 -b binary을 지정해줘야지 출력이 됩니다.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdTykY6tW-PfOiEV74lFcM8vC2gANURTSTcjtZ4MmQg6qur5_-kHzl-u8q_n_ASBC823Xgm3P3ZBzNimvPjrtXefQZ0Cb5_YaO32HlG-qXm7uKj6t7E1TvQhj5zbDX10CAZG2zrC-qiA0M/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.19.47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdTykY6tW-PfOiEV74lFcM8vC2gANURTSTcjtZ4MmQg6qur5_-kHzl-u8q_n_ASBC823Xgm3P3ZBzNimvPjrtXefQZ0Cb5_YaO32HlG-qXm7uKj6t7E1TvQhj5zbDX10CAZG2zrC-qiA0M/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-15+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+5.19.47.png" height="121" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
포스팅에 사용한 명령어</h3>
<div class="separator" style="clear: both; text-align: left;">
$ objdump -s test # 덤프 출력</div>
<div class="separator" style="clear: both; text-align: left;">
$ objdump -i #지정 가능한 오브젝트 파일 정보 출력</div>
<div class="separator" style="clear: both; text-align: left;">
$ objdump -h test #섹션 헤더 출력</div>
<div class="separator" style="clear: both; text-align: left;">
$ objdump -s -j .got text # .got 섹션 출력</div>
<div class="separator" style="clear: both; text-align: left;">
$ objdump -s -j .dynamic text # .dynamic 섹션 출력</div>
<div class="separator" style="clear: both; text-align: left;">
$ objdump -s --start-address=0x8049f20 --stop-address=0x8049fef test #시작주소와 끝주소 사이 출력</div>
<div class="separator" style="clear: both; text-align: left;">
$ objdump -s -b binary test #바이너리로 출력</div>
<div class="separator" style="clear: both; text-align: left;">
$ objdump -s -b binary file1.c #바이너리로 출력</div>
S3izehttp://www.blogger.com/profile/04765215720110662096noreply@blogger.com0tag:blogger.com,1999:blog-2228223462652033369.post-19156737617641970742012-08-11T19:44:00.001-07:002018-05-05T22:53:48.734-07:00[Tip] Linux ELF File 구조오브젝트 파일은 컴파일러가 생성한 중간 단계의 파일을 말하며 기계어 코드만이 아니라, 심볼 테이블, 디버그 정보, 재배치 정보 등 다양한 정보를 포함하고 있다.<br />
이번 포스팅에서는 오브젝트 파일에 포함되는 정보를 추출하는 방법과 오브젝트파일을 조작하는 방법을 소개한다.<br />
<br />
ELF 파일<br />
ELF는 Executable and Linking Format의 약자로 실행 가능한 바이너리 또는 오브젝트 파일 등의 형식을 규정한 것이다. ELF 파일은 ELF 헤더가 맨 앞에 위치하고, 프로그램 헤더 테이블과 섹션 헤더 테이블이 그 뒤에 위치한다.<br />
ELF파일의 헤더의 구조는 elf.h에 저장되어 있다.<br />
<br />
<b>ELF 헤더</b><br />
ELF 파일 맨 앞에 반드시 존재하며, 그 부분이 ELF 파일임을 나타낸다. ELF 파일 헤더 내용은 "readelf"의 -h 옵션(--file-header 옵션)을 사용해서 볼 수 있다.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgyG9_aFjshsIaELHfCwpwYKvP8j01X0bwXsJE8CKnXbLPgZRcwA91dPqhs7-Wxpf-h0Bg9_hwRzw_RgFVtJ3YEspRu0o_iNG2LlEtX9Iwe61Z261e6rX1eNbYBwiwSQqumh6YM29Hc6RJ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+11.45.02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgyG9_aFjshsIaELHfCwpwYKvP8j01X0bwXsJE8CKnXbLPgZRcwA91dPqhs7-Wxpf-h0Bg9_hwRzw_RgFVtJ3YEspRu0o_iNG2LlEtX9Iwe61Z261e6rX1eNbYBwiwSQqumh6YM29Hc6RJ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+11.45.02.png" height="255" width="400" /></a></div>
<br />
<br />
<div style="text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiioR7GYiRJFnwy2flDquPxdYFQJ3SoOWEqGJdccbJZjJjHzM1DWEiXOgHLepgZVUzhH61-euCapCPH0dv92TNMWoBho_ns6sV2qHHK4t-N3OGQuKQsG2_kJsnESFuhnE84gdunXthyMOA6/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+11.55.45.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiioR7GYiRJFnwy2flDquPxdYFQJ3SoOWEqGJdccbJZjJjHzM1DWEiXOgHLepgZVUzhH61-euCapCPH0dv92TNMWoBho_ns6sV2qHHK4t-N3OGQuKQsG2_kJsnESFuhnE84gdunXthyMOA6/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+11.55.45.png" height="67" width="400" /></a></div>
<br />
<br />
<br />
<span style="text-align: left;"> ELF 파일은 첫 4바이트<span style="color: blue;"><b>(파란색)</b></span>에 "0x7F 0x45 0x4C 0x46"(ASCII "\177ELF") 매직넘버를 가지고 있다. 그다음 바이트<span style="color: red;"><b>(빨간색)</b></span>는 엔디안을 나타내는데, 리틀 엔디안의 경우 1,빅 엔디안의 경우 2를 사용한다. 그 다음바이트<span style="color: yellow;"><b>(노란색)</b></span>는 ELF의 버전과 <span style="color: magenta;"><b>(보라색)</b></span>OS,ABI 등의 정보를 나타낸다. </span><br />
<span style="text-align: left;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHGTNSsn_LLnuZ4XflQduZrYPFjrPnrfwOoO5VmZG2riENBr2ui0-MYCCnvxCyPh3MBdw-ljbCTXPmYgefjD_a-8VnMBqP79rlgN0fPKFCcOZyzqMwcMoLOX7H4YQWFA6rqpvSRnDHPr-l/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.02.09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHGTNSsn_LLnuZ4XflQduZrYPFjrPnrfwOoO5VmZG2riENBr2ui0-MYCCnvxCyPh3MBdw-ljbCTXPmYgefjD_a-8VnMBqP79rlgN0fPKFCcOZyzqMwcMoLOX7H4YQWFA6rqpvSRnDHPr-l/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.02.09.png" height="145" width="400" /></a></div>
<br />
<ul>
<li>type : 4가지 타입이 존재한다.</li>
<ul>
<li>REL , 바이너리 1, 재배치 가능한 파일</li>
<li>EXEC, 바이너리 2, 실행 가능한 파일</li>
<li>DYN, 바이너리 3, 공유 오브젝트 파일</li>
<li>CORE, 바이너리 4, 코어 파일</li>
</ul>
<li>Machine : 아키텍처 타입을 나타낸다. </li>
<li>entry point address : 이 ELF에서 실행 시작하는 가상 주소이다. 실제 바이너리 안에 있다. 이부분을 이용할 수도 있지 않을까..?</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a checked_link="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0k3svB3SVq3jd6yiui1nkltubXrYkIQffzkzzYqCFbvEVGRuXFU0Wmw_f_Jj7rdQIBVgA3b_sQq-epBashKkcH07efKav5ZNNwYzkMLWV_NmpOhX9_Bs96fHrjmnTzIEYEpj2L20fs-x0/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.07.28.png" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0k3svB3SVq3jd6yiui1nkltubXrYkIQffzkzzYqCFbvEVGRuXFU0Wmw_f_Jj7rdQIBVgA3b_sQq-epBashKkcH07efKav5ZNNwYzkMLWV_NmpOhX9_Bs96fHrjmnTzIEYEpj2L20fs-x0/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.07.28.png" imageanchor="1" in_tag="ul" kaspersky_status="pending" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0k3svB3SVq3jd6yiui1nkltubXrYkIQffzkzzYqCFbvEVGRuXFU0Wmw_f_Jj7rdQIBVgA3b_sQq-epBashKkcH07efKav5ZNNwYzkMLWV_NmpOhX9_Bs96fHrjmnTzIEYEpj2L20fs-x0/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.07.28.png" height="32" width="400" /></a></div>
<br />
<ul>
<li>나머지는 그대로 읽으면 알 수 있겠지요...~</li>
</ul>
<br />
<b>프로그램 헤더</b><br />
ELF 헤더에서 정의되있는 부분을 참고하여 정해진 크기를 갖는 테이블이다.<br />
<br />
<ul>
<li>Start of program headers = 지정된 오프셋에서부터 시작</li>
<li>Size of program headers = 테이블 내의 프로그램 헤더 크기 </li>
<li>Number of program headers = 테이블 내의 프로그램 헤더 개수</li>
</ul>
<br />
즉 프로그램 헤더 테이블의 전체 크기는 Size of program headers * Number of program headers<br />
프로그램 헤더 내용은 "readelf"의 - l 옵션(--program-headers )을 사용해서 볼 수 있다.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT-TA7H3figMQ333Cygh3jhuW8b_yp39MCNy0qPv42IPlvBgIqAbunMRhpLHpLE3zVUlGGUWl1vzRQCoiN_pfhzmciHZyORfMgwPSpuzfq-77MLlp4ghoXLD8-rn5SC4GxYEDv5r3dJUfv/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.17.10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT-TA7H3figMQ333Cygh3jhuW8b_yp39MCNy0qPv42IPlvBgIqAbunMRhpLHpLE3zVUlGGUWl1vzRQCoiN_pfhzmciHZyORfMgwPSpuzfq-77MLlp4ghoXLD8-rn5SC4GxYEDv5r3dJUfv/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.17.10.png" height="333" width="400" /></a></div>
Program Headers 의 각 행에 해당하는 Type<span style="color: blue;"><b>(파란색)</b></span><br />
<br />
<ul>
<li>LOAD, 바이너리 1, 로그된 프로그램 세그먼트</li>
<li>DYNAMIC, 바이너리 2, 동적 링크 정보</li>
<li>INTERP, 바이너리3, 프로그램 인터프리터</li>
<li>NOTE, 바이너리 4, 추가 정보</li>
<li>PHDR, 바이너리 6, 프로그램 헤더 테이블 자신</li>
<li>TLS, 바이너리 7, 스레드 지역 저장소</li>
<li>GNU_EH_FRAME, 바이너리 0x6474e550, GNU .eh_frame_hdr 세그먼트</li>
<li>GNU_EH_STACK, 바이너리 0x6474e551, 스택 실행 가능성</li>
</ul>
"Section to Segment mapping"<span style="color: red;"><b>(빨간색)</b></span> 이후의 행에 나타난 정보는 "Program Headers"의 각 프로그램 헤더에 나타난 세그먼트에 그 세그먼트 메모리 범위를 포함하는 섹션명을 나열하고 있다<br />
<ul>
<li>최초(인덱스 00) 프로그램 헤더에 표시된 세그먼트는 "PHDR"타입, 속하는 섹션 없음</li>
<li>01 프로그램 헤더에 표시된 세그먼트는 "INTERP"타입, 속하는 섹션 .interp</li>
<li>02 프로그램 헤더에 표시된 세그먼트는 "LOAD"타입, 그 안에 좀 많다..?</li>
</ul>
<br />
<b>섹션 헤더</b><br />
ELF 헤더의 Start of Section headers로 지정된 오프셋에서 시작한다. 크기와 갯수는 elf헤더를 보면 딱 알 수 있을 것이다.<br />
섹션 헤더 내용은 "readelf"의 -S 옵션(--section-headers)을 사용해서 볼 수 있다.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNpcjwNlC81t8RBwJzjqM__6RnEaFTqRkHtEooVHcYV_rzOmH8_MaZKsuJIVdKC1WPUS_QDoaeeQgIHa_afKyaQqCuWqc28Dgo-t-LhLa5wivs_iRMlTkM9MTE2GUHBPZ9qJLhRmofHQ_e/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.40.38.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNpcjwNlC81t8RBwJzjqM__6RnEaFTqRkHtEooVHcYV_rzOmH8_MaZKsuJIVdKC1WPUS_QDoaeeQgIHa_afKyaQqCuWqc28Dgo-t-LhLa5wivs_iRMlTkM9MTE2GUHBPZ9qJLhRmofHQ_e/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.40.38.png" height="400" width="359" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div style="text-align: -webkit-auto;">
섹션 타입의 종류</div>
<div style="text-align: -webkit-auto;">
</div>
<ul>
<li>PROGBITS, 1, 프로그램 데이터</li>
<li>SYMTAB, 2, 심볼 테이블</li>
<li>STRTAB, 3, 스트링 테이블</li>
<li>RELA, 4, 재배치 엔트리</li>
<li>HASH, 5, 심볼 해시 테이블</li>
<li>DYNAMIC, 6, 동적 링크 정보</li>
<li>NOTE, 7, notes(호환성 체크를 위한 특별 정호)</li>
<li>NOBITS, 8, 파일상에 데이터가 없는 부분<b>(.bss)</b></li>
<li>REL, 9, 재배치 엔트리</li>
<li>DYNSYM, 11, 동적 링크에서 사용되는 심볼 테이블</li>
<li>INIT_ARRAY, 14, 생성자 배열(.init)</li>
<li>FINI_ARRAY, 15, 파괴자 배열(.init)</li>
<li>GNU_verdef, 0x6ffffffd, 버전 정의 섹션</li>
<li>GNU_verneed, 0x6ffffffe, 버전 중요 섹션</li>
<li>GNU_versym, 0x6fffffff, 버전 심볼 테이블</li>
</ul>
<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b>스트링 테이블</b></div>
<div class="separator" style="clear: both; text-align: left;">
스트링 테이블은 단순한 문자열 리스트이다. type부분이 STRTAB인 부분을 한번 보면,</div>
<div class="separator" style="clear: both; text-align: left;">
[27] .shstrtab 의 오프셋은 0x1037, 크기는 0xee,이므로 OD를 사용하여 이 부분을 한번 보자</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaM3T9Xb8LymilExi584ZBp6P5cmWxzwpEikQTUVkNtZtjAkOCIK2I_nqxihRrqY9h4_iU8_6r2ZpBL78oM5KPLtxBq6upqQ9JyZyiwFXh6oKXsNx5VI6C5eUShgTiuXWU3i56aFv7ndNb/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+1.22.24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaM3T9Xb8LymilExi584ZBp6P5cmWxzwpEikQTUVkNtZtjAkOCIK2I_nqxihRrqY9h4_iU8_6r2ZpBL78oM5KPLtxBq6upqQ9JyZyiwFXh6oKXsNx5VI6C5eUShgTiuXWU3i56aFv7ndNb/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+1.22.24.png" height="178" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
스트링 테이블은 단순히 바이너리파일에서 그대로 긁어오는 것을 알 수 있다.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: left;">
<b>심볼 테이블</b></div>
<div class="separator" style="clear: both; text-align: left;">
심볼 테이블은 심볼과 그 값 등을 대응시키는 테이블이다. </div>
섹션 헤더 내용은 "readelf"의 -s 옵션(--sysms)을 사용해서 볼 수 있다.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxkwiV1Vm0DKQ7Ir1LYEkAEWGNeYatWZQsp-gY7fLxEyCHBCTnORDOYZZhFwcUQfDtcKiII-N1eAPXck3a_tsPvfeHT25ibgJLtTbcbMw4PPWqxzfqT1IP5Pz1uRUEInYCdIaDdchbaE0C/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+1.25.15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxkwiV1Vm0DKQ7Ir1LYEkAEWGNeYatWZQsp-gY7fLxEyCHBCTnORDOYZZhFwcUQfDtcKiII-N1eAPXck3a_tsPvfeHT25ibgJLtTbcbMw4PPWqxzfqT1IP5Pz1uRUEInYCdIaDdchbaE0C/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+1.25.15.png" height="267" width="400" /></a></div>
중략...<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz6xHMYVg8kBi_Whr53kFgJOtlHgKCpU8uqEgb7ZqJ2HYHGugVuD4t7SGbrBPtr2YNjSe1b9GNe39XtOivSqVmn9pZAS_tEIMocluabqmHk7Vpc8UJwEbFpUYK3ukrMTop80-kStShEz2l/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+1.25.32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz6xHMYVg8kBi_Whr53kFgJOtlHgKCpU8uqEgb7ZqJ2HYHGugVuD4t7SGbrBPtr2YNjSe1b9GNe39XtOivSqVmn9pZAS_tEIMocluabqmHk7Vpc8UJwEbFpUYK3ukrMTop80-kStShEz2l/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+1.25.32.png" height="400" width="334" /></a></div>
<br />
<br />
ELF 헤더에서 <span style="text-align: left;">e_ident는 ELF의 매직 넘버(magic number)와 기타 정보를 갖고 있다. 아래 참고 사이트에서 직접 확인해보는 것도 재미있을 것이다.</span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcvQLkKo_9IupGSC7iUJFSQYlHk26WLzfpUBw61uoFwBndpdLVrCnJbZVZuOMkCvbBU28v1O3ORvOa6xAwvk9eJN4uz2M8SJLI121JLK91cwLqwWskjR2uoQrbTANryBMKVa08WrYKfdlP/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+11.47.58.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcvQLkKo_9IupGSC7iUJFSQYlHk26WLzfpUBw61uoFwBndpdLVrCnJbZVZuOMkCvbBU28v1O3ORvOa6xAwvk9eJN4uz2M8SJLI121JLK91cwLqwWskjR2uoQrbTANryBMKVa08WrYKfdlP/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+11.47.58.png" height="242" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="font-size: 13px; text-align: center;"><b style="background-color: white; font-size: medium;"><i>linux-2.6.39.4-ccs-1.8.3의 경우 elf.h의 elf 헤더 구조</i></b></td></tr>
</tbody></table>
<br />
<br />
프로그램 헤더의 구조<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dfRAgp5YGDAe7aAIznUi5tJs9aevxi2yqLwtHbXJ33oPMr-LZpOWToLxu3u7bNKp908aUM8CM07yCcrE1RZGZ946RULb3rrhJNYyyRREgaKXhtjb2WxB2Xqz6MwJedj9Y8pfQVjgqCUz/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.19.20.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dfRAgp5YGDAe7aAIznUi5tJs9aevxi2yqLwtHbXJ33oPMr-LZpOWToLxu3u7bNKp908aUM8CM07yCcrE1RZGZ946RULb3rrhJNYyyRREgaKXhtjb2WxB2Xqz6MwJedj9Y8pfQVjgqCUz/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.19.20.png" height="206" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><b style="background-color: white; font-size: medium;"><i>linux-2.6.39.4-ccs-1.8.3의 경우 elf.h의 프로그램 헤더 구조</i></b></td></tr>
</tbody></table>
<br />
<br />
섹션 헤더의 구조<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMbHFkMTYbMWQdSWI8WBwX1NIN6wYclH-0tLrZfRaBqxRGbnw-X3kwWztdkXzUkAWpjBd3FlbCPo46Hj19zzRKQbC_wQFKrqc_EsVGuCQ2WoW0ogATugmEeo9vV28yTIKhkuSjkp2ItRLc/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.38.36.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMbHFkMTYbMWQdSWI8WBwX1NIN6wYclH-0tLrZfRaBqxRGbnw-X3kwWztdkXzUkAWpjBd3FlbCPo46Hj19zzRKQbC_wQFKrqc_EsVGuCQ2WoW0ogATugmEeo9vV28yTIKhkuSjkp2ItRLc/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-08-12+%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE+12.38.36.png" height="266" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><b style="background-color: white; font-size: medium;"><i>linux-2.6.39.4-ccs-1.8.3의 경우 elf.h의 섹션 헤더 구조</i></b></td></tr>
</tbody></table>
<br />
<br />
[#] Linux의 elf.h 참고: http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/include/linux/elf.h<br />
<div>
<br /></div>
S3izehttp://www.blogger.com/profile/04765215720110662096noreply@blogger.com0