OutDoorFrog의 리버싱 이야기

Go언어 리버싱 본문

공부/언어

Go언어 리버싱

OutDoorFrog 2018. 11. 15. 01:18

기도메타에 빠진 개구리(OutDoorFrog)입니다!


떡상 기도에 대한 이미지 검색결과


Demon팀 지원과 수능이 겹치는군요!


수능시험생 분들과 Demon팀을 지원하신 분 모두 유종의 미를 걷을 수 있길 바랍니다!



1. GO언어가 뭐에요?



Go언어는 2009년 구글이 개발한 프로그래밍 언어입니다.

가비지 컬렉션 기능, 병행성을 잘 지원하는 컴파일 언어입니다.


출제자로써 사용해보기 좋은 언어인 것 같습니다.

(분석을 저해하는 구문들이 섞여나오고, 안티 리버싱 기법이 기본으로 탑재된 것 같아서입니다.)


청정수 리버서를 벗어나기 위해 다양한 언어를 리버싱을 해볼려고 시도를 해보는 중인데


Go언어를 사용하는 바이너리 파일을 리버싱해보니 조금 특이해서 포스트로 기록해둘려구요.





출처 : strazzere 님의 Bsides_golang_loader_assist.pdf



리버싱을 해보니 Rumtime 관련 함수가 굉장히 많이 나오더군요.


Go언어 리버싱에 관련된 자료를 검색, main 함수를 찾기를 계속하며


"이거 언제 다 분석하지??"라는 생각에 잠겨있을 쯤..



golang compile에 대한 이미지 검색결과



main.main 함수를 찾았습니다. 

(음.. main안에 main이 들어있네?)



rumtime 관련 함수를 대충 트레이싱하면서 리버싱을 계속해보니..



"이런 어셈 구성은 어디서 많이 본 구성인데?" 이런 말이 나오더라구요.

 

"Go언어는 C/ C++ 기반으로 만들어진 언어가 아닐까?"라는 생각이 들게 되었습니다.



1.1 리버싱 방법은?



IDA 7.0 Decompiler를 기준으로 대부분의 함수 이름들이 자동으로 복구되더군요.

(무료 버전을 가지고 리버싱을 하시는 분은 two2sh님의 포스트를 참고해주세요.)



리버싱의 흐름은..


  1. main.main 함수를 찾는다.

  2. Decompile 한다.

  3. runtime 관련 부분에 대한 코드는 제외하고 해석을 진행한다.


이런 순서를 진행하는 듯 합니다.



다만 C / C++ 과는 헤더파일을 포함하는 것과 다르게 fmt라는 패키지를 사용하더군요.


함수의 이름을 보면 어렴풋의 함수의 역할에 대해서는 유추가 가능합니다.


하지만 C에서 알고있던 함수의 인자 구성과 Go에서 쓰인 함수의 인자 구성이 달라서


리버싱이 급한 분들께서는 예제로 배우는 Go 프로그래밍 사이트를 참조하는 것을 추천합니다.



참고로 디버깅하실 때 계속 루프를 도는 부분이 있을 겁니다.


그런 부분 같은 경우는 손수 우회해주셔야 프로그램이 원할히 진행될 겁니다.

(인제 안티 디버깅 기법을 반드시 탑재하는 것이 대세인건가)



지인 분께서 다음과 같은 포스트를 추천해주셨습니다, 여러분도 한 번 보세욥!



1.2 지금 하고 있는 일은?



1. 악성코드 분석과 함께 GO언어로 된 문제를 풀고 있는 중입니다.

(brainf**k을 이용한 문제 대신 사용할 언어로 적합하다고 생각하고 있습니다.)



2. 풀고 있는 문제는 사정상 공개할 수 없습니다.

(Angr를 사용하는 문제를 만들어볼까 하고 강력히 고민하는 중 입니다)



3. Angr 사용법을 CTF에서도 사용할 수 있을만큼 연습하는 중입니다.

(Angr 예제나 모르는 부분은 따로 검색하며 공부하고 있지만.. 한계가 있네요)





쉘코드에 대한 설명, Angr에 대한 설명을 주제로 

다음 포스트에서 찾아뵙겠습니다.



'공부 > 언어' 카테고리의 다른 글

윈도우즈 시스템 프로그래밍 [SEH] (수정중)  (0) 2018.09.13
Python 준비  (0) 2018.09.05
세마포어 뮤텍스 준비  (0) 2018.09.05
Comments