Skip to content

Commit 05d004c

Browse files
committed
old capstone
1 parent 82cbe05 commit 05d004c

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

pwnlib/asm.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,12 +1023,23 @@ def get_cs_disassembler(eabi=None):
10231023

10241024
B = {16: cs.CS_MODE_16, 32: cs.CS_MODE_32, 64: cs.CS_MODE_64}[context.bits]
10251025

1026+
try:
1027+
CS_ARCH_AARCH64 = cs.CS_ARCH_AARCH64
1028+
except Exception:
1029+
CS_ARCH_AARCH64 = cs.CS_ARCH_ARM64
1030+
raise e
1031+
try:
1032+
CS_ARCH_SYSTEMZ = cs.CS_ARCH_SYSTEMZ
1033+
except Exception:
1034+
CS_ARCH_SYSTEMZ = cs.CS_ARCH_SYSZ
1035+
raise e
1036+
10261037
params = {
10271038
'i386' : (cs.CS_ARCH_X86, B),
10281039
'amd64' : (cs.CS_ARCH_X86, B),
10291040
'thumb' : (cs.CS_ARCH_ARM, cs.CS_MODE_THUMB + E),
10301041
'arm' : (cs.CS_ARCH_ARM, cs.CS_MODE_ARM + E),
1031-
'aarch64': (cs.CS_ARCH_AARCH64, cs.CS_MODE_ARM + E),
1042+
'aarch64': (CS_ARCH_AARCH64, cs.CS_MODE_ARM + E),
10321043
'armhf' : (cs.CS_ARCH_ARM, cs.CS_MODE_THUMB + E),
10331044
'mips' : (cs.CS_ARCH_MIPS, cs.CS_MODE_32 + E),
10341045
'mips64' : (cs.CS_ARCH_MIPS, cs.CS_MODE_64 + E),
@@ -1037,7 +1048,7 @@ def get_cs_disassembler(eabi=None):
10371048
'ppc' : (cs.CS_ARCH_PPC, B + E),
10381049
'powerpc': (cs.CS_ARCH_PPC, E + cs.CS_MODE_32),
10391050
'powerpc64': (cs.CS_ARCH_PPC, E + cs.CS_MODE_64),
1040-
'em_s390': (cs.CS_ARCH_SYSTEMZ, cs.CS_MODE_BIG_ENDIAN + cs.CS_MODE_64),
1051+
'em_s390': (CS_ARCH_SYSTEMZ, cs.CS_MODE_BIG_ENDIAN + cs.CS_MODE_64),
10411052
#'ia64': None,
10421053
#'m68k': cs.CS_ARCH_M68K,
10431054
#'xcore': cs.CS_ARCH_XCORE,

pwnlib/elf/elf.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1191,8 +1191,6 @@ def libc_start_main_return(self):
11911191
elif self.arch == 'aarch64':
11921192
pass
11931193
elif self.arch in ['mips', 'mips64']:
1194-
# FIXME: `bal` was not included in CS_GRP_CALL. This is fixed on capstone v6.alpha
1195-
call_instructions = call_instructions.add(cs.CS_GRP_BRANCH_RELATIVE)
11961194
# Account for the delay slot.
11971195
call_return_offset = 2
11981196
elif self.arch in ['i386', 'amd64', 'ia64']:
@@ -1215,6 +1213,13 @@ def libc_start_main_return(self):
12151213
dis = list(self.cs_disasm(md, func.address, func.size))
12161214

12171215
filter_calls = lambda dis: ((i, x) for i, x in enumerate(dis) if call_instructions & set(x.groups))
1216+
1217+
if self.arch in ['ppc', 'powerpc', 'powerpc64']:
1218+
filter_calls = lambda dis: ((i, x) for i, x in enumerate(dis) if set([x.mnemonic]) & set(['bctrl', 'bl']))
1219+
# FIXME: `bal` was not included in CS_GRP_CALL. This is fixed on capstone v6.alpha
1220+
elif self.arch in ['mips', 'mips64']:
1221+
filter_calls = lambda dis: ((i, x) for i, x in enumerate(dis) if set([x.mnemonic]) & set(['bal', 'jalr']))
1222+
12181223
calls = list(filter_calls(dis))
12191224

12201225
def find_ret_main_addr(caller_dis, calls):
@@ -1235,9 +1240,6 @@ def find_ret_main_addr(caller_dis, calls):
12351240
if ret_addr:
12361241
return ret_addr
12371242

1238-
if self.arch in ['ppc', 'powerpc', 'powerpc64']:
1239-
filter_calls = lambda dis: ((i, x) for i, x in enumerate(dis) if set([x.mnemonic]) & set(['bctrl', 'bl']))
1240-
12411243
# `__libc_start_main` -> `__libc_start_call_main` -> `main`
12421244
# Find a direct call which calls `exit` once. That's probably `__libc_start_call_main`.
12431245
for _, insn in calls:

0 commit comments

Comments
 (0)