{"id":388,"date":"2020-04-11T14:31:20","date_gmt":"2020-04-11T14:31:20","guid":{"rendered":"https:\/\/temp.ashkerala.com\/?p=388"},"modified":"2020-04-11T14:31:20","modified_gmt":"2020-04-11T14:31:20","slug":"reverse-code-engineering-tutorial-part-2","status":"publish","type":"post","link":"https:\/\/temp.ashkerala.com\/?p=388","title":{"rendered":"Reverse Code Engineering Tutorial Part 2"},"content":{"rendered":"<p><strong>What is Assembly language?<\/strong><br \/> Assembly language is a low level or simply called machine language made up of machine instructions. Assembly language is specific to processor architecture example different for x86 architecture than for SPARC architecture. Assembly language consist of assembly instructions and CPU registers. Isoftdl(Lokesh) means I will explain my tutorial considering x86 architecture&#8230; Ahhha&#8230; From where i start explaining to you &#8230; assembly language is too big topic&#8230; I think i have to tell only what you need for reverse engineering.. So i start from CPU registers.<\/p>\n<p> <strong>CPU registers &#8211; Brief Introduction:<\/strong><br \/> First of all what are registers? Most of Computer Engineering and Electronics Engineering guys knows about them but for others, Registers are small segments of memory inside CPU that are used for storing temporary data. Some registers have specific functions, others are just use for some general data storage. I am considering that you all are using x86 machines. There are two types of processors 32 bit and 64 bit processors. In a 32 bit processor, each register can hold 32 bits of data. On the other hand 64 bit register can hold 64 bit data. I am explaining this tutorial considering that we are using 32 bit processors. I will explain the same for 64 bits in later classes on\u00a0 hackingloops.<br \/> There are several registers but for Reverse engineering we HackingLoops users are only interested in general purpose registers. We are interested in only 9 General purpose registers namely:<\/p>\n<p> \u00a0\u00a0\u00a0 EAX<br \/> \u00a0\u00a0\u00a0 EBX<br \/> \u00a0\u00a0\u00a0 ECX<br \/> \u00a0\u00a0\u00a0 EDX<br \/> \u00a0\u00a0\u00a0 ESI<br \/> \u00a0\u00a0\u00a0 EDI<br \/> \u00a0\u00a0\u00a0 ESP<br \/> \u00a0\u00a0\u00a0 EBP<br \/> \u00a0\u00a0\u00a0 EIP<\/p>\n<p> All these registers serves for different purposes. So I will start explaining all of them one by one for a more clear and accurate understanding of register concepts. I am putting more strain on these because these registers are called heart of reverse engineering.<\/p>\n<p> EAX register is accumulator register which is used to store results of calculations. If any function returns a value its stored into EAX register. We can access EAX register using functions to retrieve the value of EAX register.<br \/> Note: EAX register can also be used for holding normal values regardless of calculations too.<\/p>\n<p> The EDX is the data register. It\u0393\u00c7\u00d6s basically an extension of EAX to assist it in storing extra data for complex operations. It can also be used for general purpose data storage.<\/p>\n<p> The ECX, also called the count register, is used for looping operations. The repeated operations could be storing a string or counting numbers.<\/p>\n<p> The ESI and EDI relied upon by loops that process data. The ESI register is the source index for data operation and holds the location of the input data stream. The EDI points to the location where the result of data operation is stored, or the destination index.<\/p>\n<p> ESP is the stack pointer, and EBP is the base pointer. These registers are used for managing function calls and stack operations. When a function is called, the function\u0393\u00c7\u00d6s arguments are pushed on the stack and are followed by a return address. The ESP register points to the very top of the stack, so it will point to the return address. EBP is used to point to the bottom of the call stack.<\/p>\n<p> EBX is the only register that was not designed for anything specific. It can be used for extra storage.<\/p>\n<p> EIP is the register that points to the current instruction being executed. As the CPU moves through the binary executing code, EIP is updated to reflect the location where the execution is occurring.<\/p>\n<p> The &#8216;E&#8217; at the beginning of each register name stands for Extended. When a register is referred to by its extended name, it indicates that all 32 bits of the register are being addressed.\u00a0 An interesting thing about registers is that they can be broken down into smaller subsets of themselves; the first sixteen bits of each register can be referenced by simply removing the &#8216;E&#8217; from the name. For example, if you wanted to only manipulate the first sixteen bits of the EAX register, you would refer to it as the AX register. Additionally, registers AX through DX can be further broken down into two eight bit parts. So, if you wanted to manipulate only the first eight bits (bits 0-7) of the AX register, you would refer to the register as AL; if you wanted to manipulate the last eight bits (bits 8-15) of the AX register, you would refer to the register as AH (&#8216;L&#8217; standing for Low and &#8216;H&#8217; standing for High).<\/p>\n<p> Introduction to Memory and Stacks:<br \/> There are three main sections of memory:<\/p>\n<p> 1. Stack Section &#8211; Where the stack is located, stores local variables and function arguments.<\/p>\n<p> 2. Data Section &#8211; Where the heap is located, stores static and dynamic variables.<\/p>\n<p> 3. Code Section &#8211; Where the actual program instructions are located.<\/p>\n<p> The stack section starts at the high memory addresses and grows downwards, towards the lower memory addresses; conversely, the data section (heap) starts at the lower memory addresses and grows upwards, towards the high memory addresses. Therefore, the stack and the heap grow towards each other as more variables are placed in each of those sections. I have shown that in below Figure..<\/p>\n<p> \u00a0\u00a0\u00a0 High Memory Addresses (0xFFFFFFFF)<br \/> \u00a0\u00a0\u00a0 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &lt;&#8212;&#8211;Bottom of the stack<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Stack\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0 | Stack grows down<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0 v<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;| &lt;&#8212;-Top of the stack (ESP points here)<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|\u00a0 &lt;&#8212;-Top of the heap<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0 ^<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Heap\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0 Heap grows up<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;| &lt;&#8212;&#8211;Bottom of the heap<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0 Instructions\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/> \u00a0\u00a0\u00a0 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/> \u00a0\u00a0\u00a0 Low Memory Addresses (0x00000000) \u00a0<\/p>\n<p> <strong>\u00a0Some Essential Assembly Instructions for Reverse Engineering:<\/strong><\/p>\n<p> Instruction \u00a0\u00a0 \u00a0Example \u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Description<br \/> push\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0push eax \u00a0\u00a0 \u00a0Pushes the value stored in EAX onto the stack<br \/> pop \u00a0\u00a0 \u00a0pop eax \u00a0\u00a0 \u00a0Pops a value off of the stack and stores it in EAX<br \/> call \u00a0\u00a0 \u00a0call 0x08abcdef \u00a0\u00a0 \u00a0Calls a function located at 0x08abcdef<br \/> mov \u00a0\u00a0 \u00a0mov eax,0x5 \u00a0\u00a0 \u00a0Moves the value of 5 into the EAX register<br \/> sub \u00a0\u00a0 \u00a0sub eax,0x4 \u00a0\u00a0 \u00a0Subtracts 4 from the value in the EAX register<br \/> add \u00a0\u00a0 \u00a0add eax,0x1 \u00a0\u00a0 \u00a0Adds 1 to the value in the EAX register<br \/> inc \u00a0\u00a0 \u00a0inc eax \u00a0\u00a0 \u00a0Increases the value stored in EAX by one<br \/> dec \u00a0\u00a0 \u00a0dec eax \u00a0\u00a0 \u00a0Decreases the value stored in EAX by one<br \/> cmp \u00a0\u00a0 \u00a0cmp eax,edx \u00a0\u00a0 \u00a0Compare values in EAX and EDX; if equal set the zero flag* to 1<br \/> test \u00a0\u00a0 \u00a0test eax,edx \u00a0\u00a0 \u00a0Performs an AND operation on the values in EAX and EDX; if the result is zero, sets the zero flag to 1<br \/> jmp \u00a0\u00a0 \u00a0jmp 0x08abcde \u00a0\u00a0 \u00a0Jump to the instruction located at 0x08abcde<br \/> jnz \u00a0\u00a0 \u00a0jnz 0x08ffff01 \u00a0\u00a0 \u00a0Jump if the zero flag is set to 1<br \/> jne \u00a0\u00a0 \u00a0jne 0x08ffff01 \u00a0\u00a0 \u00a0Jump to 0x08ffff01 if a comparison is not equal<br \/> and \u00a0\u00a0 \u00a0and eax,ebx \u00a0\u00a0 \u00a0Performs a bit wise AND operation on the values stored in EAX and EBX; the result is saved in EAX<br \/> or \u00a0\u00a0 \u00a0or eax,ebx \u00a0\u00a0 \u00a0Performs a bit wise OR operation on the values stored in EAX and EBX; the result is saved in EAX<br \/> xor \u00a0\u00a0 \u00a0xor eax,eax \u00a0\u00a0 \u00a0Performs a bit wise XOR operation on the values stored in EAX and EBX; the result is saved in EAX<br \/> leave \u00a0\u00a0 \u00a0leave \u00a0\u00a0 \u00a0Remove data from the stack before returning<br \/> ret \u00a0\u00a0 \u00a0ret \u00a0\u00a0 \u00a0Return to a parent function<br \/> nop \u00a0\u00a0 \u00a0nop \u00a0\u00a0 \u00a0No operation (a &#8216;do nothing&#8217; instruction)<\/p>\n<p> *The zero flag (ZF) is a 1 bit indicator which records the result of a cmp or test instruction<\/p>\n<p> Each instruction performs one specific task, and can deal directly with registers, memory addresses, and the contents thereof. It is easiest to understand exactly what these functions are used for when seen in the context of a simple hello world program and try to relate assembly language with high level language such as C language.<\/p>\n<p> Here is simple C program that displays Hello World:<\/p>\n<p> \u00a0\u00a0\u00a0 int main(int argc, char *argv[])<br \/> \u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(&#8220;Hello World!\\n&#8221;);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 0;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<br \/> \u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0 \u00a0<\/p>\n<p> Save this program as helloworld.c and compile it with &#8216;gcc -o helloworld helloworld.c&#8217;; run the resulting binary and it should print &#8220;Hello World!&#8221; on the screen and exit. Ahhah&#8230; It looks quite simple. Now let&#8217;s look how it will look in assembly language.<\/p>\n<p> \u00a0\u00a0\u00a0 0x8048384\u00a0\u00a0\u00a0\u00a0 push ebp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212; Save the EBP value on the stack<br \/> \u00a0\u00a0\u00a0 0x8048385\u00a0\u00a0\u00a0\u00a0 mov ebp,esp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212; Create a new EBP value for this function<br \/> \u00a0\u00a0\u00a0 0x8048387\u00a0\u00a0\u00a0\u00a0 sub esp,0x8\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212;Allocate 8 bytes on the stack for local variables<br \/> \u00a0\u00a0\u00a0 0x804838a\u00a0\u00a0\u00a0\u00a0 and esp,0xfffffff0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212;Clear the last byte of the ESP register<br \/> \u00a0\u00a0\u00a0 0x804838d\u00a0\u00a0\u00a0\u00a0 mov eax,0x0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212;Place a zero in the EAX register<br \/> \u00a0\u00a0\u00a0 0x8048392\u00a0\u00a0\u00a0\u00a0 sub esp,eax\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212;Subtract EAX (0) from the value in ESP<br \/> \u00a0\u00a0\u00a0 0x8048394\u00a0\u00a0\u00a0\u00a0 mov DWORD PTR [esp],0x80484c4\u00a0\u00a0\u00a0\u00a0 &lt;&#8212;Place our argument for the printf() (at address\u00a0\u00a0\u00a0 0x08048384) onto the stack<br \/> \u00a0\u00a0\u00a0 0x804839b\u00a0\u00a0\u00a0\u00a0 call 0x80482b0 &lt;_init+56&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212;Call printf()<br \/> \u00a0\u00a0\u00a0 0x80483a0\u00a0\u00a0\u00a0\u00a0 mov eax,0x0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212;Put our return value (0) into EAX<br \/> \u00a0\u00a0\u00a0 0x80483a5\u00a0\u00a0\u00a0\u00a0 leave\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212;Clean up the local variables and restore the EBP value<br \/> \u00a0\u00a0\u00a0 0x80483a6\u00a0\u00a0\u00a0\u00a0 ret\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;&#8212;Pop the saved EIP value back into the EIP register<\/p>\n<p> As you can easily figure out these instructions are similar to that of C program. You can easily note that flow of program is same. Off course it will be same as its a assembly code of same binary (exe) obtained from executing above C program.<br \/> \u00a0<br \/> I hope you all like it. We will continue our discussion tomorrow where i will explain how to analyze assembly language codes for those binaries whose high level source code we don&#8217;t have.<\/p>\n<p> A quick tip for all users how to learn assembly language better&#8230;\u00a0 Pick a already made code and generate its binary or exe file and now obtains the assembly code of that binary and try to relate assembly code with high language code. I guarantee that will surely help you to understand better as I always used to do understand things like these ways only.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>What is Assembly language? Assembly language is a low level or simply called machine language made up of machine instructions. Assembly language is specific to processor architecture example different for x86 architecture than for SPARC architecture. Assembly language consist of assembly instructions and CPU registers. Isoftdl(Lokesh) means I will explain my tutorial considering x86 architecture&#8230;&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"footnotes":""},"categories":[34],"tags":[],"class_list":["post-388","post","type-post","status-publish","format-standard","hentry","category-it-security"],"_links":{"self":[{"href":"https:\/\/temp.ashkerala.com\/index.php?rest_route=\/wp\/v2\/posts\/388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/temp.ashkerala.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/temp.ashkerala.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/temp.ashkerala.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/temp.ashkerala.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=388"}],"version-history":[{"count":0,"href":"https:\/\/temp.ashkerala.com\/index.php?rest_route=\/wp\/v2\/posts\/388\/revisions"}],"wp:attachment":[{"href":"https:\/\/temp.ashkerala.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/temp.ashkerala.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/temp.ashkerala.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}