forked from LudovicRousseau/PCSC
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBufferOverflow_SCardControl.c
81 lines (70 loc) · 1.88 KB
/
BufferOverflow_SCardControl.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
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
/*
* MUSCLE SmartCard Development ( https://pcsclite.apdu.fr/ )
*
* Copyright (C) 2009
* Ludovic Rousseau <ludovic.rousseau@free.fr>
*/
#include <stdio.h>
#include <string.h>
#ifdef __APPLE__
#include <PCSC/winscard.h>
#include <PCSC/wintypes.h>
#else
#include <winscard.h>
#include <reader.h>
#endif
#define GREEN "\33[32m"
#define BRIGHT_RED "\33[01;31m"
#define NORMAL "\33[0m"
int main(void)
{
SCARDCONTEXT hContext;
SCARDHANDLE hCard;
DWORD dwActiveProtocol;
LONG rv;
char mszReaders[1024];
DWORD dwReaders = sizeof(mszReaders);
unsigned char bRecvBuffer[MAX_BUFFER_SIZE];
DWORD length;
rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
printf("SCardEstablishContext %lX\n", rv);
rv = SCardListReaders(hContext, NULL, mszReaders, &dwReaders);
printf("SCardListReaders %lX\n", rv);
rv = SCardConnect(hContext, mszReaders, SCARD_SHARE_DIRECT,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard,
&dwActiveProtocol);
printf("SCardConnect %lX\n", rv);
/* expected size is at least 4 bytes */
length = 3;
rv = SCardControl(hCard, CM_IOCTL_GET_FEATURE_REQUEST, NULL, 0,
bRecvBuffer, length, &length);
if (SCARD_E_INSUFFICIENT_BUFFER == rv)
{
printf(GREEN "test PASS. Insufficient buffer is expected\n" NORMAL);
}
else
{
printf(BRIGHT_RED "test FAIL\n" NORMAL);
}
printf("SCardControl %lX: %s\n", rv, pcsc_stringify_error(rv));
printf("Expected length: %ld\n", length);
if (SCARD_S_SUCCESS == rv)
{
int i;
for (i=0; i<length; i++)
printf("%02X ", bRecvBuffer[i]);
printf("\n");
}
rv = SCardControl(hCard, CM_IOCTL_GET_FEATURE_REQUEST, NULL, 0,
bRecvBuffer, sizeof bRecvBuffer, &length);
printf("SCardControl %lX: %s\n", rv, pcsc_stringify_error(rv));
printf("Expected length: %ld\n", length);
if (SCARD_S_SUCCESS == rv)
{
int i;
for (i=0; i<length; i++)
printf("%02X ", bRecvBuffer[i]);
printf("\n");
}
return 0;
}