1 #include <libcgc.h>
2 #include <stdlib.h>
3 #include <string.h>
4 
5 struct stack_func_1 {
6   char buf[0x20];
7   char *where;
8 };
9 
receive_n(int fd,void * dst_a,size_t n_bytes)10 size_t receive_n( int fd, void *dst_a, size_t n_bytes )
11 {
12   char *dst = (char *)dst_a;
13   size_t len = 0;
14   size_t rx = 0;
15   while(len < n_bytes) {
16     if (receive(fd, dst + len, n_bytes - len, &rx) != 0) {
17       len = 0;
18       break;
19     }
20     len += rx;
21   }
22 
23   return len;
24 }
25 
send_all(int fd,const void * msg,size_t n_bytes)26 int send_all(int fd, const void *msg, size_t n_bytes)
27 {
28   size_t len = 0;
29   size_t tx = 0;
30   while(len < n_bytes) {
31     if (transmit(fd, (char *)msg + len, n_bytes - len, &tx) != 0) {
32       return 1;
33     }
34     len += tx;
35   }
36   return 0;
37 }
38 
39 #define INT_DIGITS 19		/* enough for 64 bit integer */
40 
itoa2(i)41 char *itoa2(i)
42      int i;
43 {
44   /* Room for INT_DIGITS digits, - and '\0' */
45   static char buf[INT_DIGITS + 2] = {0};
46   char *p = buf + INT_DIGITS + 1;	/* points to terminating '\0' */
47   if (i >= 0) {
48     do {
49       *--p = '0' + (i % 10);
50       i /= 10;
51     } while (i != 0);
52     return p;
53   }
54   else {			/* i < 0 */
55     do {
56       *--p = '0' - (i % 10);
57       i /= 10;
58     } while (i != 0);
59     *--p = '-';
60   }
61   return p;
62 }
63 
64 int myglobal;
65 
main(int secret_page_i)66 int __attribute((fastcall)) main(int secret_page_i) {
67 
68   int x;
69   char *flag = (void *)secret_page_i;
70 
71   for(int i=0;i<20;i++) {
72   transmit(1, "A", 1, NULL);
73   }
74 
75   x = *((int*)flag+123);
76   char *str_flag = itoa2(x);
77 
78   transmit(1, str_flag, 12, NULL);
79 
80   for(int i=0;i<20;i++) {
81   transmit(1, "B", 1, NULL);
82   }
83 
84   return 0;
85 }
86 
87 
88