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