[codegate_2017] angrybird
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 |
댓글