{"id":290,"date":"2013-02-01T21:30:03","date_gmt":"2013-02-01T21:30:03","guid":{"rendered":"http:\/\/www.gironsec.com\/blog\/?p=290"},"modified":"2013-02-25T12:21:47","modified_gmt":"2013-02-25T12:21:47","slug":"net-reversing-and-msil-modification","status":"publish","type":"post","link":"https:\/\/www.gironsec.com\/blog\/2013\/02\/net-reversing-and-msil-modification\/","title":{"rendered":".net reversing and MSIL modification"},"content":{"rendered":"<p>Hello everybody!<\/p>\n<p>Its been a wonderful new year. Full of new experiences and all that other stuff. Lately I&#8217;ve been running into a lot of .net stuff. Managed assemblies (compiled MSIL dlls) interacting with normal binaries as well as .net binaries. The beauty of it is most of the time, I can decompile them and look at the straight source code. It seems like less and less people are even bothering to obfuscate their code.<\/p>\n<p>Today I&#8217;m going to cover MSIL decompilation, recompilation, editing, reversing, and the like. We&#8217;ll be going after Solar Winds&#8217; license activation suite which is a collection of both .net managed assemblies and .net binaries. According to SolarWinds&#8217; stock index, they&#8217;re worth over 44 million USD. You&#8217;d think with that kinda money they could afford to protect their software? Or not. <\/p>\n<p>There are 3 ways to edit .net binaries and managed assemblies. The easy way, the hard way and the harder way.<\/p>\n<p>The easy way &#8211; With Red Gate&#8217;s reflector and the reflexil plugin.<\/p>\n<p>The hard way &#8211; Getting DILE to work &#8211; an open source effort at .net IL editing. The damn thing don&#8217;t work. <\/p>\n<p>The hardest way &#8211; With ildasm and ilasm &#8211; microsoft&#8217;s IL disassembler and assembler programs.<\/p>\n<p>I&#8217;ll go over each. <\/p>\n<p>The first tool, Red Gate&#8217;s Reflector is a payed tool, but totally worth it. A hundred bucks a license, its one of the few pieces of software I&#8217;m willing to pay for merely for convenience.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflector.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflector-300x168.png\" alt=\"reflector\" width=\"300\" height=\"168\" class=\"alignnone size-medium wp-image-295\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflector-300x168.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflector-1024x576.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflector.png 1600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>The 2 best plugins are Reflexil (http:\/\/reflexil.net\/), used for editing the IL code and Deblector (http:\/\/deblector.codeplex.com\/) which is an excellent .net debugger. <\/p>\n<p>Tool number 2 is DILE (http:\/\/sourceforge.net\/projects\/dile\/) <img decoding=\"async\" src=\"http:\/\/sourceforge.net\/projects\/dile\/screenshots\/32362\" \/> which stands for Dotnet.I.L.Editor, clever ehh?<br \/>\nI&#8217;m all for open source, however not when nothing works. Maybe its because I&#8217;m using the 64 bit version? Dile also supports a debugger, though once again, I never got it working.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/dile.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/dile-300x239.png\" alt=\"dile\" width=\"300\" height=\"239\" class=\"alignnone size-medium wp-image-296\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/dile-300x239.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/dile.png 826w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Lastly the hardest method of the 3, is more than 1 tool. ilasm for assembling, ildisasm disassembling, and MDbg for debugging of .net assemblies. http:\/\/msdn.microsoft.com\/en-us\/library\/ms229861.aspx ilasm and mdbg are both CLI tools, but ildisasm isn&#8217;t. All 3 come with visual studio. I say its the hardest because of what&#8217;s involved.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ildisasm1.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ildisasm1.png\" alt=\"ildisasm1\" width=\"608\" height=\"549\" class=\"alignnone size-full wp-image-310\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ildisasm1.png 608w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ildisasm1-300x270.png 300w\" sizes=\"(max-width: 608px) 100vw, 608px\" \/><\/a><\/p>\n<p>===On with the show===<br \/>\nToday we&#8217;re attacking Dameware&#8217;s Remote support, a suite of tools that allows remote administration of windows systems. I was checking this tool out the other day for its remote task manager capabilities and ease of use.<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/msil.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/msil-300x168.png\" alt=\"msil\" width=\"300\" height=\"168\" class=\"alignnone size-medium wp-image-298\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/msil-300x168.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/msil-1024x576.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/msil.png 1600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nThe binary is nothing special. In fact, the app isnt even made in .net at all. its a C++ application. The licensing application on the other hand is. <a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/solarwinds.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/solarwinds-300x135.png\" alt=\"solarwinds\" width=\"300\" height=\"135\" class=\"alignnone size-medium wp-image-299\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/solarwinds-300x135.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/solarwinds.png 942w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Loading up the licensing application with our .net decompiler, we see the application is just a stand alone app that feeds from external managed assemblies. <a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/license-form-app.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/license-form-app-300x168.png\" alt=\"license form app\" width=\"300\" height=\"168\" class=\"alignnone size-medium wp-image-301\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/license-form-app-300x168.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/license-form-app-1024x576.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/license-form-app.png 1600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>The managed assembly in question is the SolarWinds.Licensing.Framework.dll. Loading that up, we see many methods, classes and function calls.<br \/>\nI&#8217;ve saved you from some digging and isolated the internal class &#8216;LicenseValidator&#8217; and its method &#8216;IsLicenseValid&#8217;.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/digging.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/digging-300x168.png\" alt=\"digging\" width=\"300\" height=\"168\" class=\"alignnone size-medium wp-image-302\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/digging-300x168.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/digging-1024x576.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/digging.png 1600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>As you can see, the function is what we&#8217;re looking for. We see what types the method takes:<br \/>\nbyte[] licenseData, byte[] signature, byte[] nodeLockInfo, byte[] serialNumber, LicenseType type, byte licenseInterfaceRevision<br \/>\nWe see the return value &#8211; true or false.<\/p>\n<p>We know what we need to patch to make every license we pass valid. <\/p>\n<p>Now, how do we do it? <\/p>\n<p>===The easy way===<br \/>\nThe easiest way is with Red Gate&#8217;s .net reflector and its sister plugin reflexil.<\/p>\n<p>Here, we load up the plugin and see the MSIL instructions in the bottom window.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil1.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil1-300x168.png\" alt=\"reflexil1\" width=\"300\" height=\"168\" class=\"alignnone size-medium wp-image-304\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil1-300x168.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil1-1024x576.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil1.png 1600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>We right click and choose &#8216;replace all with code&#8217;. The mini .net compiler window pops up.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil2.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil2-300x198.png\" alt=\"reflexil2\" width=\"300\" height=\"198\" class=\"alignnone size-medium wp-image-305\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil2-300x198.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil2.png 736w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Next we re-code the function to our liking. In this case, I am making the code always return true. We then hit the &#8216;compile&#8217; button and our instructions window on the top right shows our new MSIL instructions.<br \/>\n&#8212;&#8212;&#8212;<br \/>\nldci4.1<br \/>\nret<br \/>\n&#8212;&#8212;&#8212;<br \/>\nldc.i4.X\u2014loads a 32-bit constant (X from 0 to 8) onto the stack<br \/>\nret &#8211; return.<br \/>\nThis makes sense right? Load the value &#8216;4&#8217;  onto the stack and return. Unlike traditional assembly where one would assume to &#8216;push 1&#8217; for the value of true, we are pushing 4. Why? I don&#8217;t know, .net is weird like that \ud83d\ude00<\/p>\n<p>After pressing &#8216;ok&#8217;, the new instructions we compiled will be present in the lower right pane. All that&#8217;s left now is to save our changes.<br \/>\nThis is done by right clicking the assembly on the left, choosing the reflexil plugin, then choosing &#8216;save as&#8217; which brings up a save window.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil4.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil4-300x168.png\" alt=\"reflexil4\" width=\"300\" height=\"168\" class=\"alignnone size-medium wp-image-306\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil4-300x168.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil4-1024x574.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil4.png 1602w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>And that&#8217;s it. Easy as pie.<\/p>\n<p>When we re-disassemble our managed assembly, the function now shows the code we patched seen here with ilspy: <a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil5.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil5-300x159.png\" alt=\"reflexil5\" width=\"300\" height=\"159\" class=\"alignnone size-medium wp-image-307\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil5-300x159.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil5-1024x543.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/reflexil5.png 1125w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>===The hard way===<\/p>\n<p>Sometimes you may night have the hundred bucks to shell out on Red Gate&#8217;s Reflector. You&#8217;re a hobbyist with not too much cash, but an interest to learn. There is hope though, provided you&#8217;re willing to re-code some stuff. DILE off of source forge offers a similiar experience for free. Problem is, the THING DONT WORK. At ALL. Maybe its because I&#8217;m running 64 bit windows and the version I have is inferior? Or maybe the project was abandoned in 2011. Either way, its fail.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/1242839853599.jpg\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/1242839853599.jpg\" alt=\"1242839853599\" width=\"360\" height=\"450\" class=\"alignnone size-full wp-image-308\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/1242839853599.jpg 360w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/1242839853599-240x300.jpg 240w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/a><br \/>\nI want to believe it works, but signs point to doubt on this one. <\/p>\n<p>===The harder way===<\/p>\n<p>There is nothing wrong with this method. It does work. There are more steps, but at least its free. The tools come included with Visual Studio Express. <\/p>\n<p>A brief run down: First we disassemble the binary \/ assembly to a .il file, then edit the code, save the file, then re-compile with ilasm, assuming you got the MSIL syntax correct (which isnt exactly easy to find reference wise). If you team this with something like ilspy, it will save a bunch of work of tracking down the method \/ class names.<\/p>\n<p>We use the ildisassembler tool for this:<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ildisasm.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ildisasm-300x187.png\" alt=\"ildisasm\" width=\"300\" height=\"187\" class=\"alignnone size-medium wp-image-297\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ildisasm-300x187.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ildisasm.png 865w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nClick file, then dump, then select a directory to place the disassebmled code in.<\/p>\n<p>Now we open the .il file (msil code) in notepad and look for the function we want.<br \/>\nWe already know we&#8217;re searching for the class LicenseValidator, and its method IsLicenseValid.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/solarwindsmsilnotepad.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/solarwindsmsilnotepad-300x168.png\" alt=\"solarwindsmsilnotepad\" width=\"300\" height=\"168\" class=\"alignnone size-medium wp-image-313\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/solarwindsmsilnotepad-300x168.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/solarwindsmsilnotepad-1024x576.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/solarwindsmsilnotepad.png 1600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>All we have to do now is replace the MSIL code with our other code that makes the code return true.<\/p>\n<p>.method public hidebysig newslot virtual final<br \/>\ninstance bool  IsLicenseValid(uint8[] licenseData, uint8[] signature, uint8[] nodeLockInfo, uint8[] serialNumber, valuetype SolarWinds.Licensing.Framework.LicenseType &#8216;type&#8217;, uint8 licenseInterfaceRevision) cil managed<br \/>\n  {<br \/>\n    \/\/ Code size       2 (0x2)<br \/>\n    .maxstack  8<br \/>\n    IL_0000:  ldc.i4.1<br \/>\n    IL_0001:  ret<br \/>\n  } \/\/ end of method LicenseValidator::IsLicenseValid<\/p>\n<p>Look familiar? ldc.i4.1, then ret? Yeah, same as our reflexil code. If you need to reference other code, I suggest reading up on <a href=\"http:\/\/www.codeguru.com\/csharp\/.net\/net_general\/il\/article.php\/c4635\/MSIL-Tutorial.htm\">MSIL syntax<\/a>. Another convenient method is to code something up in visual studio, then decompile it with the ildisasm tool and copy + paste. It works.<\/p>\n<p>Now we need only re-assemble our code.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm-300x275.png\" alt=\"ilasm\" width=\"300\" height=\"275\" class=\"alignnone size-medium wp-image-314\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm-300x275.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm.png 797w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Run the ilasm command against the saved .il file (you saved it right?) along with the proper command line arguments such as \/dll for managed assemblies.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm3.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm3-300x255.png\" alt=\"ilasm3\" width=\"300\" height=\"255\" class=\"alignnone size-medium wp-image-316\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm3-300x255.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm3.png 837w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nAssuming all goes well and you didn&#8217;t make any syntax errors, you&#8217;re all done. The managed assembly or exe will be assembled in the same directory as the .il file. <\/p>\n<p>One thing worth noting is you need all the resource files and crap that ildisasm drops into the same directory as the .IL file, otherwise the thing wont complile:<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm2.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm2-300x223.png\" alt=\"ilasm2\" width=\"300\" height=\"223\" class=\"alignnone size-medium wp-image-294\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm2-300x223.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2013\/02\/ilasm2.png 981w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>And that&#8217;s all there is too it. We place the modified managed assembly in the same directory as the licensing application and presto! The application accepts any license we pass it.<\/p>\n<p>More work is involved if the code is obfuscated, but that sounds like another post for another day. <\/p>\n<p>The next post we&#8217;ll be attacking a popular windows mail server. Another .net application from a company who doesn&#8217;t feel like fully obfuscating their binaries. <\/p>\n<p>Happy cracking!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello everybody! Its been a wonderful new year. Full of new experiences and all that other stuff. Lately I&#8217;ve been running into a lot of .net stuff. Managed assemblies (compiled MSIL dlls) interacting with normal binaries as well as .net binaries. The beauty of it is most of the time, I can decompile them and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5,7],"tags":[40,44,39,42,38,34,37,43,41],"_links":{"self":[{"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/posts\/290"}],"collection":[{"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/comments?post=290"}],"version-history":[{"count":12,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/posts\/290\/revisions"}],"predecessor-version":[{"id":349,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/posts\/290\/revisions\/349"}],"wp:attachment":[{"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/media?parent=290"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/categories?post=290"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/tags?post=290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}