Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/shemesh999/oregami
Static AnalysisReverse EngineeringDebuggersBinary Analysis
GitHubshemesh999/oregami

oregami

IDA 플러그인 및 스크립트로, 레지스터 사용 프레임 분석을 위한 도구입니다.

저장소 보기
182225개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Oregami

"""
이 레지스터는 무엇에 사용되나요?
음.. 그냥 veryuniquename으로 이름을 바꾸고, 텍스트 검색으로 모든 참조를 찾아야겠다!
좋아.. 검색이 끝나길 기다리는 중.. 아직도.. 완료!
이제 검색 결과 중 어떤 것이 현재 레지스터의 사용 프레임과 관련 있는지 이해해야 해.
그렇게 어렵진 않겠지, 그렇죠?
"""

이런 일이 (어쩌면 여러 번) 발생했다면, 당신은 재미있는 것을 만나게 될 것입니다!
Shift-X만 누르면 문제가 사라집니다!

사용 프레임 내에서 레지스터의 이름을 다시 지을 수도 있습니다. Shift-N을 누르고 지시를 따르세요!
또한, 모든 사용의 유형을 특정 유형으로 변경하는 대신 Shift-T를 한 번 누르면 됩니다.

마지막으로, 이 레지스터의 모든 사용에 오프셋을 설정하려면 (Ctrl-R처럼) Shift-R을 누르세요.

참고: 가끔 Shift-T를 사용하는 다른 플러그인이 이미 있을 수 있습니다. 그 플러그인을 제거하세요 - 어차피 전에는 한 번도 사용하지 않았으니까요 :-).

설치

사전 요구사항

이 플러그인은 sark을 사용하여 IDA 스크립트와 편리하게 상호작용하며, cachetools를 사용하여 프레임 스캔을 캐싱하므로 훨씬 빨라집니다.

IDA 버전 호환성

Oregami는 IDA 7.x/8.x와 IDA 9.0+를 모두 지원합니다.
IDA 9를 사용하는 경우, IDA 9를 지원하는 최신 버전의 sark이 설치되어 있는지 확인하세요.

참고: IDA 9에는 자체 Shift-X 기능이 도입되었습니다. Oregami의 Shift-X 대신 IDA 내장 Shift-X를 사용해야 한다면, 플러그인 파일에서 oregami 단축키를 변경해야 합니다.

Python / sark 설정

[Python3의 경우]
pip3 install sark

[Python2의 경우]
IDA에서 python2 변종을 사용하는 경우, 대신 다음을 실행하세요: pip2 install -U git+https://github.com/tmr232/[email protected]#egg=Sark

참고: python2는 적극적으로 지원되지 않습니다 (IDA가 대부분 python3로 전환되었고, 저도 마찬가지이므로). 따라서 작동하지 않을 수 있습니다.

저장소 클론

git clone https://github.com/shemesh999/oregami

플러그인 설치

sark 코드베이스는 많은 플러그인을 제공합니다. 그 중 하나는 다음과 같습니다: https://github.com/tmr232/Sark/blob/master/plugins/plugin_loader.py

이 파일을 플러그인 디렉토리에 복사한 다음, 관리자 권한으로 IDA를 한 번 실행하는 것을 권장합니다 (plugins.list 파일을 생성할 수 있도록).
그런 다음, 생성된 plugins.list 파일 중 하나에 새 플러그인 경로를 추가하여 새 플러그인을 추가할 수 있습니다 (예: 하나는 IDA의 cfg 폴더에 생성됩니다).

이제 plugins.list 파일 중 하나에 다음을 추가하세요:
FULLPATH\oregami\oregami_plugin.py
FULLPATH\oregami\regname_plugin.py
FULLPATH\oregami\typeregter_plugin.py
FULLPATH\oregami\offreg_plugin.py

IDA를 다시 시작하면 플러그인이 작동합니다.

또는:
모든 파일 (내부 oregami 폴더 포함, setup.py 제외)을 IDA 플러그인 디렉토리에 복사하세요.

스크립트로 사용

플러그인으로 사용하는 것 외에도, oregami를 사용하여 자신만의 스크립트를 작성할 수 있습니다!

이를 위해 먼저 포함된 setup.py 파일을 사용하여 설치해야 합니다. 즉,
'python setup.py develop'을 호출하면, 그 후부터 내부 클래스와 함수를 사용할 수 있습니다.
'install' 대신 'develop'을 사용하는 것을 권장합니다. 그래야 oregami의 새 버전을 가져올 때 문제없이 작동합니다.

예:
-- script.py --

root@kitploit:~
def find_func_usage(func_ea, reg='r0'):
    """
    Find and print all usages of a register, including the information of the specific operands
    it is in, and what operation it does in the operand.
    """
    import oregami
    rf = oregami.RegFrame(func_ea, reg)
    for insn in rf.get_instructions():
        print('Addr:{:x}'.format(insn.ea))
        for opnd in insn.operands:
            if opnd.uf_is_external:
                continue
            print('--opnd_idx:{} - {}'.format(opnd.n, oregami.UsageBits(opnd.op_flags)))

사용 프레임 스캔

다음과 같은 일련의 opcode가 있다고 가정해 보겠습니다:

root@kitploit:~
ROM:01000010                    e_lis     r10, 0x4004 # 0x40040000              # Load Immediate Shifted
ROM:01000014                    e_add16i  r10, r10, 0x1337 # 0x40041337         # Add Immediate
ROM:01000020                    se_mr     r30, r31                              # Move Register
ROM:01000022                    cmplw     r11, r10                              # Compare Logical Word
ROM:01000026                    se_bge    loc_1000036                           # Branch if greater than or equal
ROM:01000028
ROM:01000028    loc_1000028:                                                    # CODE XREF: sub_0100000+144↓j
ROM:01000028                    e_stmw    r30, 0(r11)                           # Store Multiple Word
ROM:0100002C                    e_add16i  r11, r11, 8                           # Add Immediate
ROM:01000030                    cmplw     r11, r10                              # Compare Logical Word
ROM:01000034                    se_blt    loc_1000028                           # Branch if less than
ROM:01000036
ROM:01000036    loc_1000036:                                                    # CODE XREF: sub_0100000+136↑j
ROM:01000036                    e_add16i r10, r10, 8                            # Add Immediate
ROM:0100003A                    e_li      r11, 0                                # Load Immediate

주소 01000022에서 시작하여 r10 레지스터의 사용 프레임을 스캔하면, 사용 프레임에 포함된 세 가지 유형의 사용을 찾을 수 있습니다.

1. 초기화 (Init)

여기에는 레지스터 값을 초기화하는 명령어가 포함됩니다.
레지스터 값을 변경한 마지막 명령어만 포함할 수도 있고 (예제의 주소 01000014), 레지스터의 초기 값을 설정하는 데 사용된 일련의 연산 (예제의 주소 01000010 및 01000014)을 포함할 수도 있습니다.
레지스터 초기화에 사용된 연산 시퀀스를 "초기화 단계 (init stage)"라고 부를 수 있습니다.
RegFrame 초기화 시 init_stage_bool 매개변수에 따라 초기화 단계를 지원할지 여부를 선택할 수 있습니다.

2. 순수 사용 (Pure)

여기에는 레지스터 값을 사용하고 어떤 방식으로도 변경하지 않는 명령어가 포함됩니다. 이는 예제의 01000022 및 01000030 줄에 해당합니다.

3. 중단 (Break)

여기에는 레지스터 값을 사용하지만 그 값을 변경하는 명령어가 포함됩니다. 이러한 명령어는 두 개의 서로 다른 사용 프레임 (하나는 이 명령어로 이어지는 프레임, 다른 하나는 이 명령어에서 시작하는 프레임)에 포함된 것으로 볼 수 있습니다.
이는 예제의 01000036 줄에 해당합니다.

4. 외부 중단 (Out Break)

사용 프레임을 스캔할 때, 초기화 연산이나 중단 연산에 도달하면 특정 방향으로의 스캔이 중지됩니다.
하지만, 사용 프레임 외부의 명령어 때문에 스캔이 중지될 수도 있습니다.
예를 들어, 주소 01000030에서 시작하여 r11 레지스터의 사용 프레임을 스캔하면 0100003A 줄에서 중지됩니다.

클래스 및 함수

RegFrame

이것은 oregami에서 사용되는 기본 클래스입니다. 주소와 특정 레지스터에서 초기화하면 해당 레지스터의 사용 프레임을 스캔하고, 관련된 모든 명령어에 대해 UFInstruction을 생성합니다.
get_instruction - 주어진 주소에서 명령어를 가져옵니다.
get_instructions - 사용 프레임 내의 명령어를 반환하는 제너레이터입니다.

사용된 명령어의 특정 하위 집합을 요청할 수도 있습니다:
get_init_instructions - 초기화 유형의 명령어만 가져옵니다.
get_pure_instructions - 순수 사용 유형의 명령어만 가져옵니다.
get_break_instructions - 중단 유형의 명령어만 가져옵니다.
get_nobreak_instructions - 중단 유형이 아닌 명령어만 가져옵니다 (즉, init + pure).
get_noinit_instructions - 초기화 유형이 아닌 명령어만 가져옵니다 (즉, pure + break).
get_outbreak_instructions - 외부 중단 유형의 명령어만 가져옵니다.

기본적으로 이 클래스는 스캔 결과를 캐싱하여 동일한 사용 프레임을 다시 스캔하지 않도록 합니다.
즉, 사용 프레임의 일부였던 명령어 (특히 init + pure 유형. 중단은 해당 명령어에서 시작하는 사용 프레임을 반환해야 하므로 제외)에 대해 RegFrame을 요청하면 동일한 미리 계산된 RegFrame 인스턴스가 반환됩니다.
강제로 다시 스캔하려면 클래스 초기화 시 force 플래그를 사용하세요.

RFInstruction

이것은 사용 프레임 내의 명령어를 나타내는 RegFrame에 의해 반환되는 클래스입니다.

이 클래스는 sark의 Instruction 클래스를 상속하므로 동일한 메서드를 지원합니다.
주요 차이점 중 하나는 sark Operand 클래스의 operands 배열 대신 UFOperand 클래스의 배열을 포함한다는 것입니다.

이 클래스는 또한 명령어 유형 (init, pure, break, outbreak)과 연산 비트 (읽기, 쓰기, 명시적, 다양한 유형의 암시적)를 이해하는 메서드를 포함합니다.

RFOperand

이것은 특정 UFInstruction 내의 operands 배열에 있는 클래스입니다.

이 클래스는 sark의 Instruction 클래스를 상속하므로 동일한 메서드를 지원합니다.

sark 연산에 추가로, 연산 비트 (읽기, 쓰기, 명시적, 다양한 유형의 암시적)를 가져오고, 오퍼랜드가 실제로 사용 프레임의 일부인지 (break 유형 명령어에서 어떤 오퍼랜드가 사용 프레임의 일부인지 알 수 있음) 확인하는 메서드를 포함합니다.

RegInstruction

이것은 특정 명령어를 분석하여 레지스터 사용에 관한 정보를 얻는 데 사용되는 클래스입니다.
IDA의 지식, 텍스트 분석, 프로세서별 세부 정보를 사용하여 이를 수행합니다.
이 클래스가 필요한 이유는 기본 IDA 분석이 많은 opcode에서 사용되는 레지스터 집합과 사용 방식에 대해 거짓말을 하는 경향이 있기 때문입니다.

이 클래스는 sark의 Instruction 클래스를 상속하므로 동일한 메서드를 지원합니다.
주요 차이점 중 하나는 sark Operand 클래스의 operands 배열 대신 RegOperand 클래스의 배열을 포함한다는 것입니다.

RegOperand

이것은 특정 오퍼랜드를 분석하여 레지스터 사용에 관한 정보를 얻는 데 사용되는 클래스입니다.
IDA의 지식, 텍스트 분석, 프로세서별 세부 정보를 사용하여 이를 수행합니다.
이 클래스가 필요한 이유는 기본 IDA 분석이 많은 opcode에서 사용되는 레지스터 집합과 사용 방식에 대해 거짓말을 하는 경향이 있기 때문입니다.

이 클래스는 sark의 Operand 클래스를 상속하므로 동일한 메서드를 지원합니다.

도구 다운로드