From 6f6e1ed92c9dcf220ebdc7672358cc2742168c0c Mon Sep 17 00:00:00 2001 From: Jack Bond-Preston Date: Sat, 28 Nov 2020 15:31:36 +0000 Subject: [PATCH] neater address variable management --- .../ropgadget/ropchain/arch/ropmakerx86.py | 83 ++++++++++++++----- autoRop.py | 3 +- rop.txt | 4 + test.sh | 3 + 4 files changed, 69 insertions(+), 24 deletions(-) create mode 100644 rop.txt create mode 100755 test.sh diff --git a/ROPgadget/ropgadget/ropchain/arch/ropmakerx86.py b/ROPgadget/ropgadget/ropchain/arch/ropmakerx86.py index 290fb50..e2779b6 100644 --- a/ROPgadget/ropgadget/ropchain/arch/ropmakerx86.py +++ b/ROPgadget/ropgadget/ropchain/arch/ropmakerx86.py @@ -84,7 +84,6 @@ class ROPMakerX86(object): return p def __buildRopChain(self, write4where, popDst, popSrc, xorSrc, xorEax, incEax, popEbx, popEcx, popEdx, syscall): - sects = self.__binary.getDataSections() dataAddr = None for s in sects: @@ -103,12 +102,38 @@ class ROPMakerX86(object): command = (4 - (len(command) % 4)) * "/" + command command_chunks = wrap(command, 4) + ## EXEC (ARG0) \0 ARG1 \0 ARG2 \0 ... \0 PTR->EXEC PTR->ARG1 PTR->ARG2 ... \0 ## + + args = [] + + # & ( "cat" \0 ) + exec_addr = dataAddr + + arg_addr = [] + + # setup argv array + # [ & "--run" \0 , & "--verbose" \0 ] + # note that the null bytes may be written "earlier", when the string is not len % 4 == 0 + acc_addr = exec_addr + len(command) + 4 + for i, arg in enumerate(args): + arg_addr.append(acc_addr) + + acc_addr += len(arg) + (4 - (len(arg) % 4)) + 4 + + # & ( [ ptr -> "cat" ] ++ arg_addr ) + argv_addr = acc_addr + + env_addr = argv_addr + (len(args) * 4) + 4 + + del acc_addr + + ################### + # WRITE EXEC PATH # + ################### + # write the command - address = 0 - offset = 0 for i, chunk in enumerate(command_chunks): - offset = (i * 4) - address = dataAddr + offset + address = exec_addr + (i * 4) p += pack(" [edx] + # write the exec path address to argv[0] p += pack(' 11 for i in range(11): p += pack('