튜기's bloggggg(st1tch)

ida로 바이너리를 분석하다 보면 보통 구조체는 ida에서 정의해주지 않습니다.

따라서 구조체 분석이 끝난이후에는 사용자가 구조체를 직접 정의해주면 분석하기가 훨씬 편합니다. 


저 같은 경우에는 두가지 방법을 주로 이용하는데,

2016 seccon에 나왔던 chat문제를 예시로 설명하겠습니다.



이 함수는 tweet message를 만들어서 보내는 함수입니다.

보면 0x98만큼 힙에 할당을 하는데, 분석을 해보면 

count 8byte

name 8byte

message 128byte

heap_addr 8byte

이렇게 총 0x98바이트 구조체인것을 금방 알 수 있습니다.


v5[18], (__int64)(v5+2) 이런식으로 되어있으면 위와 같이 간단할 때는 알아볼 수 있어도

복잡한 바이너리 에서는 보기가 불편합니다.


따라서 사용자가 분석한 내용을 바탕으로 구조체를 직접 정의하는 방법을 설명하겠습니당



첫 번째 방법으로는 Structures에서 직접 한개씩 추가하는 방법입니다.



ida에서 위의 탭을 보면 Structures라고 있습니다.

여기서 Insert버튼을 누르게되면 새로운 구조체를 만들 수 있습니다.

여기서 적당한 이름으로 구조체를 한개 만들어 줍니다.

(참고로 mac에서 Insert -> fn+Enter)




그리고 포인터가 구조체의 끝, 즉 ends에 있을 때,

d키를 누르면 구조체 변수를 한개씩 넣을 수 있습니다.

이렇게 추가된 구조체변수에 대고 n키를 누르면 이름을 변경할 수 있고, d키를 누르면 데이터 타입을 변경할 수 있습니다.

또한 위와같이 오른쪽마우스로 array에 들어가면 배열또한 선언할 수 있습니다.



아까 분석한 구조체를 바탕으로 ida에서 직접 정의한 구조체입니다.

이렇게 정의를 해놓고 이제 적용을 해야하는데 적용하는건 매우 간단합니다.




_QWORD *v5로 선언되어 있는데, y를 누르면 위와같이 재정의를 할 수 있습니다.

여기서 tweet_msg *v5로 타입을 바꿔주고 OK를 누르면 바로 적용이 됩니다. 



정의하기 전과 비교해보면 훨씬 분석하기 편하게 바뀐 것을 확인 할 수 있습니다.




두번째 방법으로는 직접 C코드로 구조체선언을 해주는 것입니다.



Ctrl+1 을 눌려서 Quick view를 보면 Local types라고 있습니다.

여기에 들어가면 아무것도 정의가 안되있습니다.

Insert키를 누르거나 오른쪽마우스+Insert를 하게 되면 아래와 같은 창이 팝업됩니다.



여기서 아까 분석한 구조체를 토대로 직접 C에서 정의하듯이 그냥 크기에 맞게 입력을 해줍니다.

64bit 바이너리이기 때문에 위와 같이 정의를 해줬습니다.

그리고 OK를 누른 후, 첫번째 방법에서 설명한것과 동일하게 바이너리에 적용 시켜주면 됩니다.


두번째 방법으로 직접 구조체를 정의해준 결과입니다.

첫번째 방법과 동일하게 적용되어 보여집니다.



복잡한 구조체가 포함된 바이너리를 분석할 때는, 

정확히 분석을 한 이후에 이런식으로 구조체를 사용자가 정의해주게되면

구조체를 그려놓고 비교하면서 보지않고, 헷갈리는일 없이 좀 더 편하게 분석할 수 있습니다.


끝!



저작자 표시 비영리 변경 금지
신고

Comment +0