(self)
| 499 | |
| 500 | # TODO: add size check |
| 501 | def loadStack(self): |
| 502 | |
| 503 | argvs_ptr = [] |
| 504 | envs_ptr = [] |
| 505 | apple_ptr = [] |
| 506 | |
| 507 | all_str = self.make_string(self.argvs, self.envs, self.apples) |
| 508 | self.push_stack_string(all_str) |
| 509 | ptr = self.stack_sp |
| 510 | |
| 511 | for item in self.argvs[::-1]: |
| 512 | argvs_ptr.append(ptr) # need pack and tostring |
| 513 | self.ql.log.debug('add argvs ptr {}'.format(hex(ptr))) |
| 514 | ptr += len(item) + 1 |
| 515 | |
| 516 | for item in self.envs[::-1]: |
| 517 | envs_ptr.append(ptr) |
| 518 | self.ql.log.debug('add envs ptr {}'.format(hex(ptr))) |
| 519 | ptr += len(item) + 1 |
| 520 | |
| 521 | for item in self.apples[::-1]: |
| 522 | apple_ptr.append(ptr) |
| 523 | self.ql.log.debug('add apple ptr {}'.format(hex(ptr))) |
| 524 | ptr += len(item) + 1 |
| 525 | |
| 526 | ptr = self.stack_sp |
| 527 | self.push_stack_addr(0x0) |
| 528 | ptr -= 4 |
| 529 | |
| 530 | for item in apple_ptr: |
| 531 | self.push_stack_addr(item) |
| 532 | ptr -= 4 |
| 533 | |
| 534 | self.push_stack_addr(0x0) |
| 535 | ptr -= 4 |
| 536 | |
| 537 | for item in envs_ptr: |
| 538 | ptr -= 4 |
| 539 | self.push_stack_addr(item) |
| 540 | |
| 541 | self.push_stack_addr(0x0) |
| 542 | ptr -= 4 |
| 543 | |
| 544 | for item in argvs_ptr: |
| 545 | ptr -= 4 |
| 546 | self.push_stack_addr(item) |
| 547 | self.ql.log.debug("SP 0x%x, content 0x%x" % (self.stack_sp, item)) |
| 548 | argvs_ptr_ptr = ptr |
| 549 | |
| 550 | self.push_stack_addr(self.argc) |
| 551 | ptr -= 4 |
| 552 | self.ql.log.debug("SP 0x%x, content 0x%x" % (self.stack_sp, self.argc)) |
| 553 | |
| 554 | if self.using_dyld: |
| 555 | ptr -= 4 |
| 556 | #ql.log.info("Binary Dynamic Entry Point: {:X}".format(self.binary_entry)) |
| 557 | self.push_stack_addr(self.macho_file.header_address) |
| 558 | # self.push_stack_addr(self.binary_entry) |
no test coverage detected