//----- (080487A4) --------------------------------------------------------
int __cdecl begin_the_fucking(int fd)
{
int result; // eax@38
char data_mem[4054]; // [sp+20h] [bp-1008h]@7
char code_mem[30]; // [sp+FF6h] [bp-32h]@1
int bf_eip; // [sp+1014h] [bp-14h]@1
int bf_edi; // [sp+1018h] [bp-10h]@1
int code_len; // [sp+101Ch] [bp-Ch]@1
int loop_depth; // [sp+1020h] [bp-8h]@16
int STK_CANARY; // [sp+1024h] [bp-4h]@1
STK_CANARY = *MK_FP(__GS__, 20);
bf_eip = 0;
bf_edi = 0;
write(fd, "Brainfuck shell starting\n", 0x19u);
write(fd, "4 KB of data memory ready\n", 0x1Au);
write(fd, "30 B of code memory ready\n", 0x1Au);
write(fd, "bf-sh$ ", 7u);
code_len = read(fd, code_mem, 0x1Eu);
while ( bf_eip < code_len )
{
switch ( code_mem[bf_eip] )
{
case '>':
++bf_edi;
break;
case '<':
--bf_edi;
break;
case '+':
++data_mem[bf_edi];
break;
case '-':
--data_mem[bf_edi];
break;
case '.':
write(fd, &data_mem[bf_edi], 1u);
break;
case ',':
read(fd, &data_mem[bf_edi], 1u);
break;
case '[':
if ( !data_mem[bf_edi] )
{
loop_depth = 1;
while ( 1 )
{
++bf_eip;
if ( bf_eip >= code_len )
break;
if ( code_mem[bf_eip] == '[' )
{
++loop_depth;
}
else
{
if ( code_mem[bf_eip] == ']' )
{
--loop_depth;
if ( !loop_depth )
break;
}
}
}
if ( bf_eip >= code_len )
{
write(fd, "OMFG eip flew away on '['!\n", 0x1Bu);
exit(-1);
}
}
break;
default:
if ( code_mem[bf_eip] == ']' && data_mem[bf_edi] )
{
loop_depth = 1;
while ( 1 )
{
--bf_eip;
if ( bf_eip < 0 )
break;
if ( code_mem[bf_eip] == ']' )
{
++loop_depth;
}
else
{
if ( code_mem[bf_eip] == '[' )
{
--loop_depth;
if ( !loop_depth )
break;
}
}
}
if ( bf_eip < 0 )
{
write(fd, "OMFG eip flew away on ']'!\n", 0x1Bu);
exit(-1);
}
}
break;
}
++bf_eip;
}
result = *MK_FP(__GS__, 20) ^ STK_CANARY;
if ( *MK_FP(__GS__, 20) != STK_CANARY )
__stack_chk_fail();
return result;
}