Try Attack/Reverse Engineering[basic]

[codegate_2017] angrybird

D4tai1 2019. 4. 8.

1. 문제풀이

(1) 실행결과

 [1] './angrybird'와 같이 그냥 실행하면 반응이 나오지 않는다.

 [2] './angrybird abcd'와 같이 인자를 넣고 실행해도 반응이 나오지 않는다.

 [3] './angrybird abcd $(python -c 'print "a"*0x100')와 같이 오버플로우를 예상하고 실행해도 아무런 반응이 나오지 않는다.

 

(2) start 함수

 [1] 현재 화면은 'angrybird'바이너리를 IDA에 올릴 때 가장먼저 나오는 화면이고 start함수이다.

 [2] 이후 main함수를 첫 번째 파라미터에 넣고 호출하는 부분이 보인다.

 [3] main을 더블클릭해서 이동한다.

 

(3) main함수

 [1] 프롤로그부터 보면 쭉 가다가 종료하는 부분이 조금 이상하다.

 [2] 실제로 프로그램 실행 시 어떻게 돌려도 종료된다.

 [3] xor eax, eax를 지나면 eax는 0이되고 0이면 종료하라는데...

 

(3) main함수 디컴파일

 [1] 좀 더 자세히 보기위해 F5를 누르고 디컴파일한다.

 [2] exit(a1) 부분을 수정해야 할 듯 싶다.

 

(4) main함수 내 수정해야할 부분

 [1] 종료하기 전 부분인 [cmp eax, 0]을 [cmp eax, 1]로 수정하려고 한다.

 

(5) 수정하는 방법

 [1] [Edit - Patch program - Assemble] 을 따라간다.

 

 [2] [cmp eax, 0 을 cmp eax, 1]로 수정한다.

 

 [3] 수정된 메인함수이다.

 

 [4] [Patch program - Apply patches to input file...] 를 따라가서 변경사항을 저장한다.

 

 [5] 기존파일을 백업파일로 지정하고 새로 저장한다.

 

(6) 재배포 후 실행

 [1] 실행권한을 부여해주고 실행한다.

 [2] 1이 아닌 21을 반환하라는 것을 보니 반환값을 변경해주어야 할 것 같다.

 [3] "stack check"이후 메모리 오염이 발생하는 것으로 보여진다.

 

(7) 문자열 검색

 [1] [Shift+F12]를 누르면 문자열 탐색을 할 수 있다.

 [2] "you should return 21 not 1 :(" 문자열을 더블클릭 한다.

 

(8) 참조한 곳

 [1] 문자열을 참조하는 부분으로 이동하기 위해 s클릭 후 x를 누른다.

 [2] 그럼 이 문자열이 호출된 함수로 이동한다.

 

(9) 함수 내용 확인

 [1] "you should return 21 not 1 :("를 출력 후 dword_0x00606060주소의 값을 가져와서 eax에 저장한다.

 

(10) .data 영역으로 이동

 [1] 0x00606060주소에 저장되어 있는 1이라는 값을 21로 변경하려고 한다.

 

(11) .data 영역의 값 변경

 [1] [Edit] - [Patch program] - [Change byte...] 를 따라간다.

 

 [2] 01 부분을 15(16진수)로 변경한다.

 

 [3] 변경된 화면을 저장한다.

 

(12) 재실행

 [1] 재실행해도 같은 결과가 나온다..

 [2] 아마도 반환값만 변경된 것이지 그것으로 인해 로직이 변경되는 것으로 보이지 않기 때문인 것 같다.

 

(13) 흐름

 [1] sub_4006F6, sub_40070C, sub_40072A 총 3개 함수를 지나고 fgets함수로 입력을 받는 것으로 보인다. 

 [2] sub_4006F6함수를 더블클릭해서 이동한다.

 

(14) 첫 번째 함수로 이동

 [1] 값도 1이 아닌 21로 변경해 주었고 특별한 이상은 없어 보인다.

 

(15) 두 번째 함수로 이동

 [1] "stack check" 문자열은 정상적으로 출력된다.

 [2] 중요한 함수도 아닌 것 같고 약간 께름칙하기 때문에... 전부 nop처리하려고 한다.

 

(16) 호출하는 주소 수정

 [1] 0x4007B3 주소부터 4007B7까지 nop로 변경한다.

 [2] 변경하는 방법은 이전 내용과 동일하다.

 

(17) 변경된 내용

 [1] 재컴파일 후 실행해 보았지만 그래도 fgets에 도달하지 않는다.

 

(18) 세 번째 함수로 이동

 [1] "hello"와 같은지 비교하는 것으로 보이는데...

 [2] 그냥 이 함수도 없어야 입력받기 편할 것 같으므로 여기도 nop처리한다.

 

(19) 중간함수 제거

 [1] 함수가 종료되는 0x4007C1 주소까지 nop처리한다.

 

(20) 재실행

 [1] 이제 입력하는 부분이 나온다.

 [2] "rkskek"를 입력하니.. 메롱.. 이 나온다.

 

(21) 로직확인

 [1] 로직확인을 조금 늦게한 감이 있지만...

 [2] 비교를 엄청나게 많이한 후 모든 조건이 다 참인 경우 메롱이 아닌 값이 출력되는 것으로 보인다.

 [3] 딱봐도 z3의 SMT solver로 풀라고 낸 문제는 아닌 것으로 보인다..

 

(22) 분기문

 [1] (21)부분의 일부를 확대한 것이다.

 

(23) 공격코드 작성

 [1] 먼저 도달해야할 주소를 찾는다. => 0x404FAB

 

 [2] 시작할 주소를 찾는다. => 0x4007C1

 [3] 이전 내용은 필요가 없기 때문에 아까 nop처리한 부분의 마지막을 시작주소로 잡았다.

 

[4] 공격코드를 작성 후 실행해서 나온 flag를 확인할 수 있다.

 

'Try Attack > Reverse Engineering[basic]' 카테고리의 다른 글

위장 악성코드를 실행하는 방법  (0) 2019.05.31
MFC_reversing  (0) 2019.05.26
[csaw CTF 2015] wyvern  (0) 2019.04.08
BreakPoint  (0) 2018.12.28
Packing/Unpacking  (0) 2018.12.19

댓글