Interviews are more than just a Q&A session—they’re a chance to prove your worth. This blog dives into essential Cutter interview questions and expert tips to help you align your answers with what hiring managers are looking for. Start preparing to shine!
Questions Asked in Cutter Interview
Q 1. Explain the core functionalities of Cutter.
Cutter is a powerful, open-source reverse engineering platform built on top of the Qt framework. Its core functionality centers around providing a user-friendly interface for analyzing binary files. Think of it as a sophisticated digital microscope for examining the inner workings of programs. At its heart, Cutter offers several key features:
- Disassembly: Cutter excels at disassembling various binary formats (x86, ARM, MIPS, etc.), presenting the code in a clear and navigable manner. This allows reverse engineers to understand the program’s logic and identify potential vulnerabilities.
- Debugging: It offers robust debugging capabilities, allowing users to step through code execution, inspect registers and memory, and set breakpoints. This is crucial for understanding the dynamic behavior of the program.
- Graph Visualization: Cutter visualizes the control flow of the program through a powerful graph view, making it easier to grasp the overall structure and identify key functions or code sections. Imagine a map of the program’s execution path.
- Scripting: It supports scripting in Python, allowing automation of repetitive tasks and custom analysis. This is incredibly useful for extending Cutter’s functionality and tailoring it to specific needs.
- Import/Export: Cutter supports various import and export formats for binaries and analysis data, ensuring seamless integration with other tools in a reverse engineering workflow.
For instance, I once used Cutter to analyze a suspicious Android APK. The graph visualization helped me quickly identify the malware’s core functionality hidden within obfuscated code.
Q 2. Describe your experience with Cutter’s scripting capabilities.
I have extensive experience leveraging Cutter’s Python scripting capabilities. It’s a game-changer for efficiency. Instead of manually performing repetitive tasks, I can automate them, saving significant time and reducing the risk of human error. For example, I’ve written scripts to:
- Automate function identification: Automatically identify and tag functions based on patterns or heuristics.
- Generate reports: Create custom reports summarizing analysis findings, including identified functions, strings, and potential vulnerabilities.
- Perform data extraction: Extract specific data from the binary, such as strings, constants, or API calls.
- Extend the UI: I’ve even created custom plugins to add specific features not natively available in the GUI.
Here’s a simple example of a Python script to extract all strings from a binary using Cutter’s API:
from cutter import *
c = Cutter()
strings = c.get_strings()
for s in strings:
print(s)This is just a basic example. The possibilities are virtually limitless with deeper understanding of the API.
Q 3. How would you troubleshoot a common Cutter error?
Troubleshooting Cutter errors often involves a systematic approach. Common errors include crashes, plugin issues, and compatibility problems. My process typically includes:
- Check Cutter’s logs: Cutter generates log files that provide valuable information about errors. Examining these logs often reveals the root cause of the problem.
- Verify the binary’s integrity: Ensure that the binary being analyzed is not corrupted. A corrupted binary can lead to unexpected crashes or errors.
- Check for updates: Make sure Cutter and its plugins are up to date. Outdated versions might have known bugs that have been fixed in later releases.
- Investigate plugin conflicts: If the issue arises after installing new plugins, try disabling them one by one to identify the culprit. Plugin conflicts are a common source of issues.
- Review the documentation and community forums: The Cutter documentation and online communities often contain solutions to commonly encountered problems.
- Simplify the analysis: If dealing with a complex binary, try analyzing a smaller section to isolate the source of the error. Sometimes the issue is not with Cutter itself, but with the complexity of the binary.
For instance, I once encountered a crash when analyzing a large binary. By examining the logs, I found a memory leak issue in a specific plugin. Disabling that plugin resolved the problem.
Q 4. What are the advantages and disadvantages of using Cutter?
Cutter offers several advantages, but also has some limitations.
- Advantages:
- Open-source and free: This makes it accessible to everyone.
- Cross-platform: It runs on Windows, Linux, and macOS.
- Powerful scripting capabilities: Python scripting allows for automation and customization.
- User-friendly interface: Compared to some command-line-only tools, its interface makes learning easier.
- Active community: A strong community provides support and contributes to its development.
- Disadvantages:
- Resource intensive: Analyzing large binaries can be resource-heavy.
- Steeper learning curve than some simpler tools: Mastering all its features requires time and effort.
- Debugging limitations compared to dedicated debuggers: While Cutter has debugging capabilities, dedicated debuggers might offer more advanced features.
In summary, Cutter is a powerful tool but requires a commitment to learning its functionalities. It’s perfect for users who prioritize customization and automation, but maybe not the ideal entry-level choice for beginners needing the simplest of reverse engineering features.
Q 5. Compare Cutter to other similar tools.
Cutter compares favorably to other reverse engineering tools like Ghidra and IDA Pro. Each tool has its strengths and weaknesses:
- Cutter vs. Ghidra: Both are open-source and offer comparable functionality. Cutter is known for its more user-friendly interface, while Ghidra boasts more mature development and a larger community. The choice often depends on personal preference and the specific analysis needs.
- Cutter vs. IDA Pro: IDA Pro is a commercial, industry-standard tool known for its advanced features and powerful analysis capabilities. However, it comes with a high price tag. Cutter offers a free alternative with much of IDA’s functionality, though sometimes falling behind in terms of advanced features or performance on extremely large binaries.
For instance, if budget is a constraint, Cutter’s open-source nature and rich feature-set are appealing. However, for professional projects needing absolute cutting-edge capabilities, IDA Pro might be the superior choice.
Q 6. How do you ensure data security and integrity when working with Cutter?
Data security and integrity are paramount when working with Cutter, especially when dealing with sensitive binaries. My approach emphasizes several key strategies:
- Secure environment: I always work in a secure, isolated environment, such as a virtual machine (VM), to prevent contamination or compromise of the host system. This creates a sandbox for the analysis.
- Data encryption: Sensitive binaries are encrypted both in transit and at rest. Tools like VeraCrypt can help ensure that the data remains confidential even if the system is compromised.
- Access control: Access to the VM and the analysis data is strictly controlled through appropriate access rights and permissions.
- Regular backups: Regular backups are essential to protect against data loss or accidental deletion.
- Careful handling of temporary files: Cutter generates temporary files during analysis. I ensure these are properly managed and deleted after the analysis is completed to reduce risk of data exposure.
- Regular updates: Keeping Cutter and the operating system updated is crucial to mitigate security vulnerabilities.
It’s akin to working with sensitive documents in a real-world setting – you wouldn’t leave them lying around; you’d lock them away securely, create copies, and shred them when no longer needed.
Q 7. Explain your experience with Cutter’s reporting features.
Cutter’s reporting features are quite flexible, though not as comprehensive as some dedicated reporting tools. The primary method for generating reports is through scripting. I frequently use Python scripts to automate the generation of reports containing:
- Function summaries: Descriptions of key functions and their parameters.
- String analysis: Lists of interesting strings extracted from the binary.
- Cross-references: Details about how different parts of the code interact.
- Vulnerability reports: Identifying potential security flaws.
While Cutter doesn’t have a built-in report generation wizard, the flexibility of scripting means the reports can be formatted and tailored in the desired manner, exporting the data to common formats like CSV or plain text for later processing. Think of it like a powerful database – it holds the information, but you write your own queries to extract it and present it in the most suitable manner for the intended audience.
Q 8. Describe your experience with Cutter’s API integration.
My experience with Cutter’s API integration is extensive. I’ve leveraged it to automate various tasks, from scripting complex analysis workflows to integrating Cutter with other tools in our analysis pipeline. Cutter’s API, based on its Python scripting capabilities, is remarkably versatile. For instance, I’ve successfully integrated it with our internal ticketing system, automatically generating reports on completed analyses. This automation significantly reduces manual effort and improves efficiency.
One specific example involved automating the process of analyzing thousands of firmware images. Using the API, I wrote a script that iterated through a directory, loaded each firmware into Cutter, performed a predefined set of analyses (e.g., function identification, string extraction), and exported the results to a centralized database. This dramatically sped up our analysis process and allowed us to analyze much larger datasets than previously possible. Furthermore, error handling and logging were implemented using the API’s exception handling mechanisms ensuring robust operation.
Q 9. How do you handle large datasets within Cutter?
Handling large datasets in Cutter requires a strategic approach. Simply loading massive files directly can overwhelm the system. My preferred method involves a combination of techniques. First, I utilize Cutter’s powerful filtering capabilities to focus on specific regions of interest within the dataset, reducing the amount of data needing processing. Then, I often employ a divide-and-conquer strategy. I break down the large dataset into smaller, manageable chunks, process each chunk individually, and then aggregate the results. This approach minimizes memory consumption and allows for more efficient parallel processing. If needed, I utilize Cutter’s scripting capabilities (Python) to further optimize the process by automating the chunking, analysis, and aggregation steps. For extremely large datasets, working directly with the underlying database might be necessary, querying the relevant parts instead of loading the whole dataset into Cutter’s memory.
# Example Python snippet (Illustrative):
import os
for filename in os.listdir(data_directory):
# Process each file individually
...Q 10. What are your preferred Cutter workflows for [specific task, e.g., data analysis]?
For data analysis in Cutter, my workflow typically follows these steps: First, I import the binary and use Cutter’s powerful disassembly and decompilation features to get a comprehensive overview of the code’s structure. I then employ Cutter’s graph visualization to identify functions and code blocks of interest. Next, I leverage Cutter’s scripting capabilities to automate data extraction tasks, such as extracting function arguments, strings, and cross-references. This extracted data is then analyzed using external tools like spreadsheets or specialized analysis platforms (e.g., Python with Pandas for statistical analysis). Finally, the results are correlated and interpreted to derive meaningful insights.
For example, when analyzing malware, I would use this workflow to identify malicious functions, extract command-and-control (C&C) server addresses and subsequently cross-reference them against known malicious domains for threat intelligence.
Q 11. Explain your experience with Cutter’s performance optimization techniques.
Performance optimization in Cutter is crucial when dealing with complex binaries. My strategies include profiling the analysis to identify bottlenecks, using Cutter’s efficient data structures, and leveraging its scripting capabilities to implement parallel processing where feasible. For example, using Python’s multiprocessing library within Cutter scripts allows us to distribute analysis tasks across multiple CPU cores. Another technique is to optimize database queries for specific analysis goals, ensuring the retrieval of only necessary data. Moreover, I avoid redundant computations by caching frequently accessed data structures within the analysis script, whenever possible, and utilizing efficient algorithms and data structures for operations inside the scripts themselves. Regularly updating to the latest version of Cutter can also significantly impact performance as new optimization enhancements are frequently integrated.
Q 12. How do you validate and verify data processed by Cutter?
Data validation and verification are paramount. I employ a multi-layered approach. First, I visually inspect the results generated by Cutter, comparing them against known information or expectations. Second, I use automated checks within Cutter’s scripting environment (Python) to verify data consistency and completeness. For example, I might write a script to check for expected function signatures or string patterns. Third, I cross-reference the data with external sources or tools. This might involve comparing extracted strings to known threat intelligence databases or running the extracted data through additional analysis tools. Finally, for critical analyses, I employ manual review, particularly for complex scenarios where automated checks might not fully suffice.
Q 13. Describe your experience with Cutter’s version control.
Cutter’s integration with version control systems (like Git) is a vital part of my workflow. I consistently track changes to my Cutter projects, analyses, and scripts using Git. This allows me to easily revert to previous states if necessary, collaborate effectively with others, and maintain a detailed audit trail of all modifications. Each analysis project is treated as a separate Git repository for better organization and management. The commit messages provide clear documentation of the changes made for improved traceability and repeatability of the analysis process.
Q 14. Explain a time you had to debug a complex issue in Cutter.
One particularly challenging debugging experience involved a seemingly random crash in Cutter during a large-scale analysis. After meticulous investigation using Cutter’s built-in debugging features (like the Python debugger), along with extensive logging within my scripts, I discovered the issue was due to a memory leak within a specific Python library used during the analysis. The leak occurred only under certain conditions related to the size and structure of the analyzed data, making it difficult to reproduce initially. The solution involved updating the library to a more recent version that addressed the memory management issue. This highlighted the importance of thorough testing, robust logging, and a systematic debugging approach when dealing with complex analysis scenarios in Cutter. Utilizing a debugger effectively allowed me to pinpoint the exact point of failure and follow the data flow to understand the root cause of the crash.
Q 15. How do you ensure data quality when using Cutter?
Data quality in Cutter is paramount for accurate analysis. It hinges on several key aspects. First, the source of the data itself must be reliable. If your input binary is corrupted or incomplete, Cutter’s analysis will be flawed. Think of it like baking a cake – if your ingredients are bad, the cake will be bad.
Secondly, Cutter’s own functionality contributes to data quality. Its ability to accurately disassemble code, identify functions, and resolve symbols directly impacts the reliability of the results. Regular updates to Cutter’s underlying database and algorithms are crucial for maintaining this accuracy. It’s like keeping your oven calibrated for consistent baking results.
Finally, the user’s interpretation of the data plays a crucial role. A skilled analyst knows how to identify potential inaccuracies and biases in the data presented by Cutter. It’s like a chef tasting the cake to check its doneness and seasoning.
In practice, I verify data quality by cross-referencing Cutter’s findings with other tools, inspecting the raw data for anomalies, and rigorously documenting my analysis process. This ensures transparency and allows for repeatability and verification by others.
Career Expert Tips:
- Ace those interviews! Prepare effectively by reviewing the Top 50 Most Common Interview Questions on ResumeGemini.
- Navigate your job search with confidence! Explore a wide range of Career Tips on ResumeGemini. Learn about common challenges and recommendations to overcome them.
- Craft the perfect resume! Master the Art of Resume Writing with ResumeGemini’s guide. Showcase your unique qualifications and achievements effectively.
- Don’t miss out on holiday savings! Build your dream resume with ResumeGemini’s ATS optimized templates.
Q 16. Describe your experience with Cutter’s automation capabilities.
Cutter’s automation capabilities are a game-changer for large-scale reverse engineering tasks. I’ve extensively used its scripting capabilities (primarily Python) to automate repetitive analysis procedures. For instance, I’ve built scripts to automatically identify and extract specific function parameters across a large number of binaries, significantly reducing manual effort. This automation greatly increases efficiency and consistency in my analysis.
One specific example involved analyzing a family of malware variants. Instead of manually inspecting each binary, I wrote a script that used Cutter’s API to extract specific features, such as strings, imports, and function calls. This automated process generated a comprehensive report highlighting similarities and differences between the variants, saving me considerable time and effort. This allows for more in-depth analysis of the identified patterns and relationships.
# Example Python script snippet (Illustrative) import cutter # ... Cutter API calls to automate analysis ...Q 17. How do you maintain and update Cutter configurations?
Maintaining and updating Cutter configurations is straightforward but crucial. Cutter’s configuration files (usually JSON or YAML) control various aspects of its behavior, from the debugger settings to the plugins it uses. Regular backups of these configuration files are essential, akin to backing up your computer’s operating system.
Updates are typically managed through Cutter’s built-in update mechanisms or by manually replacing the configuration files with updated versions. However, before applying any updates, always back up your existing configuration to avoid data loss. When updating, pay attention to any release notes or documentation to ensure compatibility with existing plugins and scripts.
My approach involves a version control system (like Git) to track configuration changes over time, allowing me to easily revert to earlier versions if necessary. Think of it as meticulously tracking each revision of a software project for easy debugging or rollbacks.
Q 18. Explain your understanding of Cutter’s security best practices.
Security best practices when using Cutter center around managing the data it processes. Because Cutter handles potentially malicious binaries, it’s crucial to operate it in a secure and isolated environment. This includes using a virtual machine (VM) or container to prevent any potential compromise from affecting your primary system. This is akin to using a dedicated ‘sandbox’ environment for testing risky software.
Furthermore, regularly updating Cutter and its dependencies is paramount to patching known vulnerabilities. This is like updating antivirus software to stay protected against the latest threats.
Finally, securing access to the data processed by Cutter is crucial. This might involve implementing strong password policies, restricting network access, and employing encryption for sensitive data. In essence, it’s about ensuring ‘defense in depth’ across all the security layers.
Q 19. How would you approach integrating Cutter with other systems?
Integrating Cutter with other systems often involves leveraging its powerful API or using intermediary tools. The API allows programmatic control of Cutter, enabling automation and data exchange. For instance, you could write a script to send analysis results directly to a SIEM (Security Information and Event Management) system or a vulnerability management platform.
For less programmatic interactions, you might use data export features from Cutter (e.g., exporting graphs or function calls into a common format like JSON or CSV) and then import that data into your target system. This approach works well when the integration doesn’t require real-time interaction with Cutter itself. This is like exporting data from a spreadsheet program and importing it into another application.
The specific integration approach depends heavily on the target system’s capabilities and the nature of the data being exchanged. Detailed planning and careful consideration of data formats and communication protocols are key for successful integration.
Q 20. Describe your experience with Cutter in a cloud environment.
My experience with Cutter in a cloud environment has been primarily focused on using cloud-based virtual machines. This provides the necessary isolation and scalability needed for large-scale reverse engineering projects. Cloud platforms offer the flexibility to easily provision and manage powerful VMs with the resources required for intensive analysis tasks. This is beneficial especially when you require processing power exceeding your local hardware capabilities.
However, security remains a primary concern. It is imperative to leverage the cloud provider’s security features (like virtual private clouds and network access controls) to protect the VM and its data. Data encryption both in transit and at rest is also crucial. It’s akin to renting a secure office space in a reputable building to safeguard your valuable documents.
Q 21. How do you handle user access control within Cutter?
User access control in Cutter is typically handled through the underlying operating system’s security mechanisms (e.g., file permissions on Linux or Windows). Restricting access to Cutter’s installation directory and configuration files is a fundamental step. This is analogous to securing a physical facility using locks and access cards.
In more advanced scenarios, you might integrate Cutter into a larger security infrastructure that manages user authentication and authorization (e.g., LDAP or Active Directory). This allows for centralized user management and granular control over who can access and utilize Cutter.
Furthermore, if you are sharing Cutter analysis results with collaborators, consider using version control systems and secure data sharing platforms to ensure only authorized individuals can access sensitive data. In short, user access control in Cutter is multifaceted, requiring a layered security approach.
Q 22. How do you document Cutter processes and procedures?
Documenting Cutter processes and procedures is crucial for reproducibility and collaboration. My approach involves a multi-faceted strategy combining in-built Cutter features and external documentation tools. I leverage Cutter’s built-in scripting capabilities (e.g., Python) to generate reports detailing analysis steps and findings. This ensures that the analysis process is automatically documented, providing a detailed chronological record of actions and their outcomes.
Additionally, I utilize external tools like Markdown or Confluence to create comprehensive documentation that goes beyond automated reports. This documentation includes:
- Workflow diagrams: Visual representations of the analysis steps, facilitating understanding of the process flow.
- Script explanations: Detailed comments within scripts, clarifying their purpose and logic for future review and modification.
- Analysis summaries: Concise reports summarizing key findings and their interpretations.
- Data dictionaries: Definitions of relevant data structures and their interpretations used within the analysis.
This combined approach ensures thorough documentation, allowing others to understand, reproduce, and build upon the analysis performed using Cutter.
Q 23. Explain your approach to problem-solving when using Cutter.
My problem-solving approach in Cutter is systematic and iterative. It starts with a clear understanding of the problem and defining the desired outcome. I then break down the problem into smaller, manageable tasks.
For example, if I’m analyzing a malware sample, I first focus on identifying the entry point, then dissect the relevant code sections. I utilize Cutter’s features systematically, beginning with basic static analysis (disassembly, strings, imports/exports), progressively moving to dynamic analysis (if necessary, using techniques such as debugging or emulators) as the complexity increases.
Throughout the process, I heavily rely on Cutter’s powerful scripting capabilities to automate repetitive tasks and consolidate results. This allows for efficient exploration of the sample and increases the accuracy of my findings. If I encounter a roadblock, I utilize online resources, collaborate with colleagues, and potentially experiment with different analysis methods to overcome it. My workflow emphasizes meticulous record-keeping, ensuring traceability and the ability to revisit prior steps if necessary.
Q 24. What are some limitations of Cutter?
While Cutter is a powerful reverse engineering tool, it does have certain limitations. Some notable ones include:
- Resource Intensive: Analyzing large or complex binaries can require significant system resources, potentially slowing down the analysis process.
- Limited Support for Certain Architectures: Although Cutter supports a wide array of architectures, support for certain less common or exotic architectures might be limited or require additional plugins.
- Dependency on Plugins: Some advanced functionalities require specific plugins, and the availability and compatibility of these plugins might vary.
- Steep Learning Curve: Mastering Cutter’s advanced features and scripting capabilities requires significant time and effort.
- Debugging Limitations: While Cutter offers debugging capabilities, these may not be as comprehensive as dedicated debuggers.
It is important to understand these limitations and to choose the right tools for the specific task at hand.
Q 25. Describe a situation where you had to creatively solve a problem using Cutter.
I once encountered a packed binary that resisted standard unpacking techniques. Many popular tools failed to effectively unpack it. Using Cutter, I leveraged its scripting capabilities and combined static and dynamic analysis. Initially, I used static analysis to identify the packer’s characteristics and its routines. Then, I created a custom script in Python using the Cutter API to partially unpack the sample by selectively executing specific functions within the packer in a controlled environment using a combination of debugging and single-stepping. This approach yielded significantly better results compared to using standard unpacking tools, successfully revealing the underlying code without corrupting the sample.
Q 26. How would you train a new user on Cutter?
Training a new user on Cutter involves a phased approach focusing on practical application and hands-on experience. I would start with a foundational introduction to the core concepts of reverse engineering, explaining the importance of assembly language, data structures, and common malware techniques.
Next, I would introduce the Cutter interface and basic functionalities, showing how to open, navigate, and perform simple analysis tasks such as identifying strings, imports, and exports. I then progressively introduce more advanced features, including debugging, scripting, and the use of plugins. Throughout the training, I would use real-world examples, encouraging the trainee to actively participate by working through sample problems and exercises. This practical approach, combined with regular feedback and mentoring, accelerates learning and builds confidence in using Cutter effectively.
Q 27. What are your future goals regarding your Cutter skillset?
My future goals regarding Cutter involve deepening my understanding of its scripting capabilities and exploring its application in more complex scenarios. I aim to expand my proficiency in developing custom plugins to address specific analysis challenges. Furthermore, I plan to explore integrating Cutter into automated malware analysis pipelines, leveraging its strengths for efficient threat intelligence gathering.
Q 28. What are some advanced techniques you have used in Cutter?
I have used several advanced techniques in Cutter. One example is leveraging its scripting capabilities to automate the process of identifying and extracting obfuscated strings from malware samples. This often involves dynamically executing certain code sections in a controlled environment using the debugger, then correlating the resulting output with the program’s static analysis data, helping to recover hidden information.
Another instance is using the Frida integration within Cutter for dynamic analysis, allowing me to inject JavaScript code into running processes for runtime analysis and instrumentation. This is particularly useful for understanding the behavior of complex malware samples that exhibit polymorphism or anti-analysis techniques. Finally, I’ve employed Cutter’s graph visualization features to map code flow and identify functions of interest. This visual representation assists in understanding complex code and facilitates identification of malicious patterns more efficiently.
Key Topics to Learn for Cutter Interview
- Data Structures in Cutter: Understanding how Cutter handles and manages various data structures is crucial. Explore the efficiency and limitations of different approaches.
- Cutter’s Scripting Capabilities: Learn how to leverage scripting within Cutter for automation and extending its functionality. Practice writing scripts to solve common tasks.
- Reverse Engineering Techniques with Cutter: Master the core reverse engineering principles applied within Cutter. This includes understanding disassembly, debugging, and identifying critical code segments.
- Analyzing Binary Files using Cutter: Familiarize yourself with different file formats and how Cutter handles them. Practice analyzing various binary types to extract relevant information.
- Plugin Development and Extension: Explore the possibility of extending Cutter’s capabilities by developing and integrating custom plugins. Understanding the architecture is beneficial.
- Memory Analysis and Debugging in Cutter: Learn to effectively debug and analyze memory operations within Cutter. This includes understanding memory allocation, segmentation, and potential vulnerabilities.
- Practical Application: Vulnerability Discovery: Apply your Cutter skills to identify and understand potential vulnerabilities in sample binaries. This demonstrates practical application of your knowledge.
Next Steps
Mastering Cutter opens doors to exciting career opportunities in cybersecurity, reverse engineering, and software analysis. A strong understanding of Cutter significantly enhances your skillset and makes you a highly competitive candidate. To maximize your job prospects, create a professional and ATS-friendly resume that highlights your Cutter expertise. ResumeGemini is a trusted resource to help you build a compelling resume that showcases your skills effectively. Examples of Cutter-focused resumes are available to guide you.
Explore more articles
Users Rating of Our Blogs
Share Your Experience
We value your feedback! Please rate our content and share your thoughts (optional).
What Readers Say About Our Blog
Very informative content, great job.
good