16진수 값을 넣고 싶은데요...

익명 사용자의 이미지

아래의 소스에서 (리눅스 커널에 있는 소스입니
다./usr/src/linux/net/ipv4/arp.c 파일의 일부입니다.)

******************로 체크된 memcopy의 src_hw 부분을 제가 원하는 값으
로 강제로 집어 넣고 싶은데요.

그래서.._-------------------------------이렇게 한 부분을 제가 넣었습
니다.

결국 제가 하고 싶은 것은 unsigned char br_hwaddr에 16진수로 FF(0xFF)
인 unsigned char를 넣고 싶은 것입니다. 그것도 6개를 쫙 붙여서...
(찍어보니까..y 자 위에 점 두개 찍혀있는 그런 문자던데....)

그런데...이 부분을..즉..제가 수정한 부분만을 따로 띄어내서 컴파일 하
면..정상적으로 동작합니다.

그러나 이렇게 수정하고..커널 컴파일을 하면..커널 패닉이 나고..에러들
이 쫙 뜨면서..아무것도 안 먹습니다...

한..2틀동안 이것 저것 해보면서..커널 컴파일만..40번을 넘게 햇습니다.

도와주세요..어디가 문제인지..ㅜ.ㅜ

void arp_send(int type, int ptype, u32 dest_ip,
struct net_device *dev, u32 src_ip,
unsigned char *dest_hw, unsigned char *src_hw,
unsigned char *target_hw)
{
struct sk_buff *skb;
struct arphdr *arp;
unsigned char *arp_ptr;

------------------------------------------------------
제가 새로 넣은 부분입니다.
unsigned char buffer[6];
unsigned char *br_hwaddr;
unsigned char *br_hwaddr_temp;
*br_hwaddr_temp = (unsigned char)255;

strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);

br_hwaddr = buffer;
여기까지..추가.
------------------------------------------------------------

/*
* No arp on this interface.
*/

if (dev->flags&IFF_NOARP)
return;

/*
* Allocate a buffer
*/

skb = alloc_skb(sizeof(struct arphdr)+ 2*(dev->addr_len+4)
+ dev->hard_header_len + 15,
GFP_ATOMIC);
if (skb == NULL)
return;

skb_reserve(skb, (dev->hard_header_len+15)&~15);
skb->nh.raw = skb->data;
arp = (struct arphdr *) skb_put(skb,sizeof(struct arphdr)
+ 2*(dev->addr_len+4));
skb->dev = dev;
skb->protocol = __constant_htons (ETH_P_ARP);
if (src_hw == NULL)
src_hw = dev->dev_addr;
if (dest_hw == NULL)
dest_hw = dev->broadcast;

/*
* Fill the device header for the ARP frame
*/
if (dev->hard_header &&
dev->hard_header(skb,dev,ptype,dest_hw,src_hw,skb-
>len) < 0)
goto out;

/*
* Fill out the arp protocol part.
*
* The arp hardware type should match the device type,
except for FDDI,
* which (according to RFC 1390) should always equal 1
(Ethernet).
*/
/*
* Exceptions everywhere. AX.25 uses the AX.25 PID
value not the
* DIX code for the protocol. Make these device
structure fields.
*/
switch (dev->type) {
default
arp->ar_hrd = htons(dev->type);
arp->ar_pro = __constant_htons(ETH_P_IP);
break;

#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
case ARPHRD_AX25
arp->ar_hrd = __constant_htons(ARPHRD_AX25);
arp->ar_pro = __constant_htons(AX25_P_IP);
break;

#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
case ARPHRD_NETROM
arp->ar_hrd = __constant_htons(ARPHRD_NETROM);
arp->ar_pro = __constant_htons(AX25_P_IP);
break;
#endif
#endif

#ifdef CONFIG_FDDI
case ARPHRD_FDDI
arp->ar_hrd = __constant_htons(ARPHRD_ETHER);
arp->ar_pro = __constant_htons(ETH_P_IP);
break;
#endif
#ifdef CONFIG_TR
case ARPHRD_IEEE802_TR
arp->ar_hrd = __constant_htons(ARPHRD_IEEE802);
arp->ar_pro = __constant_htons(ETH_P_IP);
break;
#endif
}

arp->ar_hln = dev->addr_len;
arp->ar_pln = 4;
arp->ar_op = htons(type);

arp_ptr=(unsigned char *)(arp+1);

******************************************************
/* memcpy(arp_ptr, src_hw, dev->addr_len); <---이 부분아래와
같이 수정하고 주석으로 막아놨습니다.?
memcpy(arp_ptr, br_hwaddr, dev->addr_len); <-이렇게 바꿨습니
다.
********************************************************
arp_ptr+=dev->addr_len;
memcpy(arp_ptr, &src_ip,4);
arp_ptr+=4;
if (target_hw != NULL)
memcpy(arp_ptr, target_hw, dev->addr_len);
else
memset(arp_ptr, 0, dev->addr_len);
arp_ptr+=dev->addr_len;
memcpy(arp_ptr, &dest_ip, 4);

dev_queue_xmit(skb);
return;

out
kfree_skb(skb);
}

익명 사용자의 이미지

제가 새로 넣은 부분입니다.
unsigned char buffer[6];
unsigned char *br_hwaddr;
unsigned char *br_hwaddr_temp;
*br_hwaddr_temp = (unsigned char)255;

strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);
strcat(buffer, br_hwaddr_temp);

br_hwaddr = buffer;
여기까지..추가.
------------------------------------------------------------

br_hwaddr 를 다른 용도로 쓰시지 않는다면
unsigned char br_hwaddr[6] = {255, 255, 255, 255, 255, 255};
정도로 하시거나, 또는 변경되지 않는다면 static 을 붙여주시는것도
괜찮을 듯 싶습니다.

strcat() 은 source문자열 뒤에 dest문자열을 복사하는 것이기 때문에
잘못된 결과가 나옵니다.

*br_hwaddr_temp = (unsigned char)255; br_hwaddr_temp가 초기화되어 있지 않기 때문에 임의의 곳을 가리킬 수
있고, 위의 할당문에 의해 메모리상의 어디엔가의 값이 255로 바뀌었습니
다. 잘못된 코드이고요.

strcat(buffer, br_hwaddr_temp); br_hdaddr_temp 가 가리키는 맨 첫 바이트는 255를 가지고 있지만 그 후
에 어떤 값이 있을지 모릅니다. 따라서 위 문장은 255를 buffer에 복사하
는 것이 아니라 br_hwaddr_temp 가 가리키고 있는 곳에서 NULL (0) 이 나
올때까지 있는 문자열을 buffer에 복사합니다. 몇 바이트가 복사될지는
알 수 없습니다.

strcat()을 6번 호출했는데, br_hwaddr_temp가 가리키는 곳의 다음 바이
트에 바로 0이 온다고 하더라도 NULL까지 복사되기 때문에 buffer에는
255 여섯개와 끝에 NULL 을 포함해서 7바이트의 문자가 필요하게 됩니
다. 따라서 메모리를 깨 먹겠죠.

지금의 경우는 아마 br_hdaddr 을 깨 먹을 것 같은데 곧바로 br_hwaddr
이 buffer를 가리키도록 할당되기 때문에 영향은 없겠지만 위험한 코드입
니다.

익명 사용자의 이미지

지금 말씀하신대로 해보고

다시 커널 컴파일 하고 있습니다.

결과는 아직 안나왔지만..대충 어디가 문제인지..

많은 도움이 되었습니다.

그럼..

좋은 하루되세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.