반응형

Capture the Packet

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
#include<pcap.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"wpcap.lib")
#pragma warning(disable:4996)
void packet_view(u_char *const struct pcap_pkthdr *const u_char *);
void print_hex(const u_char *int);
int main(void)
{
    char *dev;                    // device name;
    pcap_t *pd;                    // packet descripter
    bpf_u_int32 net, subnet;    // network, subnetmask
    char errbuf[PCAP_ERRBUF_SIZE];    // error buffer
    
    if (!(dev = pcap_lookupdev(errbuf))){    // find device
        printf("[!] pcap_lookupdev\n");
        return -1;
    }
    if (pcap_lookupnet(dev, &net, &subnet, errbuf) < 0){    // get network, subnetmask
        printf("[!] pcap_lookupnet\n");
        return -1;
    }
    /* pcap_open_live
        device
        maximum capture length
        promiscuous mode
        timeout(ms)
        error buffer
    */
    if (!(pd = pcap_open_live(dev, 6553513000, errbuf))) {
        printf("[!] pcap_open_live\n");
        return -1;
    }
    printf("[-] Listening");
    /* pcap_loop
        packet descriptor
        receive packet num(0:Endlessloop)
        received packet processing fuction
        user parameter
    */
    if (pcap_loop(pd, 10, packet_view, NULL< 0) {
        printf("[!] pcap_loop\n");
        return -1;
    }
    return 0;
}
// received packet processer
/* packet_view
    user parameter
    header
    packet data
*/
void packet_view(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
    int len = 0;
    printf("[*] Received Packet\n");
    
    print_hex(pkt_data, header->len);
    
}
void print_hex(const u_char *data, int len)
{
    int i, j;
    printf("Addr   ");
    for (i = 0; i < 16; i++)
        printf("%02X ", i);
    for (i = 0; i < 16; i++)
        printf("%X", i);
    printf("\n");
 
    for (i = 0; i * 16 < len; i++) {
        printf("0x%04X ", i * 16);
        for (j = 0; j < 16; j++)
            printf("%02X ", (data + 16 * i)[j]);
        for (j = 0; j < 16; j++) {
            if (((data + 16 * i)[j]>0x1f) && ((data + 16 * i)[j] < 0x7F))
                printf("%c", (data + 16 * i)[j]);
            else
                printf(".");
        }
        printf("\n");
    }
    printf("\n");
}
cs



'Network' 카테고리의 다른 글

LibTins ARP Spoofing  (0) 2016.06.24
WinPcap 4  (0) 2016.02.23
WinPcap 3  (0) 2016.02.23
WinPcap 1  (0) 2016.02.23
패킷 캡슐화 구현  (0) 2015.11.20
반응형

Get Device name & network & subnetmask

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
#include<pcap.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"wpcap.lib")
#pragma warning(disable:4996)
 
int main(void)
{
    char *dev;                    // device name;
    pcap_t *pd;                   // packet descripter
    bpf_u_int32 net, subnet;      // network, subnetmask
    char errbuf[PCAP_ERRBUF_SIZE];    // error buffer
    struct in_addr net_addr, subnet_addr;    // for print
 
    if (!(dev = pcap_lookupdev(errbuf)))    // find device
    {
        printf("[!] Error : pcap_lookupdev\n");
        return -1;
    }
    if (pcap_lookupnet(dev, &net, &subnet, errbuf) < 0)    // get network, subnetmask
    {
        printf("[!] Error : pcap_lookupnet\n");
        return -1;
    }
    net_addr.s_addr = net;
    subnet_addr.s_addr = subnet;
    printf("[*] Device        :    %s\n", dev);
    printf("[*] Network       :    %s\n", inet_ntoa(net_addr));
    printf("[*] Subnetmask    :    %s\n", inet_ntoa(subnet_addr));
    return 0;
}
cs


'Network' 카테고리의 다른 글

LibTins ARP Spoofing  (0) 2016.06.24
WinPcap 4  (0) 2016.02.23
WinPcap 3  (0) 2016.02.23
WinPcap 2  (0) 2016.02.23
패킷 캡슐화 구현  (0) 2015.11.20

반응형


 

1. BFF Fuzzer?

CERT에서 만든 바이너리 Fuzzer로서 여러 가지 퍼징을 한 뒤 디버거로 예외를 잡아내는 툴, BFF랑 FOE랑 합쳐짐

 

2. 실행 방법

CERT FOE 다운로드 창에서 iso를 다운받은 후 마운트 해서 설치한다.

설치를 끝마치게 되면 C:\FOE2라는 폴더가 생길 것이다.

옵션 파일은 C:\FOE2\configs\foe.yaml이며 수정을 마친 후 퍼징을 시작하려면 C:\FOE2\foe2.py를 실행하면 된다.

이때 python에서 인자 오류가 발생할 확률이 높은데 이것은 python 버전을 2.7.5로 다운그래이드 하면 해결된다.

연구중

 

3. 동작방식

1) SeedFile을 읽어와 옵션에 맞게 바이너리를 랜덤으로 수정

2) 옵션의 Cmdline_template에 따라 퍼징대상 실행

3) WinDbg로 디버깅 하면서 제한 시간 내 크래시가 나는지 분석

4) 크래시가 일어났다면 msec모듈로 크래시 분석

5) 로그로 저장

6) minimize 수행

7) 반복

 

4. 각 옵션 설명(2.8ver/Windows)

Campaign options

id: results에 저장될 프로젝트 폴더 이름

keep heisenbugs: 후킹으로 발견된 테스트 케이스를 계속 크래시를 내되, 디버거를 통해 실행중일 때는 제외, XP가 아니면 무시됨

use buttonclicker: 버튼을 클릭하는 프로그램을 실행한다.


Target options

program: 퍼징할 프로그램 절대 경로

cmdline template: 프로그램 명령 줄 호출을 지정하는 데 사용됨


Directories used by BFF

seedfile dir: 시드 파일 위치

working dir: FOE에서 사용하는 임시 공간. 렘 메모리를 쓰는 것이 오버헤드를 줄임

results dir: 결과 파일 위치


Runner options

hideoutput: 프로그램의 출력을 숨김

runtimeout: 프로그램 시간제한

watchcpu: cpu 사용률이 0이 되면 중지


Debugger options

debugheap: 프로그램이 debug heap을 사용하게 함

max handled exceptions: 예외를 계속 진행할 최대 횟수.


Run options

first iteration: 반복 시작 숫자를 지정(기본값 0)

seed interval: 새로운 시드 파일과 돌연변이 범위를 지정하기 전에 수행할 반복횟수 (기본값 1)

minimize: 크래시가 나지만 해시가 같도록 시드파일과 차이가 적은 파일을 만듦(TRUE)

minimizer timeout: minimization이 BFF에서 최대로 할당 가능한 시간

keep unique faddr: 충돌 해시의 일부로서 예외 오류 주소 값을 고려

keep all duplicates: 모든 중복 충돌의 경우를 유지

recycle_crashers: 퍼징할 시드파일 풀에 특이 크래시 케이스를 재활용 한다


Fuzzer options 오직 하나의 퍼저만 선택가능

bytemut: 임의의 값으로 바이트를 교체

swap: 인접한 바이트를 교환

wave: 순차적으로 모든 가능한 단일 바이트 값을 순환

drop: 각 파일마다 바이트 하나를 제거

insert: 각 파일마다 임의 값 하나 추가

truncate: 파일의 끝 바이트 제거

crmut: 임의의 값으로 캐리지 리턴 바이트 교체

crlfmut: 임의의 값으로 캐리지 리턴, 줄바꿈 바이트 교체

nullmut: 임의의 값으로 NULL 바이트 교체

verify: 파일을 돌연변이하지 않음. 충돌 테스트 케이스 확인용

fuzz zip container: zip파일 내용을 퍼징하지 않고, zip 자체를 퍼징



 


'Pwnable > Etc' 카테고리의 다른 글

Docker & Docker Compose 설치법  (0) 2017.05.05
SongSari - Basic Bof  (0) 2015.12.01
Pin Tool 간단 설명  (0) 2015.11.21
Layer7 CTF SPILL  (0) 2015.11.02
PlaidCTF-2013 pork  (0) 2015.10.28

+ Recent posts